2011-04-02 100 views
1

我在運行時更新2D數組中的JLabel時遇到問題。在JPanel上重繪/刷新JLabels

我正在開發的程序是Connect Four的變體。我創建了一個JLabels二維數組,它們都默認爲包含空白插槽圖像的ImageIcon。玩家1和2選擇他們的顏色,並且在玩家輪到時,他可以點擊將一塊物品放入一個柱子(重力導致該物品落到底部或直到它落在另一塊物品上)。

我很積極,我的addToColumn方法工作正常。我唯一的問題是,我似乎無法得到任何JLabel更新。以下是我正在處理的方法:

p1,p2和current是Player對象。 grid [] []是一個整數的二維數組,設置爲0,1或2以更容易跟蹤誰擁有哪些圖塊。 tiles [] []是我的JLabels二維數組。

public void addToColumn(int column) { // drop a tile in the specified column 
int i = 0; 
while (grid[column][5-i] != 0) i++; // move upward through the 6 rows of tiles 
            // until we find an empty one 
if (current == p1) grid[column][5-i] = 1; // update to the current player's value 
else grid[column][5-i] = 2; 

tiles[column][5-i] = new JLabel(findColorIcon(current.getColor())); 

tiles[column][5-i].setIcon(findColorIcon(current.getColor())); 

repaint(); 

現在隨着最後兩行改變了的JLabel磚[] [],顯然我並不需要兩個,不知道哪種方式比較好...這只是一些什麼我已經試過,無濟於事。 (我的getColor()方法返回一個Color,並且findColorIcon(Color c)返回具有該顏色的tile的相應JLabel)。

,是的,我在我的paintComponent方法已經添加過:

@Override 
protected void paintComponent(Graphics g) { 
super.paintComponent(g); 
} 

我一直停留在這一段時間,現在,我覺得我失去了一些東西明顯。有什麼建議麼?

+0

有關您的特定問題的更好指導,請使用[sscce](http://sscce.org/)更新您的問題。 – trashgod 2011-04-02 09:49:34

回答

3

我沒有看到你的paintComponent()方法執行任何操作。特別是,更換一個JLabel需要你的容器。作爲一種替代方案,您可能想看看這個簡單的game如何使用Model–View–Controller模式並繪製彩色圖標。

附錄:此相關example描述瞭如何替換隻是Icon,而不是整個JLabel。相比之下,這個example展示瞭如何在更換組件後的一個容器中使用validate()

+0

對不起,但我沒有看到該程序和我的相似之處。也許我不清楚;我可以畫出我的初始圖標(空瓷磚網格),但是當我嘗試在運行時更改它們時(例如,玩家1是紅色的,玩家1添加到第3列,所以第3列中的底部瓷磚現在變成紅色) 。 這只是我不能用JLabels做的事情嗎?我以爲我只需要paintComponent(),以便在改變JLabel的內容[tiles] [5-i]後,我可以調用repaint()。 (即我的最後兩行都試圖做什麼)。 – thomas 2011-04-02 09:40:24

+0

而不是_replacing_標籤,該示例顯示瞭如何更新現有標籤,也討論了[這裏](http://stackoverflow.com/questions/5494766)。該模式可能有助於您的設計。 – trashgod 2011-04-02 09:48:24

+0

你能否通過驗證容器來更詳細地解釋你的意思,以及我的程序中的哪個位置我會這樣做? – thomas 2011-04-02 09:48:57