Ich habe eine grundlegende RCP-Anwendung mit einer Perspektive und ein paar Ansichten beim Start angebracht, es lädt grundsätzlich eine abwechslungsreiche Spalte Länge CSV-Datei in eine Tabelle.Eclipse RCP, wie man eine Ansicht neu initialisiert. (Müssen Sie dies als Arbeit um Tabelle Fehler zu tun)
Die Ansicht, die die Tabelle enthält, ist mein Problem, weil der Benutzer einige grundlegende Dinge tun kann, die mit der Tabelle interagieren, bestimmte Spalten markiert usw. Aber der Benutzer kann eine andere Datei laden, wann immer sie wollen. Und die Tabellenansicht wartet auf Änderungen im Dateiquellenanbieter, um dies zu tun. Wenn die Daten eine Änderung funktioniert die Tabelle geschieht dies:
@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());
}
}
Dieser Code funktioniert manchmal, aber inkonsistent Fehler mit einem Fehler, die ich glaube, ist tatsächlich ein Problem mit dem JFace Tables:
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)
Nichts erstaunlich interessant oder einsichtsvoll dort von dem, was ich sagen kann.
Wie auch immer ich denke, dass meine Lösung für dieses Problem ist, entweder die Ansicht zu instanziieren (kann ich dies tun) oder meine Ansicht vollständig zu beseitigen und eine neue in der gleichen Position zu generieren, bevor die Daten Listener geändert sind getroffen. So dass jedes Mal ein brandneuer Tisch verwendet wird.
Wie auch immer, ich habe keine Ahnung, wie man das macht, also würden Gedanken und Vorschläge sehr geschätzt werden. (In der Tat, wenn jemand weiß, wie man die Fehler zu verhindern, die besser wären)
Grüße,
Glen x
Ich konnte nicht herausfinden, wie man den Tisch entsorgt. Ich bin mir nicht sicher, ob Sie das können, weil sich der Betrachter bei der Erstellung der View bei der übergeordneten Person registriert. – Link19
Erstellen Sie eine 'Composite' zwischen dem übergeordneten Element, das Sie in' createPartControl (zusammengesetzte Eltern) erhalten haben, und Ihrer Tabelle (Viewer) (d. H. Ihre neue Zusammensetzung ist das übergeordnete Element Ihrer Tabelle). Dann entsorgen Sie die Tabelle und erstellen ein neues Kind als Ihr Composite. – p12t