2010-08-08 111 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(); 
    } 
}