使用 JTree,假设根节点为 0 级,并且根节点下方最多可能有 5 级,我如何轻松扩展所有 1 级节点,以便所有 1 级和 2 级分支和叶子都可见,但 3 级及以下不是吗?
garyLynch
问问题
26072 次
5 回答
21
感谢你们的快速反应。但是,我现在找到了我正在寻找的简单解决方案。出于某种原因,我在 JavaDocs 中看不到 DefaultMutableTreeNode.getLevel() !仅供参考,我现在正在做的是:
DefaultMutableTreeNode currentNode = treeTop.getNextNode();
do {
if (currentNode.getLevel() == 1)
myTree.expandPath(new TreePath(currentNode.getPath()));
currentNode = currentNode.getNextNode();
} while (currentNode != null);
于 2009-02-04T09:46:42.750 回答
3
您有一些 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);
}
}
}
基本上,您需要探索子节点,直到满足您的标准(此处为深度级别),然后展开所有节点直到该点。
于 2009-02-04T09:38:01.847 回答
1
以下适用于第一级儿童。要扩展所有子级,请将 .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();
}
}
于 2009-02-04T09:54:39.863 回答
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()));
}
于 2012-07-02T10:05:42.627 回答
0
对所有 2 级节点使用expand(TreePath)。
于 2009-02-04T09:19:01.603 回答