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

来源:互联网 发布:广州零点 数据分析 编辑:程序博客网 时间:2024/05/22 07:47
 
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 disposedat 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。

 

原创粉丝点击