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

我(我认为是)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.(Component.java:3730) at java.awt.Component$FlipSubRegionBufferStrategy.(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教程中的并发部分。