2012-03-29 23 views
0

は、私は1つの視点での基本的な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) 

ナッシング興味深い、または洞察に満ちた素晴らしいことを私が告げることができるからそこにある。

とにかく、この問題の解決策は、ビューを再インスタンス化する(これを行うこともできます)か、ビューを完全に破棄して、データがリスナーを変更する前に同じ位置に新しいものを生成することですヒットする。そのたびに、新しいテーブルが使用され始めます。

いずれかの方法で考えや提案をいただければ幸いですので、私は、これを行うにはどのようには考えています。

よろしく、

グレン(は実際には誰がどのように良いだろうバグを防ぐために知っている場合)は、x

答えて

1

理由だけではなく、テーブルを配置し、それを再作成しませんか?全体の視界を再開することよりも面倒でなければならない。やバグを回避するためには、列を配置する前にOwnerDrawLabelProviderを置き換えるために、ダミーのラベル・プロバイダーを設定しようとすることができます。

+0

私はテーブルを処分する方法を考え出すことができませんでした。ビューア作成時にビューアが親に登録されるので、私はあなたができるとは確信していません。 – Link19

+1

は、あなたが 'createPartControl(コンポジット親)'とあなたの表(ビューア)(すなわち、新しい複合体は、あなたのテーブルの親となります)で取得親の間 'Composite'を作成します。次に、テーブルを破棄し、コンポジットの子としてas newを作成します。 – p12t

関連する問題