InvokeLater() - 只会一次就够了吗?

时间:2013-08-16 12:33:07

标签: java swing jframe event-dispatch-thread invokelater

我使用推荐的代码启动我的交互式程序,该程序使用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()应该启动并同步两个线程吗?

2 个答案:

答案 0 :(得分:2)

用户触发的动作侦听器代码在EDT中执行,因此您无需再次包装它。也就是说,使用CardLayout可能比多帧更合适。

答案 1 :(得分:2)

  

我可以为Foo和Bar重用相同的JFrame,然后清除它   在两者之间。但我更愿意让每个人更加独立   他们的设计。因此,Foo中的ActionListener需要关闭Foo   框架,并调用显示Bar的代码。

     

我是否需要使用InvokeLater()来调用显示Bar的代码?至   得到更多的设计独立性,我不清楚的操作   EDT。

  • 在所有情况下,您都会pack()setVisible(true)包含在invokeLater

    1. Top-Level Container - alyways

    2. 创建但从未显示过的容器 - 始终

    3. 容器一旦可见,然后隐藏并再次在屏幕上显示 - 始终

    4. 如果从Swing Listener(默认情况下在EDT上)调用
    5. 无关紧要

  • 到第3点。在你重用Graphics的情况下避免任何不必要的Top-Level Container缺乏(具体,非常短暂的时刻,但可能是可见的,但不是,从不讨厌)

    • 旧值可见,然后立即刷新为当前

    • JComponent可见,然后立即刷新当前JComponents

    • relayout / pack(),与a.m相同的问题。

  • invokeLater将此事件延迟(大多数成功)此事件到EDT

    结束
  • see my view translated to the code demonstration about