使用JTree,假设根节点为级别0,并且根节点最多可达5级,如何轻松扩展所有级别1节点以便所有级别1 & 2分支和叶子是可见的,但3级和以下不是?Java JTree仅扩展一级节点
11
A
回答
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
对所有2级节点使用expand(TreePath)。
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()));
}
相关问题
- 1. JTree扩大节点扩展的宽度
- 2. 未选择Jtree节点扩展
- 3. 扩展JTree的节点最小化GridBagLayout
- 4. 的Java Swing JTree的扩展
- 5. 扩展JTree渲染
- 6. 水平扩展JTree
- 7. 如何搜索jtree中的特定节点并使该节点扩展。
- 8. JTree的是显示应该是可扩展的叶子节点
- 9. JTree如何知道节点已扩展但未选中
- 10. 重写JTree双击以防止节点扩展?
- 11. JPersistentTree(JTree,boundtree)将路径扩展到给定节点
- 12. 将“扩展”按钮添加到没有子项的JTree节点?
- 13. Java:如何以编程方式选择并扩展JTree中的多个节点?
- 14. 仅在扩展节点时加载树节点
- 15. 与节点扩展
- 16. java swt jface TreeViewer从节点扩展
- 17. 如何让JTree扩展?
- 18. 让用户将节点添加到JTree,如果父节点已扩展,节点不会出现
- 19. Java JTree节点是一个可点击的URL链接
- 20. appendChild树节点不扩展
- 21. ExpandableListView不扩展子节点
- 22. ArangoDB FOXX节点扩展
- 23. 用于恢复状态的jtree的存储状态/扩展节点
- 24. 有没有更好的方法来测试JTree节点是否扩展?
- 25. 如何改变单一的JTree节点
- 26. 无法使用expandPath方法扩展JTree
- 27. 改变JTree的节点图标根据深度级别
- 28. 索引JTree的节点
- 29. JTree动态节点插入
- 30. 在JTree中获取节点
这也是一个很好的解决方案:+1。如果你愿意,你可以接受你自己的解决方案(并且把它放在答案的顶部),但是你知道你不会获得任何重复点。 – VonC 2009-02-04 09:52:15