繁体   English   中英

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

[英]“Buffers have not been created” … whilst creating buffers

我(我认为是)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)

调用createBufferStrategy时,框架需要可显示。 正如camickr指出的那样,你需要从EDT调用它。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM