Java JTree 仅扩展一级节点

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 级? 您可以按照您已经完成的方式进行操作,但您的数据模型中应该已经有了这些信息。

以上是关于Java JTree 仅扩展一级节点的主要内容,如果未能解决你的问题,请参考以下文章

Java — JTree and JTable

Java:如何以编程方式选择和扩展 JTree 中的多个节点?

java如何实现二级树形菜单动态显示。要求加载页面时显示一级,点击一级菜单再去数据库查找出二级菜单

仅使用 Jsoup 从子节点中选择?

JAVA 得到jtree 某节点下的子节点

Linux 上如何仅获取一级子目录的大小?