“还没有创建缓冲区”......同时创建缓冲区

时间:2010-08-08 20:42:05

标签: java swing buffer awt

我(我认为是)JFrame的直接BufferStrategy。它是这样创建的:

    // Buffer
    container.createBufferStrategy(2);           
    strategy = container.getBufferStrategy();

然而,偶尔我会收到以下错误(指向前一个片段的第一行作为违规项目):

java.lang.IllegalStateException:尚未创建缓冲区

这个错误很奇怪,因为它来来往往 - 有时它被触发,有时不会被触发。我怀疑这意味着它是一个线程问题。有没有人对这里可能发生的事情有任何指示?我有点不知所措,因为我已经在尝试做Java希望我做的事情了!

编辑:完整跟踪:

Exception in thread "main" java.lang.IllegalStateException: Buffers have not been created
        at sun.awt.windows.WComponentPeer.getBackBuffer(WComponentPeer.java:877)
        at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:3815)
        at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:3800)
        at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3791)
        at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3730)
        at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4253)
        at java.awt.Component.createBufferStrategy(Component.java:3612)
        at java.awt.Window.createBufferStrategy(Window.java:3015)
        at java.awt.Component.createBufferStrategy(Component.java:3536)
        at java.awt.Window.createBufferStrategy(Window.java:2990)

2 个答案:

答案 0 :(得分:3)

调用createBufferStrategy时,框架需要显示。同样,当camickr指出你需要从EDT调用它。

确保这一点的一种方法是扩展JFrame并覆盖addNotify

class MyFrame extends JFrame {
    public void addNotify() {
        super.addNotify();
        // Buffer
        createBufferStrategy(2);           
        strategy = getBufferStrategy();
    }
}

答案 1 :(得分:1)

Swing组件默认是双缓冲的,所以不需要使用BufferStrategy。

然而,当你得到类似的随机错误时,通常是因为代码没有在EDT上执行。有关详细信息,请阅读Concurrency上的Swing教程中的部分。