创建新的Bufferstrategy时出现非法状态exception

当我试图找出如何使用buffers策略时,总体上只是改进了我编写代码和清理的方法。 当我运行以下代码时,我在“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.(Unknown Source) at java.awt.Component$FlipSubRegionBufferStrategy.(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 ,如果组件不可显示,则抛出此exception。 在这种情况下,当Canvas.peernull 。 看一下peer领域就可以看出这一点

Component添加到也是对等的容器时,将设置对等体

由于您是从组件的构造函数启动更新线程,因此可以在将组件添加到另一个容器之前调用render ,这意味着对peernull ,然后将IllegalStateException

根据我对此错误的体验以及您编写的代码,您错过了一个框架function。

添加帧的位置(例如: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); )并添加函数frame.add(game);

在这个例子中,我的是Display game = new Display(); 但是根据新显示器的变量,它可能会有所不同。