Domanda

Sto cercando di salvare JFace stato espansione TreeViewer per aggiornarlo dopo aver chiamato il metodo setInput(). Ho provato getExpandedElements, setExpandedElements, getExpandedTreePaths, metodi setExpandedTreePaths di TreeViewer, ma non funziona.

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
È stato utile?

Soluzione

È necessario fare in modo che i contenuti del tuo fornitore di TreeViewer fornisce oggetti che hanno la loro hashCode e metodi equals definite correttamente. AbstractTreeViewer deve essere in grado di confrontare i vecchi e nuovi oggetti per determinare il loro stato di dilatazione. Se hashCode e equals non sono forniti, si tratta di un semplice controllo di riferimento, che non funziona se hai ricreato i contenuti.

Altri suggerimenti

Come menzionato in questa discussione , prendere uno sguardo alla fine del ResourceNavigator , dal pacchetto org.eclipse.ui.views.navigator.
( "In ritardo", perché quella classe non è più utilizzato direttamente, vedere la Eclipse Wiki ).

alt text (come si vede nel eclipse Java Modello )

  

Si utilizza un TreeViewer, e salva gli elementi espansi e gli elementi selezionati, tra gli altri stati.
  Gli elementi del modello sono oggetti IResource, che vengono mantenuti utilizzando il meccanismo IPersistableElement / IElementFactory.
  L'adattatore IPersistableElement è registrato contro IResource in classe WorkbenchAdapter, ma questo potrebbe invece essere ottenuto l'elemento del modello attuazione direttamente IPersistableElement.
  Il IElementFactory corrispondente è dichiarata in un'estensione elementFactory in org.eclipse.ui.ide di plugin.xml.

     

Le risorse restaurati sanno come ottenere i propri figli (e genitori), fornitore di contenuti tramite l'albero, quindi non hanno bisogno di essere persistente tutti gli elementi della struttura.

     

Un approccio simile potrebbe essere utilizzato per il salvataggio delle risorse di ingresso dello spettatore.
  Per ResourceNavigator, c'è un livello di indirezione qui attraverso il frame corrente del suo FrameList, ma se fate un passo attraverso di essa nel debugger, vedrai che è essenzialmente facendo la stessa cosa.


Piccolo estratto (ma il resto del codice di risparmiare anche molte altre cose, tra cui la selezione)

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());
            }
        }
    }
    [...]
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top