Java JTree расширяет только узлы первого уровня

С JTree, предполагая, что корневой узел имеет уровень 0 и может быть до 5 уровней ниже корня, как я могу легко расширить все узлы уровня 1, чтобы все ветви и листья уровня 1 и 2 были видны, но уровни 3 и ниже нет?


person garyLynch    schedule 04.02.2009    source источник


Ответы (5)


Спасибо за быстрый ответ, ребята. Однако теперь я нашел простое решение, которое искал. По какой-то причине я просто не мог видеть DefaultMutableTreeNode.getLevel() в JavaDocs! К вашему сведению, что я делаю сейчас:

DefaultMutableTreeNode currentNode = treeTop.getNextNode();
do {
    if (currentNode.getLevel() == 1) 
        myTree.expandPath(new TreePath(currentNode.getPath()));
    currentNode = currentNode.getNextNode();
} while (currentNode != null);
person garyLynch    schedule 04.02.2009
comment
Это тоже хорошее решение: +1. Вы можете принять свое собственное решение, если хотите (и поставить его вверху ответов), но знайте, что вы не получите ни одного очка репутации. - person VonC; 04.02.2009

У вас есть несколько служебных классов Tree, которые делают именно это:

Например, этот:

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


}

По сути, вам нужно исследовать подузлы до тех пор, пока ваши критерии (здесь уровень глубины) не будут выполнены, и расширять все узлы до этой точки.

person VonC    schedule 04.02.2009

Поскольку все ваши узлы уровня 1 являются дочерними элементами корневого узла, и при условии, что вы используете DefaultMutableTreeNode (необходимый для вызова getPath()), вы можете просто перебирать дочерние элементы корневого узла следующим образом:

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

Следующие работы для детей первого уровня. Чтобы развернуть ВСЕ дочерние элементы, замените .children() на .breadthFirstEnumeration().

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();
    }
}
person Community    schedule 04.02.2009
comment
ВНИМАНИЕ! children() вы получаете только один уровень детей. Вам нужно breadthFirstEnumeration(). Тогда это работает. - person java.is.for.desktop; 04.04.2010

Используйте expand(TreePath) для всех узлов уровня 2.

person Bombe    schedule 04.02.2009
comment
да, очевидно, но как мне перебрать все узлы, зная, какие из них относятся к уровню 2? - person garyLynch; 04.02.2009
comment
Вы можете сделать это так, как вы это уже делали, но у вас уже должна быть информация в вашей модели данных. - person Bombe; 04.02.2009