任何更改UI对象的SWT操作都必须在SWT用户界面线程上运行。
在您的情况下,该text.setText(i.toString());
行是SWT UI操作,并且在其他线程中运行。
您可以使用的asyncExec
或syncExec
方法Display
在UI线程中运行一些代码。因此,请替换:
text.setText(i.toString());
与
final String newText = i.toString();
Display.getDefault().asyncExec(() -> text.setText(newText));
(这是假设您使用的是Java 8)。
使用asyncExec
将异步进行UI更新。syncExec
如果您想暂停线程直到更新完成,请改用。
如果您使用的是Java 7或更早版本,请使用:
final String newText = i.toString();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
text.setText(newText);
}
});
请注意,您还应该检查是否Shell
正在处理该线程并停止后台线程。如果不这样做,则在关闭应用程序时会出现错误。您的代码增量i
也是错误的。该线程有效:
new Thread(() -> {
for (int i = 1; true; i++) {
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
return;
}
if (shell.isDisposed()) // Stop thread when shell is closed
break;
final String newText = Integer.toString(i);
Display.getDefault().asyncExec(() -> text.setText(newText));
}
}).start();