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