我正在尝试将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>
答案 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);
}