任何更改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();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)