setInput() の前に TreeViewer の状態を保存する
-
21-09-2019 - |
質問
JFace を保存しようとしています TreeViewer
呼び出し後に展開状態を更新する setInput()
方法。私は試した getExpandedElements
, setExpandedElements
, getExpandedTreePaths
, setExpandedTreePaths
の方法 TreeViewer
しかし、それは機能しません。
Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
解決
あなたは必ずあなたのTreeViewerのコンテンツプロバイダーが適切に定義された彼らのhashCode
とequals
メソッドを持つオブジェクトを提供することを確認する必要があります。 AbstractTreeViewer
は、その拡張状態を決定するために古いものと新しいオブジェクトを比較できるようにする必要があります。 hashCode
とequals
が提供されていない場合、それは単純な参照チェック、うではない仕事、あなたの内容を再作成した場合。
他のヒント
で述べたように このスレッド, 、後半を見てください。 ResourceNavigator
, 、 からorg.eclipse.ui.views.navigator
パッケージ。
(そのクラスは直接使用されなくなったため、「遅い」と表示されます。 エクリプス Wiki).
(で見られるように、 Eclipse Java モデル)
それは、
TreeViewer
, 、展開された要素と選択された要素などの状態を保存します。
モデル要素は次のとおりです。IResource
オブジェクトは、IPersistableElement
/IElementFactory
機構。
のIPersistableElement
アダプターが登録されていますIResource
クラスでWorkbenchAdapter
, ですが、これは代わりにモデル要素を実装することで取得できます。IPersistableElement
直接。
対応しますIElementFactory
で宣言されていますelementFactory
の拡張子org.eclipse.ui.ide
さんのplugin.xml
.復元されたリソースは、ツリーのコンテンツ プロバイダーを介して独自の子 (および親) を取得する方法を知っているため、ツリーのすべての要素を永続化する必要はありません。
同様のアプローチを使用して、ビューアの入力リソースを保存することもできます。
のためにResourceNavigator
, 、ここには間接的なレベルがあります。FrameList
の現在のフレームですが、デバッガーでステップ実行すると、本質的に同じことを実行していることがわかります。
小さな抜粋 (ただし、コードの残りの部分では、選択など、他の多くのものも保存されます)
if (frameList.getCurrentIndex() > 0) {
//save frame, it's not the "home"/workspace frame
TreeFrame currentFrame = (TreeFrame) frameList.getCurrentFrame();
IMemento frameMemento = memento.createChild(TAG_CURRENT_FRAME);
currentFrame.saveState(frameMemento);
} else {
//save visible expanded elements
Object JavaDoc expandedElements[] = viewer.getVisibleExpandedElements();
if (expandedElements.length > 0) {
IMemento expandedMem = memento.createChild(TAG_EXPANDED);
for (int i = 0; i < expandedElements.length; i++) {
if (expandedElements[i] instanceof IResource) {
IMemento elementMem = expandedMem
.createChild(TAG_ELEMENT);
elementMem.putString(TAG_PATH,
((IResource) expandedElements[i]).getFullPath()
.toString());
}
}
}
[...]
}