org.eclipse.swt.SWTException: «Виджет удален» из обновления таблицы - PullRequest
8 голосов
/ 28 февраля 2011

Приложение представляет собой RCP на основе Eclipse 3.6 (так, версия jface 3.5.2), работающее на Windows 7.

У меня есть собственный класс View, который содержит TableViewer и вызывает refresh(). Иногда, но не очень часто это приводит к трассировке стека ниже. Он вызывается из потока пользовательского интерфейса. Я подозревал, что проблема была с другим кодом, который изменяет список поддержки на таблицу, но любой код, который делает это, также выполняется в методе 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)

Ответы [ 3 ]

7 голосов
/ 05 июня 2011

Похоже, что метод refresh () вызывается после удаления зрителя (закрыто?).Вы можете избежать этого исключения, проверив:

public void refresh() {
   if (viewer != null && !viewer.getControl().isDisposed()) {
      // Actual refresh code
   }
}
2 голосов
/ 23 августа 2013

Попробуйте использовать display.isDisposed () следующим образом.

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

Но помните, что isDisposed () возвращает true, а затем удаляет end. Вот почему вы должны использовать флаг

удаление = истина;

display.dispose ();

удаление = ложь; * * 1010

1 голос
/ 22 января 2013

Просто создайте новое рабочее пространство. Импортируйте свои проекты. Это сработало для меня. :)

...