Я пишу настольное приложение с использованием SWT. Каков самый простой способ обновить элементы управления графическим интерфейсом из другого потока?
Как обновить SWT GUI из другого потока в Java
Ответ 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.