Pregunta

Estoy tratando de salvar JFace estado expansión TreeViewer para refrescar después de llamar al método setInput(). Probé getExpandedElements, setExpandedElements, getExpandedTreePaths, métodos de setExpandedTreePaths TreeViewer pero no funciona.

Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
¿Fue útil?

Solución

Se necesita para asegurarse de que el proveedor de contenido de su TreeViewer proporciona objetos que tienen su hashCode y métodos equals definidas correctamente. AbstractTreeViewer necesidades para poder comparar los viejos y nuevos objetos para determinar su estado de expansión. Si no se proporcionan hashCode y equals, es una verificación de referencia simple, que no va a funcionar si ha recreado sus contenidos.

Otros consejos

Como se mencionó en este hilo , toma un vistazo a la tarde ResourceNavigator , desde el org.eclipse.ui.views.navigator paquete.
( "Tarde", porque esa clase ya no se utiliza directamente, consulte la Eclipse Wiki ).

text alt (como se ve en la Eclipse Java Modelo )

  

Se utiliza un TreeViewer, y guarda los elementos expandidos y elementos seleccionados, entre otro estado.
  Los elementos del modelo son objetos IResource, que se conservan usando el mecanismo IPersistableElement / IElementFactory.
  El adaptador IPersistableElement se ha registrado en contra de IResource WorkbenchAdapter clase, pero esta vez se podría obtener por el elemento de modelo de implementación de IPersistableElement directamente.
  El IElementFactory correspondiente se declara en una extensión elementFactory en org.eclipse.ui.ide de plugin.xml.

     

Los recursos restaurados saben cómo conseguir sus propios niños (y los padres), a través de proveedor de contenidos del árbol, por lo que no todos los elementos de la necesidad árbol para persistir.

     

Un enfoque similar podría ser usado para guardar los recursos de entrada del espectador.
  Para ResourceNavigator, hay un nivel de indirección aquí a través del marco actual de su FrameList, pero si paso a través de él en el depurador, verá que está haciendo esencialmente la misma cosa.


extraer pequeñas (pero el resto del código guardar también muchas otras cosas, incluyendo la selección)

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());
            }
        }
    }
    [...]
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top