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

本文介绍了一个在SWT环境下定时更新UI显示时间并切换图片的应用案例,遇到在关闭页面时出现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;
}
	

完美解决

kettle-webspoon 17-Jun-2025 09:04:16.616 信息 [Thread-129] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina] Exception while disposing shell: Shell {Spoon - [FileRepository] [没有名称]} org.eclipse.swt.SWTException: Graphic is disposed at org.eclipse.swt.SWT.error(SWT.java:3808) at org.eclipse.swt.SWT.error(SWT.java:3731) at org.eclipse.swt.SWT.error(SWT.java:3702) at org.eclipse.swt.graphics.Image.getBounds(Image.java:425) at org.eclipse.swt.widgets.ToolItem.getPreferredHeight(ToolItem.java:587) at org.eclipse.swt.widgets.ToolItem.getHeight(ToolItem.java:541) at org.eclipse.swt.widgets.ToolItem.getBounds(ToolItem.java:497) at org.eclipse.swt.widgets.ToolBar.layoutItems(ToolBar.java:385) at org.eclipse.swt.widgets.ToolBar.destroyItem(ToolBar.java:379) at org.eclipse.swt.widgets.ToolItem.releaseParent(ToolItem.java:805) at org.eclipse.swt.widgets.Widget.dispose(Widget.java:848) at org.eclipse.swt.widgets.ToolBar.releaseChildren(ToolBar.java:354) at org.eclipse.swt.widgets.Widget.dispose(Widget.java:844) at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:873) at org.eclipse.swt.widgets.Shell.releaseChildren(Shell.java:992) at org.eclipse.swt.widgets.Widget.dispose(Widget.java:844) at org.eclipse.swt.widgets.Display.disposeShells(Display.java:763) at org.eclipse.swt.widgets.Display.release(Display.java:739) at org.eclipse.swt.graphics.Device.dispose(Device.java:279) at org.eclipse.rap.rwt.internal.lifecycle.UIThread.processShutdown(UIThread.java:179) at org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:309) at java.lang.Thread.run(Thread.java:748) at org.eclipse.rap.rwt.internal.lifecycle.UIThread.run(UIThread.java:107) /usr/local/tomcat/bin/catalina.sh: line 149: /usr/local/tomcat/bin/setenv.sh: Operation not permitted
最新发布
07-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值