2013-03-11 64 views
0

我有一个CTabFolder,它包含几个一次性选项卡,每个选项卡都包含一个TreeViewer。我希望每个查看器都有一个DragSupport。所以很自然我用那个方法TreeViewer#addDragSupport。一切都按预期工作,除非我关闭shell并且SWT试图处理所有的小部件。SWT TreeViewer Drag n Drop:处理SWTException小部件

时发生的异常是:

org.eclipse.swt.SWTException: Widget is disposed 
at org.eclipse.swt.SWT.error(Unknown Source) 
at org.eclipse.swt.SWT.error(Unknown Source) 
at org.eclipse.swt.SWT.error(Unknown Source) 
at org.eclipse.swt.widgets.Widget.error(Unknown Source) 
at org.eclipse.swt.widgets.Widget.checkWidget(Unknown Source) 
at org.eclipse.swt.widgets.Widget.removeListener(Unknown Source) 
at org.eclipse.swt.dnd.DragSource.onDispose(Unknown Source) 
at org.eclipse.swt.dnd.DragSource.access$1(Unknown Source) 
at org.eclipse.swt.dnd.DragSource$2.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Widget.dispose(Unknown Source) 
at org.eclipse.swt.dnd.DragSource$1.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Widget.dispose(Unknown Source) 
at org.eclipse.jface.viewers.ContentViewer.handleDispose(ContentViewer.java:172) 
at org.eclipse.jface.viewers.StructuredViewer.handleDispose(StructuredViewer.java:2328) 
at org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(ContentViewer.java:214) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Widget.dispose(Unknown Source) 
at org.eclipse.jface.viewers.ContentViewer.handleDispose(ContentViewer.java:172) 
at org.eclipse.jface.viewers.StructuredViewer.handleDispose(StructuredViewer.java:2328) 
at org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(ContentViewer.java:214) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Widget.dispose(Unknown Source) 
at org.eclipse.jface.viewers.ContentViewer.handleDispose(ContentViewer.java:172) 
at org.eclipse.jface.viewers.StructuredViewer.handleDispose(StructuredViewer.java:2328) 
at org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(ContentViewer.java:214) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Widget.dispose(Unknown Source) 
at org.eclipse.jface.viewers.ContentViewer.handleDispose(ContentViewer.java:172) 
at org.eclipse.jface.viewers.StructuredViewer.handleDispose(StructuredViewer.java:2328) 
at org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(ContentViewer.java:214) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Composite.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Canvas.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Shell.releaseChildren(Unknown Source) 
at org.eclipse.swt.widgets.Widget.release(Unknown Source) 
at org.eclipse.swt.widgets.Widget.dispose(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.dispose(Unknown Source) 
at org.eclipse.swt.widgets.Shell.dispose(Unknown Source) 
at org.eclipse.jface.window.Window.close(Window.java:335) 
at org.eclipse.jface.window.ApplicationWindow.close(ApplicationWindow.java:307) 
at org.eclipse.jface.window.Window.handleShellCloseEvent(Window.java:741) 
at org.eclipse.jface.window.Window$3.shellClosed(Window.java:687) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source) 
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.closeWidget(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.WM_CLOSE(Unknown Source) 
at org.eclipse.swt.widgets.Control.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Canvas.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Shell.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Display.windowProc(Unknown Source) 
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) 
at org.eclipse.swt.internal.win32.OS.DefWindowProc(Unknown Source) 
at org.eclipse.swt.widgets.Shell.callWindowProc(Unknown Source) 
at org.eclipse.swt.widgets.Control.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Canvas.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Shell.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Display.windowProc(Unknown Source) 
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) 
at org.eclipse.swt.internal.win32.OS.DefWindowProc(Unknown Source) 
at org.eclipse.swt.widgets.Shell.callWindowProc(Unknown Source) 
at org.eclipse.swt.widgets.Control.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Canvas.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Decorations.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Shell.windowProc(Unknown Source) 
at org.eclipse.swt.widgets.Display.windowProc(Unknown Source) 
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) 
at org.eclipse.swt.internal.win32.OS.DispatchMessage(Unknown Source) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source) 
at org.eclipse.jface.window.Window.runEventLoop(Window.java:825) 
at org.eclipse.jface.window.Window.open(Window.java:801) 

这似乎有点广泛。看来SWT在处理完毕后会尝试从树中移除DragListener。我真的不明白这怎么可能。

我不认为我犯了一个错误实现源/目标和传输类型,因为拖放和下降的作品就像一个魅力。

将Drag支持添加到包含在一次性Widget中的TreeViewer时,可能需要考虑哪些缺陷?

如果你需要一个代码示例让我知道。

回答

0

它不应该是一个问题。你有2个选择:写一段代码给你那个错误,或者只是在文件夹上添加一个dispose listener事件,并删除那里的拖动支持。