simple seleccionar nodo icon example java swing jtree

seleccionar - simple jtree example in java



Java JTree expande solo nodos de nivel uno (5)

Con JTree, suponiendo que el nodo raíz es nivel 0 y puede haber hasta 5 niveles debajo de la raíz, ¿cómo puedo expandir fácilmente todos los nodos de nivel 1 para que todas las ramas y hojas de nivel 1 y 2 sean visibles pero niveles 3 y siguientes? no?


Esto debería funcionar -

import javax.swing.*; import javax.swing.tree.*; import java.awt.BorderLayout; import java.awt.event.*; import java.util.*; public class Tree { public static void main(String[] args) { JPanel panel = new JPanel(new BorderLayout()); final JTree tree = new JTree(); panel.add(new JScrollPane(tree)); JButton btn = new JButton("Press Me"); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { for (Enumeration e = ((TreeNode)tree.getModel().getRoot()).children();e.hasMoreElements();) { TreeNode tn = (TreeNode)e.nextElement(); tree.expandPath(new TreePath(((DefaultTreeModel)tree.getModel()).getPathToRoot(tn))); } } }); panel.add(btn, BorderLayout.SOUTH); JFrame frame = new JFrame(""); frame.getContentPane().add(panel); frame.setSize(300, 300); frame.setLocation(100, 100); frame.pack(); frame.show(); } }


Tienes algunas clases de utilidad Tree que hacen precisamente eso:

Como este :

public class SimpleNavigatorTreeUtil { /** * Expands/Collapse specified tree to a certain level. * * @param tree jtree to expand to a certain level * @param level the level of expansion */ public static void expandOrCollapsToLevel(JTree tree, TreePath treePath,int level,boolean expand) { try { expandOrCollapsePath(tree,treePath,level,0,expand); }catch(Exception e) { e.printStackTrace(); //do nothing } } public static void expandOrCollapsePath (JTree tree,TreePath treePath,int level,int currentLevel,boolean expand) { // System.err.println("Exp level "+currentLevel+", exp="+expand); if (expand && level<=currentLevel && level>0) return; TreeNode treeNode = ( TreeNode ) treePath.getLastPathComponent(); TreeModel treeModel=tree.getModel(); if ( treeModel.getChildCount(treeNode) >= 0 ) { for ( int i = 0; i < treeModel.getChildCount(treeNode); i++ ) { TreeNode n = ( TreeNode )treeModel.getChild(treeNode, i); TreePath path = treePath.pathByAddingChild( n ); expandOrCollapsePath(tree,path,level,currentLevel+1,expand); } if (!expand && currentLevel<level) return; } if (expand) { tree.expandPath( treePath ); // System.err.println("Path expanded at level "+currentLevel+"-"+treePath); } else { tree.collapsePath(treePath); // System.err.println("Path collapsed at level "+currentLevel+"-"+treePath); } } }

Básicamente, debe explorar los subnodos hasta que se cumplan sus criterios (en este caso, el nivel de profundidad) y expandir todos los nodos hasta ese punto.



Gracias por la respuesta rápida. Sin embargo, ahora he encontrado la solución simple que estaba buscando. Por alguna razón, simplemente no pude ver DefaultMutableTreeNode.getLevel () en los JavaDocs. Para tu información, lo que estoy haciendo ahora es:

DefaultMutableTreeNode currentNode = treeTop.getNextNode(); do { if (currentNode.getLevel()==1) myTree.expandPath(new TreePath(currentNode.getPath())); currentNode = currentNode.getNextNode(); } while (currentNode != null);


Como sus nodos de nivel 1 son todos DefaultMutableTreeNode nodo raíz, y suponiendo que está utilizando DefaultMutableTreeNode (necesario para la llamada a getPath() ), puede iterar sobre los elementos getPath() del nodo raíz de la siguiente manera:

Enumeration<?> topLevelNodes = ((TreeNode)tree.getModel().getRoot()).children(); while(topLevelNodes.hasMoreElements()) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)topLevelNodes.nextElement(); tree.expandPath(new TreePath(node.getPath())); }