質問

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のコンテンツプロバイダーが適切に定義された彼らのhashCodeequalsメソッドを持つオブジェクトを提供することを確認する必要があります。 AbstractTreeViewerは、その拡張状態を決定するために古いものと新しいオブジェクトを比較できるようにする必要があります。 hashCodeequalsが提供されていない場合、それは単純な参照チェック、うではない仕事、あなたの内容を再作成した場合。

です

他のヒント

で述べたように このスレッド, 、後半を見てください。 ResourceNavigator, 、 からorg.eclipse.ui.views.navigator パッケージ。
(そのクラスは直接使用されなくなったため、「遅い」と表示されます。 エクリプス Wiki).

alt text (で見られるように、 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());
            }
        }
    }
    [...]
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top