Frage

Ich versuche, JFace TreeViewer Expansion Zustand zu aktualisieren es nach dem Aufruf setInput() Methode zu speichern. Ich habe versucht, getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePaths Methoden des TreeViewer aber es funktioniert nicht.

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
War es hilfreich?

Lösung

Sie müssen sicherstellen, dass Ihre TreeViewer des Content-Provider-Objekte bereitstellt, die ihre hashCode und equals Methoden richtig definiert haben. AbstractTreeViewer Bedürfnisse der Lage sein, die alten und neuen Objekte zu vergleichen, um ihre Expansion Zustand zu bestimmen. Wenn hashCode und equals nicht vorgesehen sind, ist es eine einfache Referenzprüfung, die nicht funktionieren, wenn Sie Ihre Inhalte neu erstellt haben.

Andere Tipps

Wie bereits erwähnt in dieses Thema nehmen ein Blick auf die späte ResourceNavigator , von dem org.eclipse.ui.views.navigator Paket.
( "Late", weil diese Klasse nicht mehr verwendet werden direkt finden Sie in der Eclipse-Wiki ).

alt text (wie in der eclipse Java Modell )

  

Es verwendet eine TreeViewer und speichert die erweiterten Elemente und ausgewählte Elemente, unter anderem Zustand.
  Die Modellelemente sind IResource Objekte, die den IPersistableElement / IElementFactory Mechanismus beibehalten verwenden.
  Der IPersistableElement Adapter wird gegen IResource in Klasse WorkbenchAdapter registriert, aber diese stattdessen durch das Modellelement erhalten werden kann Umsetzung IPersistableElement direkt.
  Der entsprechende IElementFactory in einer elementFactory Erweiterung in org.eclipse.ui.ide des plugin.xml erklärt.

     

Die restaurierten Ressourcen wissen, wie ihre eigenen Kinder zu bekommen (und Eltern), über den Content-Provider-Baum, so dass nicht alle Elemente der Baum Notwendigkeit bestanden werden.

     

Ein ähnlicher Ansatz könnte für das Speichern des Betrachters Eingang Ressource verwendet werden.
  Für ResourceNavigator, gibt es eine Dereferenzierungsebene hier durch aktuelles Rahmens seiner FrameList, aber wenn man durch sie im Debugger Schritt, werden Sie sehen, dass es die gleiche Sache im Wesentlichen tut.


Kleine Extrakt (aber der Rest des Codes speichern auch viele andere Dinge, einschließlich der Auswahl)

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());
            }
        }
    }
    [...]
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top