项目场景:
给一个按钮加一个事件,点击后每秒显示当前时间,以及切换图片
问题描述
代码可以正常运行,但关闭这个页面弹出错误
代码
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
new Thread(new Runnable() {
@Override
public void run() {
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//
Image image1=new Image(shell.getDisplay(),"D:\\1.jpg");
Image image2=new Image(shell.getDisplay(),"D:\\2.jpg");
while(true) {
Thread.sleep(1000);
if(!shell.getDisplay().isDisposed() ) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
label.setText("当前时间为:"+sdf.format(new Date()));
if(boo) {
lblNewLabel.setImage(image2);
boo=false;
}else {
lblNewLabel.setImage(image1);
boo=true;
}
}
});
} else {
shell.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
});
运行
关闭时报错
org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:4889)
at org.eclipse.swt.SWT.error(SWT.java:4804)
at org.eclipse.swt.SWT.error(SWT.java:4775)
at org.eclipse.swt.widgets.Widget.error(Widget.java:438)
at org.eclipse.swt.widgets.Widget.getDisplay(Widget.java:560)
at project.MoreDialog$1$1.run(MoreDialog.java:104)
at java.base/java.lang.Thread.run(Thread.java:832)
原因分析:
主要原因很简单,主要是执行对象所在的Shell已经关闭了,Shell关闭之后再去使用Shell的内部组件自然会报Widget is disposed的提示。
一般场景是先打开了一个Shell,然后在Shell里面执行一系列动作后关闭了Shell,再打开该Shell执行其他操作时,如果的代码仍然使用第一次操作的Shell对象就会出现这样的问题。
为了解决这个问题,简单的做法是在第二次操作的Shell对象需要重新获取,即在自动化代码里面重新获取对象所在的Shell,再从Shell中获取所执行的对象。
解决方案:
在第二次调用时判断shell是否已销毁,即关闭页面时判断
if(shell.isDisposed()) {
return;
}
完美解决