更改 Java SWT 标签时出现无效线程访问错误

Invalid Thread Access error when changing Java SWT Label

我想 运行 我的程序,其中标签的值在计时器关闭后发生变化。但是每当计时器 运行s 时,我都会不断收到无效线程访问错误,并且我的标签不会更新。

protected void createContents() {
    <--GUI codes -->

    //Timer set to go every 10 seconds
      ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              System.out.println("Timer");

              lblState.setText("On");
          }
      };
      new Timer(delay, taskPerformer).start();
}

This link from the SWT FAQ 解释错误以及如何解决它:任何修改 GUI 组件的代码(在您的情况下,设置标签的文本)需要在显示线程上 运行,否则会出现这个错误。

到显示线程上的 运行,将代码包装在 Runnable 中并使用提供的 Runnable:

调用 Display.getDefault().syncExec(
Display.getDefault().syncExec(new Runnable() {
    public void run() {
        // code that affects the GUI
    }
});

所有对 UI 对象的访问都必须在用户界面线程中完成。您可以使用 Display.asyncExec(或 Display.syncExec)执行此操作。

更改线路:

lblState.setText("On");

Display.getDefault().asyncExec(() -> lblState.setText("On"));

for Java 8. For Java 7 or earlier use:

Display.getDefault().asyncExec(new Runnable() {
   @Override
   public void run() 
   {
     lblState.setText("On");
   }
});