Question

Je suis en train de sauver JFace état d'extension TreeViewer pour le rafraîchir après avoir appelé méthode setInput(). J'ai essayé getExpandedElements, setExpandedElements, getExpandedTreePaths, les méthodes de setExpandedTreePaths de TreeViewer mais il ne fonctionne pas.

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
Était-ce utile?

La solution

Vous devez vous assurer que votre fournisseur de contenu de TreeViewer fournit des objets qui ont leurs méthodes hashCode et equals correctement définies. AbstractTreeViewer doit être en mesure de comparer les anciens et les nouveaux objets pour déterminer leur état d'expansion. Si hashCode et equals ne sont pas fournis, il est une simple vérification de référence, qui ne fonctionnera pas si vous avez recréé votre contenu.

Autres conseils

Comme mentionné dans ce fil , prendre un coup d'oeil à la fin ResourceNavigator , du paquet org.eclipse.ui.views.navigator.
( "Fin", car cette classe est plus directement utilisé, voir le Eclipse Wiki ).

text alt (comme on le voit dans la Java eclipse modèle )

  

Il utilise un TreeViewer, et enregistre les éléments développés et éléments sélectionnés, entre autre Etat.
  Les éléments de modèle sont des objets, qui sont IResource persistaient à l'aide du mécanisme de IPersistableElement / IElementFactory.
  L'adaptateur IPersistableElement est enregistré contre IResource en classe WorkbenchAdapter, mais cela pourrait plutôt être obtenue par l'élément de modèle directement la mise en œuvre IPersistableElement.
  Le IElementFactory correspondant est déclaré dans une extension elementFactory dans le org.eclipse.ui.ide de plugin.xml.

     

Les ressources restaurées savent comment obtenir leurs propres enfants (et parents), par l'intermédiaire du fournisseur de contenu de l'arbre, de sorte que tous les éléments de l'arbre doivent être persisté.

     

Une approche similaire pourrait être utilisée pour sauver la ressource d'entrée du spectateur.
  Pour ResourceNavigator, il y a un niveau d'indirection ici à travers le cadre actuel de son FrameList, mais si vous franchissez dans le débogueur, vous verrez que ça fait essentiellement la même chose.


Petit extrait (mais le reste du code permettent également d'économiser beaucoup d'autres choses, y compris la sélection)

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());
            }
        }
    }
    [...]
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top