Manter estados de expansão de JTree[ RESOLVIDO ]

3 respostas
L

Galera, tentei aqui mas não estou conseguindo fazer isso que me parecia ser de certa forma fácil. Seguinte, tenho uma JTree onde tem alguns nodes e que quando eu fosse remontá-la( quando você remonta uma JTree ela perde todos os estados de expansão) eu conseguisse expandir os nodos que estavam expandidos e manter retraídos o que estavam assim.

O que fiz foi o seguinte, adicionei listener de expansion e collapse na jtree:

private HashMap expandedPaths = new HashMap();

private void init(){
   //(...)
       jtree.addTreeExpansionListener(new javax.swing.event.TreeExpansionListener() {
            public void treeCollapsed(javax.swing.event.TreeExpansionEvent evt) {
                jtreeTreeCollapsed(evt);
            }
            public void treeExpanded(javax.swing.event.TreeExpansionEvent evt) {
                jtreeTreeExpanded(evt);
            }
        });

}



private void jtreeTreeCollapsed(javax.swing.event.TreeExpansionEvent evt) {                                         
        expandedPaths.remove(evt.getPath().toString());
    }                                        

    private void jtreeTreeExpanded(javax.swing.event.TreeExpansionEvent evt) {                                        
        TreePath tp = evt.getPath();
        expandedPaths.put(tp.toString(), tp);
    }        

// E faço o seguinte para remontar os estados....
public void atualizarListaServidores() {
        Iterator it = expandedPaths.keySet().iterator();
            while(it.hasNext()){
                String tpString = (String)it.next();
                TreePath tp = (TreePath)expandedPaths.get(tpString);
               
                int row = jtree.getRowForPath(tp);
                jtree.expandRow(row);
            }
        it=null;
    }

O que acontece é que quando pego o row para o meu TreePath ele sempre me retorna -1. Alguém já conseguiu fazer isso??

Valeu pela ajuda…

3 Respostas

L

Hmmmmm…

UP! :!: :slight_smile:

L

Galera, não é possível. Tem algum bug nessa JTree???

Essas chamadas:

Enumeration exps = jtree.getExpandedDescendants(jtree.getPathForRow(0));
Enumeration exps = jtree.getExpandedDescendants(jtree.getModel().getRoot());

Retornam os meus TreePaths corretos que estão expandidos no momento corretamente, porém se eu der um jtree.expandPath(meuTpath) ele nunca expande. Se eu faço um loop pelo enumeration e faço int row = jtree.getRowForPath(meuTpath) ele sempre retorna o row como -1. Que diabo é isso?!

L

Bem, consegui resolver o meu problema.

public void atualizarListaServidores() {
        //Pega os descendentes a partir do nodo 0 ( Root )
        Enumeration exps = jtree.getExpandedDescendants(jtreeQware.getPathForRow(0));
        // montaJTreeNovamenteAtualizada();
        //Expande o nó raiz
        jtree.expandRow(0);
        while(exps.hasMoreElements()){
                TreePath tp = (TreePath)exps.nextElement();
                //If it is not a leaf
                if(tp.getLastPathComponent() != null && !jtree.getModel().isLeaf(tp.getLastPathComponent())){
                    TreePath novoPath = jtree.getNextMatch(tp.getLastPathComponent().toString(),0,Position.Bias.Forward );
                    jtreeQware.expandPath(novoPath);
                }
       }
    }

O porque que você tem que fazer um search dentro da JTree é porque a cada vez que eu estou montando a JTree os TreePath são novamente instanciados. Por essa razão não posso reutilizá-los, somente seus nomes. Para isso faço um getNextMatch(…) que me retorna o TreePath e mando expandí-lo.

Criado 24 de março de 2008
Ultima resposta 25 de mar. de 2008
Respostas 3
Participantes 1