10

TreeViewerメソッドを呼び出した後、JFace拡張状態を保存して更新しようとしていますsetInput()getExpandedElements、、、setExpandedElementsの方法を試しましたがgetExpandedTreePaths、機能しません。setExpandedTreePathsTreeViewer

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
4

2 に答える 2

9

hashCodeTreeViewerのコンテンツプロバイダーが、メソッドとequalsメソッドが適切に定義されたオブジェクトを提供していることを確認する必要があります。AbstractTreeViewer古いオブジェクトと新しいオブジェクトを比較して、それらの拡張状態を判断できる必要があります。hashCodeとが提供されていない場合equals、これは単純な参照チェックであり、コンテンツを再作成した場合は機能しません。

于 2009-10-16T20:09:07.137 に答える
3

このスレッドで述べたように、パッケージResourceNavigatorから、 後半を見てください。 (そのクラスは直接使用されなくなったため、「late」。EclipseWikiを参照してください)。org.eclipse.ui.views.navigator

代替テキスト( Eclipse Javaモデルに見られるように)

を使用しTreeViewer、展開された要素と選択された要素などの状態を保存します。
モデル要素はオブジェクトであり、 /メカニズムIResourceを使用して永続化されます。アダプタはクラスに登録されてい ますが、代わりに、モデル要素を直接実装することで取得できます。 対応するは、 'sの拡張子で宣言されています。IPersistableElementIElementFactory
IPersistableElementIResourceWorkbenchAdapterIPersistableElement
IElementFactoryelementFactoryorg.eclipse.ui.ideplugin.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());
            }
        }
    }
    [...]
 }
于 2009-10-16T12:19:01.867 に答える