org.eclipse.swt.SWTException:从表刷新中"处理小部件"

Alb*_*Alb 8 java swt jface eclipse-rcp

该应用程序是基于Eclipse 3.6的RCP(因此jface版本3.5.2)在Windows 7上运行.

我有一个自定义View类,包含一个TableViewer并调用refresh()它.有时,但不是经常导致下面的堆栈跟踪.它是从UI线程中调用的.我怀疑问题是其他代码将支持列表更改为表,但执行此操作的任何代码也在syncExec或asyncExec方法中运行,所以我不明白它是如何在更改之间的同步问题表项和刷新查看器.

我有什么想法可以防止这种情况发生?

!ENTRY org.eclipse.jface 4 2 2010-10-20 09:22:06.140 !MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface". !STACK 0 org.eclipse.swt.SWTException: Widget is disposed 
at org.eclipse.swt.SWT.error(SWT.java:3884) at org.eclipse.swt.SWT.error(SWT.java:3799) 
at org.eclipse.swt.SWT.error(SWT.java:3770) at org.eclipse.swt.widgets.Widget.error(Widget.java:463) 
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:336) 
at org.eclipse.swt.widgets.Widget.getData(Widget.java:521) 
at org.eclipse.jface.viewers.AbstractTableViewer.setSelectionToWidget(AbstractTableViewer.java:921) 
at org.eclipse.jface.viewers.StructuredViewer.setSelectionToWidget(StructuredViewer.java:1711) 
at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1399) 
at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1353) 
at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1455) 
at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:537) 
at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1414)
... 
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:179)
Run Code Online (Sandbox Code Playgroud)

Mic*_*tor 7

看起来像refresh()方法是在查看器被释放后调用的(关闭?).您可以通过检查来避免此异常:

public void refresh() {
   if (viewer != null && !viewer.getControl().isDisposed()) {
      // Actual refresh code
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 它只是一种解决方法,你必须在任何地方使用它.抛出此错误,如果某些已处置的小部件未被垃圾收集,则当小部件已被用作某处的侦听器并且在处理后未被注销时,我经常会收到此错误.spektom提出的解决方案只能在一个地方避免问题,而不是实际修复它,我会用它作为最后一个实例.首先,我会检查,如果你的小部件被处理后被引用到某个地方. (4认同)