【问题标题】:Properly to loading a large Java Swing UI without freezing it正确加载大型 Java Swing UI 而不会冻结它
【发布时间】:2018-02-07 11:30:02
【问题描述】:

我正在开发一个大型 Swing 应用程序,其中包含许多在应用程序启动时加载的组件。加载组件、设置它们的属性并将它们添加到面板的过程需要几秒钟。

应用程序 UI 在加载应用程序期间冻结。我想在加载整个 UI 时显示一个启动画面,但启动画面也会冻结。

如果我将 UI 构造移动到另一个线程,这将违反 EDT 线程。

在不冻结 UI 的情况下加载此类 Swing 界面的正确方法是什么?

我已经看到了关于这个主题的现有答案,但它们涵盖了与 Swing 无关的外部任务阻塞 UI 的情况,但在这里,复杂 UI 本身的构造会阻塞 UI 刷新 (启动屏幕进度条)。

【问题讨论】:

    标签: java multithreading swing event-dispatch-thread


    【解决方案1】:

    解决这个问题有两种可能。

    1. 您将 UI 初始化拆分为小块,并使用 SwingUtilities.invokeLater 调用每个块。每个invokeLater 都会触发重新绘制,因此可以刷新您的 GUI。这应该是首选方式。
    2. 当您在将应用程序拆分为独立的小块时遇到问题时,您可以“误用”Foxtrot lib 为 UI 重绘提供同步中断

      public static void sleepNonBlocking(long millis) {
          Worker.post(new Job() {
      
              @Override
              public Object run() {
                  try {
                      Thread.sleep(millis);
                  } catch (Exception e) {
                      // nothing
                  }
                  return null;
              }
          });
      }
      

      您需要在应用程序的某些地方调用此方法以强制重新绘制。

    【讨论】:

    • 非常感谢,这正是我想要的。
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2018-12-22
    • 2012-06-26
    • 1970-01-01
    • 2020-05-26
    • 2020-07-05
    相关资源
    最近更新 更多