Java 创建新缓冲区策略时出现非法状态异常
当我试图弄清楚如何使用缓冲策略时,总的来说,我只是在改进如何编写代码和清理东西。当我运行以下代码时,当我“createBufferStrategy(3)”时,我得到一个错误 然后,在基础上添加以下内容:Java 创建新缓冲区策略时出现非法状态异常,java,buffer,illegalstateexception,Java,Buffer,Illegalstateexception,当我试图弄清楚如何使用缓冲策略时,总的来说,我只是在改进如何编写代码和清理东西。当我运行以下代码时,当我“createBufferStrategy(3)”时,我得到一个错误 然后,在基础上添加以下内容: package Game1Test; import java.awt.*; import javax.swing.JFrame; public class Screen extends JFrame{ public final int GAME_WIDTH = 400;
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)
线程“thread-2”java.lang.IllegalStateException中的异常:组件必须具有有效的对等方
位于java.awt.Component$FlipBufferStrategy.createBuffers(未知源)
位于java.awt.Component$FlipBufferStrategy。(未知来源)
位于java.awt.Component$FlipSubcionBufferStrategy。(未知源)
位于java.awt.Component.createBufferStrategy(未知源)
位于java.awt.Canvas.createBufferStrategy(未知源)
位于java.awt.Component.createBufferStrategy(未知源)
位于java.awt.Canvas.createBufferStrategy(未知源)
在Game1Test.Base.render(Base.java:46)
在Game1Test.Base.run(Base.java:33)
位于java.lang.Thread.run(未知源)
有人能告诉我为什么会这样吗?也许是这个问题的解决方案
感谢查看,如果组件不可显示,将引发此异常。在这种情况下,Canvas.peer
为null
。查看peer
字段可以发现
当组件
添加到
同时也是对等的容器
由于您是从组件的构造函数启动更新线程,因此在将组件添加到另一个容器之前,可以调用
render
,这意味着peer
为null
,然后会抛出一个IllegalStateException
。根据我的经验,在这个错误和您编写的代码中,您缺少一个帧函数
添加帧所在位置(例如:frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
)并添加函数frame.Add(游戏)代码>
在这个例子中,我的是Display game=newdisplay()代码>但根据新显示的变量,它可能会有所不同 我有完全相同的异常,但我发现这是因为我的JFrame可见性被意外设置为false
因此,输入setVisible(true);已修复。根据API,如果组件不可显示,则会引发此异常。@hoverCraftFullOfels这到底是什么意思?如果我很愚蠢,请原谅,但组件是在什么时候添加的,这正是我所困惑的,当我调用render方法时?您应该只在将Base
添加到容器后调用render
方法。在您向我们展示的代码中,Base
从未添加到容器中。我只是添加了基本代码,如果将其全部放在一个类中会更好吗?@grimrader22问题是,在创建Base
和将其添加到屏幕
之间,启动的更新线程可能已经调用了render
。在调用start
之前,您需要分别从Base
的构造函数中调用start
,或者将Base
添加到Base
的构造函数中的JFrame
?
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)