Java 创建新缓冲区策略时出现非法状态异常

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;

当我试图弄清楚如何使用缓冲策略时,总的来说,我只是在改进如何编写代码和清理东西。当我运行以下代码时,当我“createBufferStrategy(3)”时,我得到一个错误

然后,在基础上添加以下内容:

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)