我创建了一个 JButton,如果单击它,就会显示一张卡片。每次我点击这个按钮,下一张同花色的牌就会出现,这个过程应该继续下去,直到所有 13 张同花色的牌都显示出来。我在 JLabel 中的 ImageIcon 上以图片形式显示卡片。问题是,如果我想在同一位置显示所有卡片,第一张卡片不会从其位置移走,而是将其余 12 张卡片隐藏在其下方。这意味着每张应该显示的新卡都位于其先前卡的下方。我尝试使用frame.remove(mylabel);从JLabel中删除先例卡方法。但这没有帮助。此外,如果我更改 setBound() 方法中的坐标,则会显示卡片。但我想在显示第一张卡的同一位置显示该卡。我已经使用计数器切换到下一张卡。每次显示一张卡片时,它都会使计数器变量递增,最终切换到下一张卡片。 请指导我如何删除前一张卡片以显示下一张卡片。我已经在 ActionListener 方法中使用了所有卡片显示逻辑。 JFrame 和 JButton 均在此 ActinListener 方法之外声明。我的代码如下:
my_btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ImageIcon pic = new ImageIcon();
JLabel lbl = new JLabel();
if(counter == 0) {
pic = new ImageIcon(c1);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 1) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c2);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 2) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c3);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 3) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c4);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 4) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c5);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 5) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c6);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 6) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c7);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 7) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c8);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 8) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c9);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 9) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(c10);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 10) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(cj);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 11) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(cq);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else if(counter == 12) {
frame.remove(lbl);
lbl.setVisible(false);
pic = new ImageIcon(ck);
lbl = new JLabel(pic);
frame.add(lbl);
lbl.setBounds(200, 100, 100, 100);
lbl.setVisible(true);
counter++;
}
else {
frame.remove(lbl);
lbl.setVisible(false);
JOptionPane.showMessageDialog(frame, "Card deck ends.");
}
}
});
最佳答案
当您从可见 GUI 添加或删除组件时,基本逻辑是:
panel.remove(...);
panel.revalidate();
panel.repaint();
但是,我不知道如何在同一位置显示多张卡片,因为默认布局管理器是二维的,因此除非使用Overlaylayout
,否则无法堆叠组件。
其他选项:
- 使用
CardLayout
然后您可以控制当前可见的卡片。 - 使用单个
JLabel
。然后当你想更换卡片时,只需更改标签的Icon
即可。这可能是最简单的解决方案,因为您当前的代码正在创建带有图标的标签。因此,不要创建标签,只需更改图标即可。
您不应该使用setBounds()
。布局管理器将确定每个组件的位置。
您还可以尝试使用 Overlap Layout它与 OverLayLayout 类似,但专为这样的布局而设计。
关于java - 从 JFrame 中的 JLabel 中删除图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573777/