У меня есть базовое приложение 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 х
Я не мог решить, как избавиться от стола. Я не уверен, что вы можете, потому что зритель регистрируется с родителем при создании представления. – Link19
Создайте 'Composite' между родителем, который вы получаете в' createPartControl (Composite parent) 'и вашей таблице (Viewer) (т. Е. Ваш новый композит будет родителем вашей таблицы). Затем вы удаляете таблицу и создаете новый как дочерний элемент вашего композитного материала. – p12t