我想运行我的程序,其中标签的值在Timer关闭后发生变化。但是每当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();
}
答案 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");
}
});