2009-02-04 105 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())); 
}