Java 绘制多个jlabel时出现问题

Java 绘制多个jlabel时出现问题,java,swing,Java,Swing,我试图在JPanel上绘制5张卡,但在显示卡图像时遇到问题 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++

我试图在JPanel上绘制5张卡,但在显示卡图像时遇到问题

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[]似乎很乏味

这是我的意思的一个可视化视图:,上半部分显示了我执行第一段代码时的样子,下半部分显示了第二段代码时的样子。

此代码:

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);
}
此代码:

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);
}