如何从Java中的另一个线程更新SWT GUI

时间:2009-08-26 09:12:55

标签: java multithreading user-interface swt

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

4 个答案:

答案 0 :(得分:15)

根据您的需要使用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();
        }
      }
    });
  }

答案 1 :(得分:5)

有一个教程here

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

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

答案 2 :(得分:0)

您实际上只是向GUI线程发送了一条消息,表明某些修改已被更改。如果你从MVC的角度看它,那就更清洁了。

答案 3 :(得分:-1)

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