2011-12-26 60 views
2

我正在創建一個遊戲,其中每個玩家填充3x3網格,並且它們都具有不同的網格狀態(玩家對象具有實例變量,因爲網格和網格由多個JPanel s)。動態替換特定的GUI元素

我有一個JList球員在左邊和右邊的網格顯示。當我點擊列表中的玩家名字時,是否有辦法動態更改網格?我試着做一個for循環來每次選擇玩家時更新網格,但如果玩家在被選中後更新網格,那麼更新網格就變得很棘手,也就是說你必須讓列表得到焦點等,所以我正在尋找一個乾淨的方式)

編輯:另外,我想改變對象的引用動態和更新用戶界面,但我有一些行動事件強制我使變量最終。所以我也無法這樣做。

回答

3

當選擇更改時,不應更改網格。您應該更改網格顯示的數據(即網格的數據模型)。例如,假設網格是包含9個標籤的面板,每個顯示一個String[][]的一個元素。您的Grid對象應該有一個setModel(String[][] data),它會更改網格中每個標籤的值。

每當玩家選擇發生變化時,您應該詢問所選玩家的數據,並在網格上致電setData()。如果玩家的數據在被選中時可以改變,你應該每次改變時都調用setData()。這可以通過在數據改變時由Player觸發PropertyChangeEvent來完成,並且如果觸發事件的玩家是所選擇的玩家,則該偵聽器用新數據更新網格。

+0

我認爲這可能需要for循環,對不對?在這種情況下,不會比其他方法如「顯示」不同球員的網格效率更低? – Cemre 2011-12-26 11:02:38

+2

在出現性能問題之前,不關心性能。你知道你可以在一毫秒內做多少次迭代?您知道每次在GUI中更改組件時會執行多少操作?我很確定我的解決方案更加高效,因爲它不需要顯示其他組件。但這並不重要。重要的是要足夠快。 – 2011-12-26 11:13:53

1

所以基本上你有一個玩家列表,其中選擇的玩家決定顯示哪個網格。如果在包含網格的面板中使用CardLayout,則可以要求它在選擇更新時顯示與某個玩家相對應的網格。

不需要特殊的for -loops,但只需調用CardLayout#show方法即可。

整整tutorial提供的信息與CardLayouts

3

工作,就可以將9個面板與CardLayout和交換適當的卡。或者,您可以刪除舊的組件並添加一個新組件,而是在添加後調用revalidate()repaint()

1

爲了實現Concurrency in Swing,您必須爲事件派發線程安排一個作業,以便無需任何插入操作即可顯示UI發生的任何更改。

事情是這樣的:

public static void main(String... args) 
{ 
    // Used to schedule a job for event-dispatcher thread 
    SwingUtilites.invokeLater(new RUnnable() 
    { 
    public void run() 
    { 
     // put your code for creating and displaying the GUI here. 
     // or call the method which is creating and displaying the GUI here. 
    } 
    } 
); 
} 

所以,當你進行更改,只需使用重新驗證()和重繪()方法。這將做,你想要達到什麼。 希望這會有所幫助。

Regards