[英]Why isn't my canvas working?
我正在創建游戲畫布,但由於某種原因我無法使其正常工作。 我收到一個InvalidStateException,但不知道是什么原因引起的。 誰能闡明一些想法?
我的主要切入點
public class GameTemplate {
public static void main(String[] args) {
new GameFrame();
}
}
我的JFrame子類...
import java.awt.Dimension;
import javax.swing.JFrame;
public class GameFrame extends JFrame {
public static final short WIDTH = 1024;
public static final short HEIGHT = WIDTH / 16 * 9;
public static final Dimension size = new Dimension(WIDTH, HEIGHT);
public GameFrame() {
super("Game Frame");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(size);
this.setLocationRelativeTo(null);
this.setResizable(false);
GameCanvas canvas = new GameCanvas(size);
this.add(canvas);
canvas.start();
this.setVisible(true);
}
}
我的Canvas子類...
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferStrategy;
public class GameCanvas extends Canvas implements Runnable {
private boolean isRunning = false;
private Thread thread = null;
private BufferStrategy bs = null;
private Graphics g;
private Graphics2D g2d;
public GameCanvas(Dimension size) {
this.setSize(size);
this.setVisible(true);
}
public synchronized void start() {
isRunning = true;
thread = new Thread(this);
thread.start();
}
public synchronized void stop() {
isRunning = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (isRunning) {
update();
draw();
render();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void update() {
}
private void render() {
bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
bs.show();
}
private void draw() {
if (bs != null) {
g = bs.getDrawGraphics();
g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
g.drawRect(0, 0, WIDTH, HEIGHT);
}
}
}
錯誤...
Exception in thread "Thread-1" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at GameCanvas.render(GameCanvas.java:63)
at GameCanvas.run(GameCanvas.java:47)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalStateException: Component must have a valid peer
這可能是由於您在調用createBufferStrategy()
必須隱藏組件createBufferStrategy()
。
更新:
正如@Andrew所建議的那樣,您要混合輕量級和重量的組件。依靠默認的BufferStrategy。我們可以看到,直到將Canvas
添加到Frame
之前, Canvas
才是不可顯示的。
在幀初始值設定項中,您的情況是:
public GameCanvas(Dimension size) {...}
您需要調用方法“ frame.addNotify()”,例如:
public GameCanvas(Dimension size) {
this.setSize(size);
this.setVisible(true);
this.addNotify();
}
然后在您的代碼后面,您想要包含代碼:
@Override
public void addNotify() {
super.addNotify();
}
這只是通知框架您要此類使用緩沖區。 當框架不知道要用於請求的任務的組件的緩沖區時,您正在嘗試使框架使用緩沖區來創建圖形類型的緩沖區策略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.