无法绘制多个JLabel

时间:2012-03-27 05:21:01

标签: java swing

我正在尝试将5张卡片放到JPanel上,但是在显示卡片图片方面遇到了麻烦。

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,上半部分显示了我执行第一段代码时的样子,而下半部分是第二段代码的样子。 / p>

1 个答案:

答案 0 :(得分: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);
}