如何从 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的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以从 android 中的另一个线程更新视图?

如何在一个单独的线程完成之前禁用 SWT selectionListener

从java中的另一个线程访问一个线程的变量

无法从使用 c# 在不同线程上运行的另一个页面 User.cs 更新 GUI (MainWindow.xaml) 中的进度条

如何在 Java 中的另一个线程内创建一个完全独立的线程?

java如何检查执行的线程已卡死