2012-03-27 54 views
2

我試圖在JPanel上繪製5張卡片,但在顯示卡片圖像時遇到了問題。無法繪製多個JLabels

JLabel[] cards = { 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK) 
    }; 

    for(int i=0; i<cards.length; i++) { 
     cards[i].setBounds(60*i, 0, 150, 215); 
    } 

    for(JLabel z : cards) 
     auxHands.add(z); 

    auxHands.setLayout(null); 

以上工作正常,並繪製5倍的圖像,但是當我試圖凝聚這樣的代碼:

JLabel[] cards = new JLabel[5]; 

    Arrays.fill(cards, new JLabel(CARD_BACK)); 

    for(int i=0; i<cards.length; i++) { 
     cards[i].setBounds(60*i, 0, 150, 215); 
    } 

    for(JLabel z : cards) 
     auxHands.add(z); 
    auxHands.setLayout(null); 

似乎只繪製卡片的最後一個實例。最後,我將要繪製多個手,並且像第一個代碼示例中那樣繼續實例化新的JLabel []似乎很乏味。

下面是我的意思的視覺效果:http://oipsl.freesuperhost.com/images/meh.png,上半部分顯示了執行代碼的第一個代碼段時的樣子,下半部分代表了第二個代碼段的樣子。

回答

4

此代碼:

Arrays.fill(cards, new JLabel(CARD_BACK)); 

只創建一個單一JLabel。然後,它使用該單個標籤的引用來獲取數組中的全部元素...因此您獲得的效果。它相當於:

// Equivalent bad code 
JLabel label = new JLabel(CARD_BACK); 
JLabel[] cards = { label, label, label, label, label }; 

希望你可以看到爲什麼不起作用。

您應該使用一個循環,它可以用新標籤填充數組並同時設置邊界。您可以在同一時間也將它添加到auxHands

JLabel[] cards = new JLabel[5]; 
for (int i = 0; i < cards.length; i++) { 
    JLabel label = new JLabel(CARD_BACK); 
    label.setBounds(60*i, 0, 150, 215); 
    auxHands.add(label); 
    cards[i] = label; 
} 

需要注意的是,除非你需要在其他地方的數組,你可以用它做完全消失:

for (int i = 0; i < 5; i++) { 
    JLabel label = new JLabel(CARD_BACK); 
    label.setBounds(60*i, 0, 150, 215); 
    auxHands.add(label); 
} 
+0

謝謝大家的清晰,簡明的解釋! – oipsl 2012-03-27 05:53:25