java - 从 JFrame 中的 JLabel 中删除图像

标签 java swing

我创建了一个 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,否则无法堆叠组件。

其他选项:

  1. 使用 CardLayout 然后您可以控制当前可见的卡片。
  2. 使用单个JLabel。然后当你想更换卡片时,只需更改标签的Icon即可。这可能是最简单的解决方案,因为您当前的代码正在创建带有图标的标签。因此,不要创建标签,只需更改图标即可。

您不应该使用setBounds()。布局管理器将确定每个组件的位置。

您还可以尝试使用 Overlap Layout它与 OverLayLayout 类似,但专为这样的布局而设计。

关于java - 从 JFrame 中的 JLabel 中删除图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573777/

相关文章:

java - 在每第四个和第三个位置之后,在java中分割字符串的最佳方法是什么?

java - 如何使用 Selenium WebDriver 处理 Windows 文件上传?

java - 组合优于继承和紧耦合

java - clientCache 区域 gemfire 上的 afterUpdate 事件

java - 为什么 String、Integer 和其他包装类被认为是 HashMap 中的好键?

java - 使程序 "pause"直到用户在 JTextField 中输入内容

java - 在指定时间内执行部分代码

java - 在存储文件中发生更新后,如何在java中自动刷新gui屏幕?

java - 边框和流程布局

events - 扩展面板中的 Scala Swing react