【问题标题】:Java JTree expand only level one nodesJava JTree 仅扩展一级节点
【发布时间】:2010-10-05 08:48:39
【问题描述】:

使用 JTree,假设根节点为 0 级,并且在根之下最多可能有 5 级,我怎样才能轻松扩展所有 1 级节点,以便所有 1 级和 2 级分支和叶子都可见但级别3及以下不是吗?

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    感谢各位快速回复。但是,我现在找到了我正在寻找的简单解决方案。出于某种原因,我在 JavaDocs 中看不到 DefaultMutableTreeNode.getLevel() !仅供参考,我现在正在做的是:

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

    【讨论】:

    • 这也是一个很好的解决方案:+1。如果您愿意,您可以接受自己的解决方案(并将其放在答案的顶部),但要知道您不会获得任何代表点。
    【解决方案2】:

    以下适用于一级儿童。 要扩展所有子级,请将 .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();
        }
    }
    

    【讨论】:

    • 警告! children() 只给你一个级别的孩子。你需要breadthFirstEnumeration()。然后就可以了。
    【解决方案3】:

    由于您的 1 级节点都是根节点的子节点,并且假设您使用的是 DefaultMutableTreeNode(需要调用 getPath()),您可以像这样遍历根节点的子节点:

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

    【讨论】:

      【解决方案4】:

      您有一些 Tree 实用程序类可以做到这一点:

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

      基本上,您需要探索子节点,直到满足您的条件(此处为深度级别),然后展开所有节点直到该点。

      【讨论】:

        【解决方案5】:

        对所有 2 级节点使用 expand(TreePath)

        【讨论】:

        • 显然是的,但是我如何遍历所有节点,知道哪些节点是第 2 级?
        • 您可以按照您已经完成的方式进行操作,但您的数据模型中应该已经有了这些信息。
        猜你喜欢
        • 2017-12-31
        • 2011-08-20
        • 2015-10-23
        • 2012-05-18
        • 2010-11-16
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多