「Eclipse E4 アプリケーション プロジェクト」ウィザードを使用して 1 つのプラグインを作成し、E4 アプリケーションの 1 つの PartStack にパーツを提供するモデル フラグメントを使用して 2 つ目のプラグインを追加しました。
このために、私はhttp://www.vogella.com/articles/Eclipse4Modularity/article.htmlに従い ました: 元の Application.e4xmi で PartStack の ID を設定し、PartStack にパーツを追加する fragment.xmi を定義します。
初めて実行するとき、または新しいワークスペースで実行するとき(プログラム引数に「-clearPersistedState」を追加することによって) は、すべて正常に動作します。ただし、永続化された workbench.xmi を含む既存のワークスペースでアプリケーションを起動すると、次のエラー メッセージが表示されます。
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt".
java.lang.NullPointerException
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.showTab(LazyStackRenderer.java:156)
at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1024)
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:98)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:639)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:725)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$2(PartRenderingEngine.java:696)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$7.run(PartRenderingEngine.java:690)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:675)
LazyStackRenderer.java:156 へのデバッグは、getParent() 呼び出しが null を返すことを示します。
この問題は、永続化された workbench.xmi を再ロードしたことが原因のようです。このセクションには次のセクションが含まれています (XML の less-than などは削除されています)。
...children xsi:type="basic:PartStack" xmi:id="..." elementId="demo.app.mainstack" contributorURI="platform:/plugin/E4DemoApp" selectedElement="_MG5SoMbxEeGKj8gOLKAMgw"
....children xsi:type="basic:Part" xmi:id="_MG5SoMbxEeGKj8gOLKAMgw" elementId="demo.app.added_part" contributorURI="..." contributionURI="bundleclass://..." label="Added Part"
PartStack の「selectedElement」は、その単一の子エントリを指していることに注意してください。そのモデルが E4Application.loadApplicationModel() に読み込まれると、そこにある「theApp」は次のようになります。
Window->Perspective->...->PartStackImpl->PartImpl
PartImpl.eContainer は PartStackImpl を指しています。わかった。
PartStackImpl.selectedElement は、単一の囲まれた PartImpl を参照する必要があります。代わりに、正しい elementId、contributorURI、contributionURI を持つオブジェクトである別のPartImpl を参照しますが、eContainer の場合は null です。
したがって、永続化された workbench.xmi 要素は正常にロードされますが、selectedElement ポインターは実際のモデル要素の不完全なコピーを参照します。その後、LazyStackRenderer は、親 (eContainer) に null を持つ不完全な「selectedElement」コピーを使用し、NullPointerException をスローします。
これを修正する方法または回避する方法はありますか? これは、RCP および RAP 用の Eclipse 4.2 用です。