Как обновить SWT GUI из другого потока в Java

Я пишу настольное приложение с использованием SWT. Каков самый простой способ обновить элементы управления графическим интерфейсом из другого потока?

Ответ 1

Используйте Display.asyncExec или Display.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

Вот учебник здесь.

"SWT действительно делает ставку на неудачу, когда дело доходит до проблем с потоками, поэтому, по крайней мере, типичные проблемы не остаются незамеченными до производства. Вопрос в том, что вы делаете, если вам нужно обновить label/button/super-duper-control в SWT из фонового потока? Ну, это удивительно похоже на Swing:"

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

Ответ 3

На самом деле вы можете просто послать сообщение в поток графического интерфейса, что некоторые изменения были изменены. Это чище, если вы видите его с точки зрения MVC.

Ответ 4

При создании отдельного потока из основного потока передайте объект Gui новому потоку, и вы можете получить доступ ко всем свойствам этого объекта GUI.