偶遇 :org.eclipse.swt.SWTException: Failed to execute runnable

 
Exception in thread "main" org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)
	at org.eclipse.swt.SWT.error(SWT.java:4282)
	at org.eclipse.swt.SWT.error(SWT.java:4197)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:138)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757)
	at demos.common.main(Launcher.java:125)
Caused by: org.eclipse.swt.SWTException: Widget is disposed
	at org.eclipse.swt.SWT.error(SWT.java:4282)
	at org.eclipse.swt.SWT.error(SWT.java:4197)
	at org.eclipse.swt.SWT.error(SWT.java:4168)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
	at org.eclipse.swt.widgets.Control.internal_new_GC(Control.java:1689)
	at org.eclipse.swt.graphics.GC.<init>(GC.java:166)
	at org.eclipse.swt.graphics.GC.<init>(GC.java:132)


 

SWT应用采用“左树右内容”的结构,左边是树菜单,通过点击树菜单,右边显示对应的内容,实现方式是,每点击树的叶子结点的时候,把右边容器的子容器全部dispose,然后再画上新的内容。

 

运行一段时间,发现,某个树节点对应的内容里面,如果包含有thread域,则在点击其它节点的时候,会报以上的异常,这种情况应该是在dispose右边容器的子窗口的时候,没把线程给灭掉,线程继续运行,这时就报错了。

 

经过调试,找到解决方法,在线程run方法里面加上一个判断,如果运行该线程的容器被dispose了,则不继续运行线程,如下所示:

public void run(){
if(!composite.getParentControl().isDisposed()) {
 //do your things
}

}


加上以上判断,点击有thread变量的节点,再点击其它节点,不会报前面所说的Exception。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值