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

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

我有一个包含TableViewer的自定义View类,并在其上调用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) 

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

 public void refresh() { if (viewer != null && !viewer.getControl().isDisposed()) { // Actual refresh code } } 

尝试像这样使用display.isDisposed()。

  shell.getDisplay().asyncExec(new Runnable() { @Override public void run () { if(!display.isDisposed() && !disposing) { //you source code } } }); 

但请记住isDisposed()返回true然后处理结束。 这就是为什么你穿旗帜

disposing = true;

display.dispose();

disposing = false;

只需创建一个新的工作空间。 导入您的项目。 它对我有用。 🙂