java - 绘制多个 JLabel 时出现问题

标签 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++) {
        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 ,上半部分显示了执行第一个代码片段时的样子,而下半部分显示了执行第二个代码片段时的样子。

最佳答案

这段代码:

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

关于java - 绘制多个 JLabel 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9883751/

相关文章:

java - 从字符串中删除某些信息时出现数组越界异常

java - 从数据库中删除时,ResultSet 关闭后不允许进行操作

java - Character.isLetter 是否需要标准化文本?

java - 从 spring Rest 文档生成 ascii doc api 文档

java - 刷新 jtable 中一行的背景颜色

java - 在hadoop中处理非结构化和多行CSV

java - 为什么 Java JTextArea 没有收到整个粘贴的文本?

Java Swing - JLabel 中出现空格

java - 在 java swing 中播放 avi 视频文件

Java - JLabel和垂直框之间的距离