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