我试图弄清楚为什么我的程序冻结了,我能够用一个小脚本复制它,所以我可以把它放在这里。基本上,在这个脚本中单击按钮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);
在真实程序中,在按钮单击时,删除面板的所有内容并重新添加一组新组件。
寻求你的帮助!
答案 0 :(得分:4)
在真实程序中,在按钮单击时,删除面板的所有内容并重新添加一组新组件。
然后你应该使用CardLayout
。 CardLayout
旨在允许您交换面板。
阅读How to Use CardLayout上Swing教程中的部分,了解更多信息和工作示例。
该程序冻结。为什么?我怎么能过来这个?
它并没有冻结,只是面板不够聪明,不能重新粉刷自己。你调整框架的大小,你会看到新的按钮。
问题是您删除了按钮并添加了一个新按钮,但面板从不重新绘制,因为面板不知道更改。您需要调用布局管理器,以便为新按钮指定适当的大小。
在可见GUI上添加/删除组件的基本代码是:
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed
答案 1 :(得分:0)
JButton的动作执行方法将在AWT线程中执行。从容器中删除按钮时,将启动应在同一线程中执行的事件。所以一个人正在等待另一个,所以程序冻结了。要解决这种情况,请使用
SwingUtilities.invokeLater
执行按钮删除操作的方法