【发布时间】:2010-11-22 22:23:51
【问题描述】:
我正在使用 SWT 编写桌面应用程序。从另一个线程更新 GUI 控件的最简单方法是什么?
【问题讨论】:
标签: java multithreading user-interface swt
我正在使用 SWT 编写桌面应用程序。从另一个线程更新 GUI 控件的最简单方法是什么?
【问题讨论】:
标签: java multithreading user-interface swt
根据您的需要使用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();
}
}
});
}
【讨论】:
有教程here。
“当涉及到线程问题时,SWT 确实指出了快速失败;所以至少典型问题在生产之前不会被忽视。但是,问题是,如果你需要,你会怎么做从后台线程更新 SWT 中的标签/按钮/super-duper-control?嗯,它与 Swing 惊人地相似:"
// Code in background thread.
doSomeExpensiveProcessing();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
someSwtLabel.setText("Complete!");
}
});
【讨论】:
实际上,您可以向 GUI 线程发送一条消息,说明某些修改已更改。如果从 MVC 的角度来看,这会更清晰。
【讨论】:
从主线程创建单独的线程时,将 Gui 对象传递给新线程,您可以访问该 GUI 对象的所有属性。
【讨论】: