【问题标题】:Removing an Image from JLabel in JFrame从 JFrame 中的 JLabel 中删除图像
【发布时间】:2016-04-07 00:57:51
【问题描述】:

我创建了一个 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.");
                }
            }
        });

【问题讨论】:

    标签: java swing


    【解决方案1】:

    当您在可见的 GUI 中添加或删除组件时,基本逻辑是:

    panel.remove(...);
    panel.revalidate();
    panel.repaint();
    

    但是,我不知道您是如何在同一位置显示多张卡片的,因为默认布局管理器是二维的,因此您无法堆叠组件,除非您使用 Overlaylayout

    其他选项:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多