Как расширить этот класс и использовать его в моем 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) {}
}