2012-03-29 1 views
0

У меня есть базовое приложение RCP с одной перспективой и несколькими представлениями, прикрепленными при запуске, оно в основном загружает файл CSV с переменной длиной столбца в таблицу.Eclipse RCP как повторно инициализировать представление. (Нужно сделать это, как работать с таблицей)

Вид, который содержит таблицу, заключается в том, что моя проблема заключается в том, что пользователь может выполнять некоторые основные вещи, которые взаимодействуют с таблицей, некоторые столбцы выделяются и т. Д. Но пользователь может загружать другой файл, когда захочет. И просмотр таблицы прослушивает изменения в поставщике источника файлов для этого. Когда происходит изменение данных таблицы делает это:

@Override 
public void sourceChanged(int sourcePriority, String sourceName, 
     Object sourceValue) { 
    if (sourceName == AbstractSampleDataSourceProvider.SAMPLE_DATA_KEY) { 

     for (TableColumn c : viewer.getTable().getColumns()) { 
      c.dispose(); 
     } 

     SampleData sData = (SampleData) sourceValue; 
     createColumns(sData); 
     viewer.setInput(sData.getDataSet()); 
    } 
} 

Этот код работает некоторое время, но непоследовательно ошибки с ошибкой, что я считаю, на самом деле проблема с JFace таблиц:

java.lang.NullPointerException 
at org.eclipse.swt.widgets.Widget.getData(Widget.java:558) 
at org.eclipse.jface.viewers.ColumnViewer.getViewerColumn(ColumnViewer.java:186) 
at org.eclipse.jface.viewers.OwnerDrawLabelProvider$OwnerDrawListener.handleEvent(OwnerDrawLabelProvider.java:47) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
at org.eclipse.swt.widgets.Table.sendMeasureItemEvent(Table.java:3766) 
at org.eclipse.swt.widgets.Table.CDDS_SUBITEMPREPAINT(Table.java:998) 
at org.eclipse.swt.widgets.Table.wmNotifyChild(Table.java:6840) 
at org.eclipse.swt.widgets.Control.wmNotify(Control.java:5534) 
at org.eclipse.swt.widgets.Composite.wmNotify(Composite.java:1896) 
at org.eclipse.swt.widgets.Control.WM_NOTIFY(Control.java:5086) 
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4584) 
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4985) 
at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method) 
at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2425) 
at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:564) 
at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:430) 
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4623) 
at org.eclipse.swt.widgets.Table.windowProc(Table.java:5893) 
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4972) 
at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method) 
at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2425) 
at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:564) 
at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:430) 
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4623) 
at org.eclipse.swt.widgets.Table.windowProc(Table.java:5893) 
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4972) 
at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) 
at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3275) 
at org.eclipse.swt.widgets.Table.destroyItem(Table.java:2066) 
at org.eclipse.swt.widgets.TableColumn.destroyWidget(TableColumn.java:194) 
at org.eclipse.swt.widgets.Widget.release(Widget.java:818) 
at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446) 
at mypackage.rcp.viewpart.SampleDataTableView.sourceChanged(SampleDataTableView.java:130) 
at org.eclipse.ui.AbstractSourceProvider.fireSourceChanged(AbstractSourceProvider.java:80) 
at mypackage.rcp.service.SampleDataSourceProvider.setSampleData(SampleDataSourceProvider.java:73) 
at mypackage.rcp.handler.LoadRawDataHandler.execute(LoadRawDataHandler.java:56) 
at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293) 
at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476) 
at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508) 
at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169) 
at org.eclipse.ui.internal.handlers.SlaveHandlerService.executeCommand(SlaveHandlerService.java:241) 
at org.eclipse.ui.menus.CommandContributionItem.handleWidgetSelection(CommandContributionItem.java:829) 
at org.eclipse.ui.menus.CommandContributionItem.access$19(CommandContributionItem.java:815) 
at org.eclipse.ui.menus.CommandContributionItem$5.handleEvent(CommandContributionItem.java:805) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 

Nothing удивительный интересный или проницательный из того, что я могу сказать.

В любом случае, я думаю, что мое решение этой проблемы состоит в том, чтобы либо повторно создать представление (я могу это сделать), либо полностью избавиться от своего представления и создать новый в той же позиции, до того как данные изменили прослушиватели попали. Так что каждый раз это новая таблица, которая начинает использоваться.

В любом случае, я понятия не имею, как это сделать, поэтому мысли и предложения будут высоко оценены. (На самом деле, если кто-нибудь знает, как предотвратить ошибку, которая будет лучше)

С уважением,

Glen х

ответ

1

Почему просто не выбрасывайте таблицу и создать заново? Должно быть меньше хлопот, чем повторное открытие всего взгляда. Или, чтобы избежать ошибки, вы можете попытаться установить поставщика фиктивной метки для замены OwnerDrawLabelProvider перед удалением столбца.

+0

Я не мог решить, как избавиться от стола. Я не уверен, что вы можете, потому что зритель регистрируется с родителем при создании представления. – Link19

+1

Создайте 'Composite' между родителем, который вы получаете в' createPartControl (Composite parent) 'и вашей таблице (Viewer) (т. Е. Ваш новый композит будет родителем вашей таблицы). Затем вы удаляете таблицу и создаете новый как дочерний элемент вашего композитного материала. – p12t

Смежные вопросы