如何从 Java 中的另一个线程更新 SWT GUI
Posted
技术标签:
【中文标题】如何从 Java 中的另一个线程更新 SWT GUI【英文标题】:How to update SWT GUI from another thread in Java 【发布时间】:2010-11-22 22:23:51 【问题描述】:我正在使用 SWT 编写桌面应用程序。从另一个线程更新 GUI 控件的最简单方法是什么?
【问题讨论】:
【参考方案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();
);
More here
【讨论】:
【参考方案2】:有教程here。
“当涉及到线程问题时,SWT 确实指出了快速失败;所以至少典型问题在生产之前不会被忽视。但是,问题是,如果你需要,你会怎么做从后台线程更新 SWT 中的标签/按钮/super-duper-control?嗯,它与 Swing 惊人地相似:"
// Code in background thread.
doSomeExpensiveProcessing();
Display.getDefault().asyncExec(new Runnable()
public void run()
someSwtLabel.setText("Complete!");
);
【讨论】:
【参考方案3】:实际上,您可以向 GUI 线程发送一条消息,说明某些修改已更改。如果从 MVC 的角度来看,这会更清晰。
【讨论】:
【参考方案4】:从主线程创建单独的线程时,将 Gui 对象传递给新线程,您可以访问该 GUI 对象的所有属性。
【讨论】:
仅仅因为 GUI 线程有对 GUI 对象的引用,并不意味着它可以访问它。您只能从原始线程更新 GUI 对象。以上是关于如何从 Java 中的另一个线程更新 SWT GUI的主要内容,如果未能解决你的问题,请参考以下文章
如何在一个单独的线程完成之前禁用 SWT selectionListener
无法从使用 c# 在不同线程上运行的另一个页面 User.cs 更新 GUI (MainWindow.xaml) 中的进度条