当前位置: 首页 > 知识库问答 >
问题:

从 JFrame 中的 JLabel 中删除图像

谢学名
2023-03-14

我创建了一个JButton,如果我点击它,就会显示一张卡片。每次我点击这个按钮,下一张相同花色的牌就会出现,这个过程应该继续下去,直到所有13张相同花色的牌都显示出来。我在JLabel的ImageIcon上以图片的形式展示卡片。问题是,如果我想在同一个地方显示所有的牌,第一张牌不会从原来的位置移走,而是将其余的12张牌隐藏起来。这意味着每一张新牌,它应该被展示到它的前一张牌之下。我试图通过使用frame.remove(mylabel)从JLabel中删除precedent卡;方法。但是没有用。此外,如果我在setBound()方法中更改坐标,就会显示card。但是我想在展示第一张卡片的地方展示这张卡片。我已经使用计数器切换到下一张卡。每显示一张卡,计数器变量就增加一个值,最终切换到下一张卡。请指导我如何移除前一张卡片,以便显示下一张卡片。我已经在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.");
                }
            }
        });

共有1个答案

邵绪
2023-03-14

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

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

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

其他选项:

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

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

您还可以尝试使用重叠布局,该布局类似于OverLayLayout,但设计用于这样的布局。

 类似资料:
  • 问题内容: 我正在通过“双重缓冲”方法来捕获JFrame的屏幕截图,如下所示: 在何处扩展JFrame。我得到的图像的标题栏所在的顶部有一个空白条。在没有为标题栏分配额外空间的情况下,捕获JFrame内容图像的最直接方法是什么? 问题答案: 您应该能够使用Screen Image类。只需指定框架的内容窗格(如果有菜单,则指定根窗格)作为所需图像的组件。 或者您的基本代码应该起作用,再次将内容窗格(

  • 问题内容: 在我的JFrame中,我具有默认的咖啡图标。我要删除它。但是当我做setIconImage(null)时不起作用。谁能告诉我有关如何完全删除图标的解决方案 问题答案: 创建由一个像素(更好地透明)组成的图标并使用它。如果您需要这样的图标,请与我联系。我会寄给你。

  • 问题内容: 当我需要时会出现一个新的JPanel(超过了时间限制或用户按下了“提交”按钮)。但是几秒钟后,旧的JPanel的某些元素就会与新的JPanel的组件一起出现。我不明白为什么会这样。 我以为是因为我必须对其他线程更新窗口。但是第一个线程只需将旧面板添加一次(因此,应该完成)。在第二个线程中,我有一个中断的循环(因此,它也应该完成)。 这是我的代码: 问题答案: 从容器(框架)中删除组件(

  • 我已经搜索了多个网站,android开发者网站,在没有运气解决我的问题后,我不得不寻求社区帮助。我们将非常感谢所有的帮助和建议。 问题: 我总共有12个从服务器接收的图像(在这里解析),我在一个PagerAdapter中显示了它们中的每一个。如果所有的值都不为空,适配器代码工作正常,问题是我允许空值存储在服务器中。当我从服务器获得整个列表时,我只想在包含not null的适配器中拥有这些视图。例如

  • 本文向大家介绍从视图中删除行会从MySQL的基表中删除行吗?,包括了从视图中删除行会从MySQL的基表中删除行吗?的使用技巧和注意事项,需要的朋友参考一下 是的,从视图中删除行从基表中删除行。让我们通过创建一个新表来了解这一点。创建表的查询如下 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出 让我们创建一个视图。创建视图的查询如下

  • 问题内容: 这应该很容易,但是我很难过。基本上,我在matplotlib中有一个子图,每次调用一个函数时,我都会绘制一个六边形图,但是每次调用该函数时,都会得到一个新的颜色条,所以我真正想做的就是更新颜色条。不幸的是,这似乎不起作用,因为通过subplot.hexbin重新创建了附加了颜色条的对象。 我现在在这个烦人的地方,尝试完全删除颜色条轴,然后重新创建它。不幸的是,当我删除颜色条轴时,子图轴