Pergunta

Estou tentando salvar jface TreeViewer Estado de expansão para atualizar depois de ligar setInput() método. eu tentei getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePaths métodos de TreeViewer Mas não funciona.

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

Solução

Você precisa garantir que o provedor de conteúdo do seu TreeViewer forneça objetos que tenham seus hashCode e equals métodos adequadamente definidos. AbstractTreeViewer precisa ser capaz de comparar os objetos antigos e novos para determinar seu estado de expansão. Se hashCode e equals Não são fornecidos, é uma verificação de referência simples, que não funcionará se você recriou seu conteúdo.

Outras dicas

Como mencionado em este tópico, dê uma olhada no final ResourceNavigator, deorg.eclipse.ui.views.navigator pacote.
("atrasado" porque essa classe não é mais usada diretamente, veja o Eclipse Wiki).

alt text (como visto no Modelo Java Eclipse)

Ele usa um TreeViewer, e salva os elementos expandidos e elementos selecionados, entre outros estados.
Os elementos do modelo são IResource objetos, que são persistidos usando o IPersistableElement/IElementFactory mecanismo.
o IPersistableElement O adaptador está registrado contra IResource em aula WorkbenchAdapter, mas isso poderia ser obtido pelo elemento do modelo implementando IPersistableElement diretamente.
O correspondente IElementFactory é declarado em um elementFactory extensão em org.eclipse.ui.ide's plugin.xml.

Os recursos restaurados sabem como obter seus próprios filhos (e pais), através do provedor de conteúdo da árvore; portanto, nem todos os elementos da árvore precisam ser persistidos.

Uma abordagem semelhante pode ser usada para salvar o recurso de entrada do espectador.
Por ResourceNavigator, há um nível de indireção aqui através de seu FrameListO quadro atual, mas se você pisar no depurador, verá que ele está fazendo a mesma coisa.


Extrato pequeno (mas o restante do código salva também muitas outras coisas, incluindo seleção)

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top