2012-03-27 56 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