解决org.eclipse.swt.SWTException: Widget is disposed

项目场景:

给一个按钮加一个事件,点击后每秒显示当前时间,以及切换图片


问题描述

代码可以正常运行,但关闭这个页面弹出错误

代码

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_第1张图片

 

关闭时报错

解决org.eclipse.swt.SWTException: Widget is disposed_第2张图片

 

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;
}
	

完美解决

你可能感兴趣的:(java,java,eclipse)