Как расширить этот класс и использовать его в моем Java-апплете? Я получаю NullPointerException

Я нашел следующий код здесь: Как использовать двойную буферизацию внутри потока и апплета

Он говорит: "Расширьте AppletGameCore и определите свой собственный подкласс, который реализует необходимые методы". Может кто-нибудь показать мне, как вы можете сделать это, чтобы я мог использовать двойную буферизацию в моем апплете?

import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.image.BufferStrategy;
import java.applet.Applet;

/**
*AppletGameCore.java
*@author David Graham
*/

public abstract class AppletGameCore extends Applet implements Runnable
{
     private BufferStrategy bufferStrategy;
     private Canvas drawArea;/*Drawing Canvas*/
     private boolean stopped = false;/*True if the applet has been destroyed*/
     private int x = 0;

     public void init()
     {
           Thread t = new Thread(this);
           drawArea = new Canvas();
           setIgnoreRepaint(true);
           t.start();
     }

     public void destroy()
     {
           stopped = true;

           /*Allow Applet to destroy any resources used by this applet*/
           super.destroy();
     }

     public void update()
     {
           if(!bufferStrategy.contentsLost())
           {
                 //Show bufferStrategy
                 bufferStrategy.show();
           }
     }

     //Return drawArea's BufferStrategy
     public BufferStrategy getBufferStrategy()
     {
           return bufferStrategy;
     }

     //Create drawArea's BufferStrategies
     public void createBufferStrategy(int numBuffers)
     {
           drawArea.createBufferStrategy(numBuffers);
     }

     //Subclasses should override this method to do any drawing
     public abstract void draw(Graphics2D g);

     public void update(Graphics2D g)
     {
           g.setColor(g.getBackground());
           g.fillRect(0,0,getWidth(),getHeight());
     }

     //Update any sprites, images, or primitives
     public abstract void update(long time);

     public Graphics2D getGraphics()
     {
           return (Graphics2D)bufferStrategy.getDrawGraphics();
     }

     //Do not override this method      
     public void run()
     {
           drawArea.setSize(new Dimension(getWidth(),getHeight()));
           add(drawArea);
           createBufferStrategy(2);
           bufferStrategy = drawArea.getBufferStrategy();

           long startTime = System.currentTimeMillis();
           long currTime = startTime;

           //animation loop
           while(!stopped)
           {
                 //Get time past
                 long elapsedTime = System.currentTimeMillis()-currTime;
                 currTime += elapsedTime;

                 //Flip or show the back buffer
                 update();

                 //Update any sprites or other graphical objects
                 update(elapsedTime);

                 //Handle Drawing
                 Graphics2D g = getGraphics();
                 update(g);
                 draw(g);

                 //Dispose of graphics context
                 g.dispose();
           }

     }
}

Ниже моя попытка. Я получаю сообщение об ошибке: java.lang.NullPointerException в AppletGameCore.run(AppletGameCore.java:76) в ExtendTest.init(ExtendTest.java:10) в sun.applet.AppletPanel.run(неизвестный источник) в java.lang.Thread.run(Неизвестный источник)

import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.image.BufferStrategy;
import java.applet.Applet;

public class ExtendTest extends AppletGameCore {
    public void init() {
      setSize(420, 420);
      run();
    }

    public void draw(Graphics2D g) {}

    public void update(long l) {}    
}

2 ответа

Решение

Ваша ничья ничья Вам придется позвонить super.init() первый:

public class ExtendTest extends AppletGameCore {
    public void init() {
      super.init();
      setSize(420, 420);
      run();
    }

    public void draw(Graphics2D g) {}

    public void update(long l) {}    
}

Затем его создали в AppletGameCore с drawArea = new Canvas();

Похоже, вам нужно вызвать метод super init() для инициализации переменной drawArea, используемой в методе run, следующим образом:

public class ExtendTest extends AppletGameCore {
    public void init() {
      super.init();
      setSize(420, 420);
      run();
    }

    public void draw(Graphics2D g) {}

    public void update(long l) {}    
}
Другие вопросы по тегам