Как обновить SWT GUI из другого потока в Java - PullRequest
12 голосов
/ 26 августа 2009

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

Ответы [ 4 ]

15 голосов
/ 26 августа 2009

Используйте 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();
        }
      }
    });
  }
5 голосов
/ 26 августа 2009

Здесь есть учебник .

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

// Code in background thread.
doSomeExpensiveProcessing();
Display.getDefault().asyncExec(new Runnable() {
 public void run() {
  someSwtLabel.setText("Complete!");
 }
});
0 голосов
/ 26 августа 2009

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

0 голосов
/ 26 августа 2009

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

...