我使用推荐的代码启动我的交互式程序,该程序使用Swing。 :
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
createAndShowGUI();
} } ) };
它创建一个JFrame,称之为“Foo”,并在用户关闭该窗口时结束(通过使用操作系统'关闭窗口X图标或其他操作系统方式关闭应用程序)
我想显示另一个窗口,“Bar”,获取用户输入,用我自己的Swing调用关闭该窗口,然后显示“Foo”窗口。
我可以为Foo和Bar重用相同的JFrame,并在中间清除它。但我更愿意让他们每个人的设计更加独立。因此,Foo中的ActionListener需要关闭Foo的框架,并调用显示Bar的代码
我是否需要使用InvokeLater()来调用显示Bar的代码?为了获得更多的设计独立性,我的main()应该启动并同步两个线程吗?
答案 0 :(得分:2)
用户触发的动作侦听器代码在EDT中执行,因此您无需再次包装它。也就是说,使用CardLayout
可能比多帧更合适。
答案 1 :(得分:2)
我可以为Foo和Bar重用相同的JFrame,然后清除它 在两者之间。但我更愿意让每个人更加独立 他们的设计。因此,Foo中的ActionListener需要关闭Foo 框架,并调用显示Bar的代码。
我是否需要使用InvokeLater()来调用显示Bar的代码?至 得到更多的设计独立性,我不清楚的操作 EDT。
在所有情况下,您都会pack()
和setVisible(true)
包含在invokeLater
中
新Top-Level Container
- alyways
创建但从未显示过的容器 - 始终
容器一旦可见,然后隐藏并再次在屏幕上显示 - 始终
无关紧要
到第3点。在你重用Graphics
的情况下避免任何不必要的Top-Level Container
缺乏(具体,非常短暂的时刻,但可能是可见的,但不是,从不讨厌)
旧值可见,然后立即刷新为当前
旧JComponent
可见,然后立即刷新当前JComponents
relayout
/ pack()
,与a.m相同的问题。
invokeLater
将此事件延迟(大多数成功)此事件到EDT