[英]Illegal State Exception when creating new Bufferstrategy
當我試圖弄清楚如何使用緩沖區策略時,整體上只是改進了我編寫代碼和清理內容的方式。 當我運行以下代碼時,我在“createBufferStrategy(3)”時出錯
package Game1Test;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.io.IOException;
import javax.swing.*;
public class Base extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;
private boolean running = false;
int ticks = 0;
public Base(JFrame f) {
setSize(f.getWidth(),f.getHeight());
start();
}
public void start(){
running = true;
new Thread(this).start();
}
public void stop(){
}
public void run(){
while(running){
ticks++;
System.out.println(ticks);
render();
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void render(){
BufferStrategy bs = getBufferStrategy();
Graphics g;
if(bs == null){
createBufferStrategy(3);
requestFocus();
return;
}
bs.show();
}
}
然后添加基地:
package Game1Test;
import java.awt.*;
import javax.swing.JFrame;
public class Screen extends JFrame{
public final int GAME_WIDTH = 400;
public final int GAME_HEIGHT = 400;
public Dimension gameDim = new Dimension(GAME_WIDTH,GAME_HEIGHT);
final String gameName = "Test";
public Screen(){
setSize(gameDim);
setTitle(gameName);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLayout(new GridLayout());
setVisible(true);
setLocationRelativeTo(null);
}
public static void main(String[] args){
Screen s = new Screen();
s.add(new Base(s));
}
}
我收到以下錯誤:
Exception in thread "Thread-2" 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 Game1Test.Base.render(Base.java:46)
at Game1Test.Base.run(Base.java:33)
at java.lang.Thread.run(Unknown Source)
有人可以告訴我為什么會這樣嗎? 也許是這個問題的解決方案?
謝謝
看一下API ,如果組件不可顯示,則拋出此異常。 在這種情況下,當Canvas.peer
為null
。 看一下peer
領域就可以看出這一點
將
Component
添加到也是對等的容器時,將設置對等體
由於您是從組件的構造函數啟動更新線程,因此可以在將組件添加到另一個容器之前調用render
,這意味着對peer
為null
,然后IllegalStateException
。
根據我對此錯誤的體驗以及您編寫的代碼,您錯過了一個框架功能。
添加幀的位置(例如: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
)並添加函數frame.add(game);
在這個例子中,我的是Display game = new Display();
但是根據新顯示器的變量,它可能會有所不同。
我有完全相同的異常,但我發現這是因為我的JFrame可見性被意外設置為false。
所以放入setVisible(true); 固定它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.