SWT线程访问无效
场景
在Java的GUI项目中使用另外的线程实现页面的动态刷新效果
例如:时间的实时显示
现象
线程访问无效
org.eclipse.swt.SWTException: Invalid thread access
方案
public void showTime(Label label) {
new Thread() {
public void run() {
while(true){
try {
label.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"
+ " HH:mm:ss");
String s = sdf.format(new Date());
label.setText(s);
}
});
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}.start();
}
原因
在SWT程序中,SWT会自动创建一个UI线程,所谓的主界面,
而某个按钮或事件触发的另一个事件发生时,起一个线程去处理这个事件,这个线程叫非UI线程。
强调:
非UI线程是不能直接操作UI线程
问题:
因为非UI线程找不到对应的Display。如果您了解Display功能就会很容易理解这个问题。
Display的作用就是负责enent loop, font,color,UI线程和其他线程的通信的桥梁。
重点
那么一定要在非UI线程中修改界面内容 又如何实现呢 ?
获取桥梁然后异步通讯
Display.getDefault().syncExec(new Runnable(){ })
|