1

我使用推荐的代码来启动我的交互式程序,该程序使用 Swing。:

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(
        new Runnable() {
          public void run() {
            createAndShowGUI();
          } } ) };

它创建一个 JFrame,将其称为“Foo”,并在用户关闭该窗口时结束(通过使用操作系统的 Close-Window X 图标或其他操作系统方式关闭应用程序)

我想显示另一个窗口“Bar”,获取用户输入,用我自己的 Swing 调用关闭该窗口,然后显示“Foo”窗口。

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

我是否需要使用 InvokeLater() 来调用显示 Bar 的代码?为了获得更多的设计独立性,我的 main() 是否应该启动并同步两个线程?

4

2 回答 2

2

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

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

  • 您将在所有情况下使用pack()setVisible(true)包裹到invokeLater

    1. 对于新Top-Level Container- 总是

    2. 对于已创建但从未付款的容器 - 始终

    3. 对于容器曾经可见,然后隐藏并再次在屏幕上可见 - 总是

    4. 是否从 Swing Listener 调用(默认情况下在 EDT 上)并不重要

  • 到我的第三点。避免Graphics在您重复使用的情况下出现任何不必要的缺失Top-Level Container(具体情况,非常短的时间,但可以看到,但不会,从不烦人)

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

    • oldJComponent是可见的,然后立即用 current 刷新JComponents

    • relayout/ pack(),与 am 相同的问题

  • invokeLater延迟(在大多数情况下成功)此事件到结束EDT

  • 看到我的观点翻译成代码演示

于 2013-08-16T13:10:56.013 回答
2

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

于 2013-08-16T12:36:55.447 回答