2010-08-08 147 views
5

我有(我认为是)一个简单的BufferStrategy中一个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) 
+0

请添加完整的堆栈跟踪你的问题 - 它应该有助于了解其* *方法抛出ISE。我查看了jre资源(1.7),但找不到该例外的潜在来源。 – 2010-08-08 21:03:25

+0

这真的是完整的堆栈跟踪?我们正在寻找您从美国东部时间拨打的证据。继续并显示* full *堆栈跟踪。 – 2010-08-09 00:55:45

+0

@Kevin Day,'线程中的异常“main”'表明这不是来自EDT。 – finnw 2010-08-09 11:48:44

回答

1

Swing组件都是双默认情况下缓冲,所以没有必要用BufferStrategy中打转转。

但是,当你得到随机误差一样,它通常是由于代码不上EDT执行。请参阅Concurrency的Swing教程部分以获取更多信息。

+0

我倾向于更喜欢手动更新显卡,所以有机会获得一个实际BufferStrategy中的对象,使这个非常简单 - 画项目显卡的负载,则只需拨打strategy.show()一旦我完成了。如果这是一种可怕的做事方式,请纠正我! 我一定会读一点关于并发。 – 2010-08-08 21:45:43

+2

我认为我的建议显示了我使用BufferedStrategy的看法,我相信使用AWT时可能会有所帮助,但正如我所提到的,Swing是不同的。该tuturial还有一个关于“定制绘画”的部分,你应该看看 – camickr 2010-08-09 01:59:19

3

框架需要,当你调用createBufferStrategy为可显示。正如Camickr指出的,你需要从美国东部时间呼唤它。确保这一点

的方法之一是扩大JFrame和覆盖addNotify

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