Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)原因以及解决办法

以下错误是本人学习中碰到的,以后碰到继续完善:

SWT编程中,当一个类中有一个线程 的时候,这个shell打开又关闭,这样重复几次的时候就会出现这样一个问题:

Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed);

解决办法:经过查资料,以及调试,这个问题是这个shell关闭的时候,其中的某些标签或者什么的也被销毁了,而此时还在往里面写东西;就会出现这样的错误;下面是代码的修改:

应该会很明白;

<span style="color: rgb(70, 70, 70);">未修改前
thread=new Thread(new Runnable() {
                     public void run() {
                             while (!shell.isDisposed()) {
                                     display.asyncExec(new Runnable() {
                                             public void run() {
                                                    </span><span style="color:#ff0000;">        label_5.setText(AddUsers.time);</span><span style="color:#464646;">
                                             }
                                     });
                                     try {
                                             Thread.sleep(1000);
                                     } catch (InterruptedException e) {
                                             e.printStackTrace();
                                     }
                             }
                     }
             });
             thread.start();
             shell.addDisposeListener(new DisposeListener() {
                     @SuppressWarnings("deprecation")
                     public void widgetDisposed(DisposeEvent arg0) {
                             thread.stop();
                     }
           });</span>
修改后
<span style="color:#464646;">thread=new Thread(new Runnable() {
			public void run() {
				while (!shell.isDisposed()) {
					display.asyncExec(new Runnable() {
						public void run() {
							</span><span style="color:#ff6600;">if(!label_5.isDisposed()){
								label_5.setText(AddUsers.time);
							}</span><span style="color:#464646;">
						
						}
					});
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
		thread.start();
		
		shell.addDisposeListener(new DisposeListener() {
			@SuppressWarnings("deprecation")
			public void widgetDisposed(DisposeEvent arg0) {
				thread.stop();
			}
		});</span>
总结:SWT中,当一个线程在一个类中的时候,这个类的实例被销毁了,其中的某些标签要被使用的时候,一定要注意这个标签是否被销毁,很简单的做法就是加判断。

总结2:不同线程之间的共享资源要放在共享区使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值