在执行该按钮的动作期间移除按钮

时间:2016-04-16 21:31:40

标签: java swing

我试图弄清楚为什么我的程序冻结了,我能够用一个小脚本复制它,所以我可以把它放在这里。基本上,在这个脚本中单击按钮Test1时,它应该删除它并添加新的按钮Test2。程序冻结了。为什么?我怎么能过来这个?

final JFrame frame = new JFrame("FrameDemo");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setPreferredSize(new Dimension(800, 600));

                final JPanel panel = new JPanel();
                final JButton bTest1 = new JButton("test1");
                bTest1.addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent e) {
                      panel.remove(bTest1);
                      panel.add(new JButton("test2"));
                    }

                });
                panel.add(bTest1);
                frame.getContentPane().add(panel);

                frame.pack();
                frame.setVisible(true);

在真实程序中,在按钮单击时,删除面板的所有内容并重新添加一组新组件。

寻求你的帮助!

2 个答案:

答案 0 :(得分:4)

  

在真实程序中,在按钮单击时,删除面板的所有内容并重新添加一组新组件。

然后你应该使用CardLayoutCardLayout旨在允许您交换面板。

阅读How to Use CardLayout上Swing教程中的部分,了解更多信息和工作示例。

  

该程序冻结。为什么?我怎么能过来这个?

它并没有冻结,只是面板不够聪明,不能重新粉刷自己。你调整框架的大小,你会看到新的按钮。

问题是您删除了按钮并添加了一个新按钮,但面板从不重新绘制,因为面板不知道更改。您需要调用布局管理器,以便为新按钮指定适当的大小。

在可见GUI上添加/删除组件的基本代码是:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed

答案 1 :(得分:0)

JButton的动作执行方法将在AWT线程中执行。从容器中删除按钮时,将启动应在同一线程中执行的事件。所以一个人正在等待另一个,所以程序冻结了。要解决这种情况,请使用

  

SwingUtilities.invokeLater

执行按钮删除操作的方法