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

完美解决

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值