2016-05-18 34 views
1

首先,我知道這樣的問題已經被問過,但沒有答案似乎解決了我的問題。組件必須有一個有效的對等體 - BufferStrategy

我正在開發一個小遊戲,並且由於某種原因,每當我嘗試創建新的bufferstrategy時,java都會返回IllegalStateException。我加入遊戲一個JFrame,但是例外還是拋出,這裏是添加到JFrame代碼:

JFrame frame; 


public Window(int x, int y, int width, int height, String title, boolean focus, Main game) throws IOException { 
     frame = new JFrame(); 
     frame.setLocation(x, y); 
     frame.setSize(new Dimension(width, height)); 
     frame.setTitle(title); 
     frame.add(game); 
     game.start(); 
     frame.setAutoRequestFocus(focus); 
     frame.setFocusable(true); 
     frame.setVisible(true); 
    } 

,這裏是用於創建窗口(位於主類)的代碼:

window = new Window(x, y, WIDTH, HEIGHT, "Title", true, this); 
+1

在'frame.setVisible(true)之後放置'game.start();'改變什麼? – Berger

+0

@Berger是的,謝謝! – ItzBenteThePig

回答

0

我假定createBufferStrategy()調用從幀game.start()。

IllegalStateException可能發生,因爲JFrame在計算機中(或類似的東西)並不存在,直到從JVM外部分配資源爲止。

當我自己試圖createBufferStrategy()時,錯誤表示「組件必須有一個有效的對等體」。顯然,Peers是圖形組件的示例版本,OS或圖形管理器將其用作繪製自定義組件的原型。我猜,直到你的JFrame在操作系統中被分配了它的對等體,它沒有製作一個BufferStrategy所需的所有信息 - JFrame的大小可能被內部列爲0到0,也許,並且它不會按照高度更新爲寬度,直到您告訴JVM使Frame可顯示或「有效」。您需要在調用game.start()之前執行此操作。

frame.setVisible(true)將顯示該幀,並且顯然根據需要分配對等點。之後你可以調用game.start()。

如果您想在不可見的JFrame上調用createBufferStrategy(),請嘗試frame.pack(),它可以驗證幀中的每個組件,而不顯示它。注意:它也會壓縮框架以適應其組件 - 如果您尚未添加任何內容或尚未調用setMinimumSize(),則JFrame將縮小。

相關問題