Java 组件必须具有有效的对等缓冲策略

Java 组件必须具有有效的对等缓冲策略,java,swing,bufferstrategy,Java,Swing,Bufferstrategy,首先,我知道以前有人问过这样的问题,但似乎没有答案能解决我的问题 我正在开发一个小游戏,出于某种原因,每当我尝试创建一个新的缓冲策略时,java都会返回一个IllegalStateException。我正在将游戏添加到JFrame,但仍会引发异常,以下是添加到JFrame的代码: JFrame frame; public Window(int x, int y, int width, int height, String title, boolean focus, Main game) th

首先,我知道以前有人问过这样的问题,但似乎没有答案能解决我的问题

我正在开发一个小游戏,出于某种原因,每当我尝试创建一个新的缓冲策略时,java都会返回一个IllegalStateException。我正在将游戏添加到JFrame,但仍会引发异常,以下是添加到JFrame的代码:

JFrame frame;


public Window(int x, int y, int width, int height, String title, boolean focus, Main game) throws IOException {
        frame = new JFrame();
        frame.setLocation(x, y);
        frame.setSize(new Dimension(width, height));
        frame.setTitle(title);
        frame.add(game);
        game.start();
        frame.setAutoRequestFocus(focus);
        frame.setFocusable(true);
        frame.setVisible(true);
    }
下面是创建窗口(位于主类中)的代码:


我假设createBufferStrategy()是在game.start()的帧上调用的

发生IllegalStateException可能是因为在从JVM外部为JFrame分配资源之前,JFrame实际上不存在于计算机中(或类似的东西)

当我自己尝试创建BufferStrategy()时,错误是“组件必须有一个有效的对等方”。显然,对等点是图形组件的示例版本,OS或graphics manager将其用作绘制自定义组件的原型

我猜,在操作系统中为JFrame分配了对等对象之前,它并没有制定缓冲策略所需的所有信息——JFrame的大小可能会在内部以0×0的形式列出,并且在告诉JVM使框架可显示或“有效”之前,它不会按高度更新为宽度。您需要在调用game.start()之前执行此操作

setVisible(true)将显示帧,并根据需要分配对等点。之后可以调用game.start()


如果要在不可见的JFrame上调用createBufferStrategy(),请尝试frame.pack(),它将验证框架中的每个组件,而不显示它。注意:它也会压缩框架以适应其组件——如果您还没有添加任何内容,或者还没有调用setMinimumSize(),JFrame将收缩。

会压缩
game.start()
frame.setVisible之后(true)有什么变化吗?@Berger是的,有,谢谢!真的很有帮助,tq
window = new Window(x, y, WIDTH, HEIGHT, "Title", true, this);