组件必须具有有效的对等 - BufferStrategy

时间:2016-05-18 15:43:17

标签: java swing bufferstrategy

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

我正在开发一个小游戏,由于某种原因,每当我尝试创建一个新的bufferstrategy时,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);
    }

以下是创建窗口的代码(位于Main类中):

window = new Window(x, y, WIDTH, HEIGHT, "Title", true, this);

1 个答案:

答案 0 :(得分:0)

我假设在game.start()的框架上调用了createBufferStrategy()。

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

当我自己尝试createBufferStrategy()时,错误说“组件必须有一个有效的对等体”。显然,对等方是图形组件的示例版本,操作系统或图形管理器将其用作绘制自定义组件的原型。

我想,在你的JFrame被分配给操作系统中的对等体之前,它没有制作BufferStrategy所需的所有信息 - JFrame的大小可能在内部列为0乘0,也许,并且在您告诉JVM使Frame可显示或“有效”之前,它不会更新为逐个宽度。你需要在调用game.start()之前执行此操作。

frame.setVisible(true)将显示该帧,并且显然会根据需要分配对等体。之后您可以调用game.start()。

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