2009-02-04 98 views
11

使用JTree,假设根节点为级别0,并且根节点最多可达5级,如何轻松扩展所有级别1节点以便所有级别1 & 2分支和叶子是可见的,但3级和以下不是?Java JTree仅扩展一级节点

回答

20

感谢您的快速回复家伙。不过,我现在已经找到了我正在寻找的简单解决方案。出于某种原因,我无法在JavaDocs中看到DefaultMutableTreeNode.getLevel()! FYI我现在正在做的是:

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

这也是一个很好的解决方案:+1。如果你愿意,你可以接受你自己的解决方案(并且把它放在答案的顶部),但是你知道你不会获得任何重复点。 – VonC 2009-02-04 09:52:15

0

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

+0

是很明显,但我怎么会知道通过哪些是2级的所有节点重复? – garyLynch 2009-02-04 09:23:31

+0

您可以按照您已经完成的方式来完成,但您应该已经拥有数据模型中的信息。 – Bombe 2009-02-04 09:56:35

3

你有一些树的实用工具类在那里它做的正是:

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


} 

基本上,你需要去探索的子节点,直到您的条件(这里的深度级别),并展开所有节点直到该点。

0

这应该工作 -

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

随着你的级别1节点是根节点的所有儿童,并假设你正在使用DefaultMutableTreeNode(需要调用getPath()),你可以只遍历根节点的孩子,像这样:

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