【问题标题】:How to update SWT GUI from another thread in Java如何从 Java 中的另一个线程更新 SWT GUI
【发布时间】:2010-11-22 22:23:51
【问题描述】:

我正在使用 SWT 编写桌面应用程序。从另一个线程更新 GUI 控件的最简单方法是什么?

【问题讨论】:

    标签: java multithreading user-interface swt


    【解决方案1】:

    根据您的需要使用Display.asyncExecDisplay.syncExec

    例如,另一个线程可能会调用此方法来安全地更新标签:

      private static void doUpdate(final Display display, final Label target,
          final String value) {
        display.asyncExec(new Runnable() {
          @Override
          public void run() {
            if (!target.isDisposed()) {
              target.setText(value);
              target.getParent().layout();
            }
          }
        });
      }
    

    【讨论】:

      【解决方案2】:

      有教程here

      “当涉及到线程问题时,SWT 确实指出了快速失败;所以至少典型问题在生产之前不会被忽视。但是,问题是,如果你需要,你会怎么做从后台线程更新 SWT 中的标签/按钮/super-duper-control?嗯,它与 Swing 惊人地相似:"

      // Code in background thread.
      doSomeExpensiveProcessing();
      Display.getDefault().asyncExec(new Runnable() {
       public void run() {
        someSwtLabel.setText("Complete!");
       }
      });
      

      【讨论】:

        【解决方案3】:

        实际上,您可以向 GUI 线程发送一条消息,说明某些修改已更改。如果从 MVC 的角度来看,这会更清晰。

        【讨论】:

          【解决方案4】:

          从主线程创建单独的线程时,将 Gui 对象传递给新线程,您可以访问该 GUI 对象的所有属性。

          【讨论】:

          • 仅仅因为 GUI 线程有对 GUI 对象的引用,并不意味着它可以访问它。您只能从原始线程更新 GUI 对象。
          猜你喜欢
          • 2020-07-13
          相关资源
          最近更新 更多