Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;尚未创建缓冲区“。。。在创建缓冲区时_Java_Swing_Buffer_Awt - Fatal编程技术网

Java &引用;尚未创建缓冲区“。。。在创建缓冲区时

Java &引用;尚未创建缓冲区“。。。在创建缓冲区时,java,swing,buffer,awt,Java,Swing,Buffer,Awt,对于JFrame,我有(我认为是)一个简单的缓冲策略。它是这样创建的: // Buffer container.createBufferStrategy(2); strategy = container.getBufferStrategy(); 但是,我偶尔会收到以下错误(指出前面代码段的第一行是有问题的项): java.lang.IllegalStateException:尚未创建缓冲区 这种错误来来往往都很奇怪——有时是触发的,有时不是。我怀疑

对于JFrame,我有(我认为是)一个简单的缓冲策略。它是这样创建的:

    // 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)
线程“main”java.lang.IllegalStateException中的异常:尚未创建缓冲区 位于sun.awt.windows.WComponentPeer.getbackuffer(WComponentPeer.java:877) 位于java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:3815) 位于java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:3800) 位于java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3791) 位于java.awt.Component$FlipBufferStrategy(Component.java:3730) 位于java.awt.Component$FlipSubcionBufferStrategy(Component.java:4253) 位于java.awt.Component.createBufferStrategy(Component.java:3612) 在java.awt.Window.createBufferStrategy(Window.java:3015) 位于java.awt.Component.createBufferStrategy(Component.java:3536) 位于java.awt.Window.createBufferStrategy(Window.java:2990)
Swing组件默认为双缓冲,因此无需使用缓冲策略


但是,当您遇到这样的随机错误时,通常是因为代码没有在EDT上执行。有关更多信息,请阅读Swing教程中的部分。

调用
createBufferStrategy
时,需要显示帧。正如camickr所指出的,您需要在EDT中调用它

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

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

请为您的问题添加一个完整的堆栈跟踪-它应该有助于了解哪个方法抛出ISE。我查看了jre源代码(1.7),但没有找到该异常的潜在源代码。这真的是完整的堆栈跟踪吗?我们正在寻找你从EDT打来的证据。继续并显示完整的堆栈跟踪。@Kevin Day,线程“main”中的异常表明这不是来自EDT的。@finw-同意,这就是我想查看完整堆栈跟踪的原因,这样我们就可以告诉他调用它的来源。我真正的希望是,所有这些对堆栈跟踪的请求都会给OP一些关于如何解决这类问题的想法。很抱歉,我在帖子中添加的不是完整的堆栈跟踪吗?这就是我在IDE控制台窗口中看到的内容。我需要专门编写一个调用来转储堆栈跟踪吗?我倾向于手动更新图形,因此访问实际的BufferStrategy对象使这变得非常简单-在图形中绘制一个项目负载,然后在完成后调用strategy.show()。如果这是一种可怕的做事方式,请纠正我!我想我的建议表明了我对使用BufferedStrategy的看法,我相信这在使用AWT时可能会有帮助,但正如我提到的,Swing是不同的。图图里亚尔还有一个关于“定制绘画”的章节,你应该看看