У меня есть базовое приложение RCP с одной перспективой и несколькими видами, присоединенными при запуске, оно в основном загружает CSV-файл с переменной длиной столбца в таблицу.
Вид, содержащий таблицу, - это гдеМоя проблема в том, что пользователь может выполнять некоторые базовые действия, которые взаимодействуют с таблицей, некоторые столбцы подсвечиваются и т. д. Но пользователь может загрузить другой файл, когда захочет.И табличное представление слушает изменения в поставщике источника файла, чтобы сделать это.Когда происходит изменение данных, таблица делает следующее:
@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)
Ничего удивительного, интересного или проницательного там нет из того, что я могу сказать.
В любом случае, я думаю, что мое решение этой проблемы состоит в том, чтобы либо восстановить представление (можно ли это сделать), либо избавитьсямой взгляд полностью и сгенерировать новый в той же позиции, прежде чем данные изменились слушатели будут поражены.Так что каждый раз, когда это новый стол, который начинают использоваться.
В любом случае, я понятия не имею, как это сделать, поэтому мысли и предложения будут высоко оценены.(на самом деле, если кто-нибудь знает, как предотвратить ошибку, которая будет лучше)
С уважением,
Глен х