我尝试在 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/