Java JTree expand only level one nodes

26,065

Solution 1

Thanks for the quick response guys. However I have now found the simple solution I was looking for. For some reason I just couldn't see DefaultMutableTreeNode.getLevel() in the JavaDocs! FYI what I'm doing now is:

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

Solution 2

You have some Tree utility classes out there which do precisely that:

Like this one:

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);
      }
   }


}

Basically, you need to explore the sub-nodes until your criteria (here the depth level) is met, and expand all nodes until that point.

Solution 3

As your level 1 nodes are all children of the root node, and assuming that you are using DefaultMutableTreeNode (needed for the call to getPath()), you can just iterate over the root node's children like so:

Enumeration<?> topLevelNodes
    = ((TreeNode)tree.getModel().getRoot()).children();
while(topLevelNodes.hasMoreElements()) {
    DefaultMutableTreeNode node
        = (DefaultMutableTreeNode)topLevelNodes.nextElement();
    tree.expandPath(new TreePath(node.getPath()));
}
Share:
26,065
garyLynch
Author by

garyLynch

am a software developer using mostly c#, Java, PHP and CQCS (anyone else ever heard of that one?!)

Updated on July 05, 2022

Comments

  • garyLynch
    garyLynch almost 2 years

    With a JTree, assuming the root node is level 0 and there may be up to 5 levels below the root, how can I easily expand all the level 1 nodes so that all level 1 & 2 branches and leafs are visible but levels 3 and below aren't?

  • garyLynch
    garyLynch over 15 years
    yes obviously, but how would I iterate through all the nodes knowing which ones are level 2?
  • VonC
    VonC over 15 years
    That is a good solution too: +1. You can accept your own solution if you want (and put it at the top of the answers), but know that you will not gain any rep point.
  • Bombe
    Bombe over 15 years
    You can do it the way you’ve already done it but you should already have the information in your data model.