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

时间:2015-01-12 15:11:30

标签: java eclipse user-interface timer swt

我想运行我的程序,其中标签的值在T​​imer关闭后发生变化。但是每当Timer运行时,我将继续获得无效线程访问错误,并且我的标签不会更新。

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();
}

2 个答案:

答案 0 :(得分:1)

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

要在显示线程上运行,请将代码包装在Runnable内,并使用提供的Display.getDefault().syncExec(调用Runnable

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

答案 1 :(得分:1)

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

更改行:

lblState.setText("On");

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

for Java 8.对于Java 7或更早版本,请使用:

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