Java:如何以编程方式选择和扩展 JTree 中的多个节点?
Posted
技术标签:
【中文标题】Java:如何以编程方式选择和扩展 JTree 中的多个节点?【英文标题】:Java: How to programmatically select and expand multiple nodes in a JTree? 【发布时间】:2012-05-01 20:12:57 【问题描述】:我有一个JTree
和一个awt.Canvas
。当我从Canvas
中选择多个对象到objList
中时,我希望所有选定的项目都显示在JTree
中。这意味着例如,如果我选择了 2 个对象,则它们到根的路径都应该扩展,并且每个选定的对象都应该选择其对应的 TreeNode
。我的 JTree 有 TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION
。
这是我使用的扩展函数的示例:
public void selectTreeNodes()
HashMap <String, MyEntity> entities = ...;
Iterator it = entities.keySet().iterator();
while (it.hasNext())
String str = it.next().toString();
MyEntity ent = entities.get(str);
if (ent.isSelected())
DefaultMutableTreeNode searchNode = searchNode(ent.getName());
if (searchNode != null)
TreeNode[] nodes = ((DefaultTreeModel) tree.getModel()).getPathToRoot(searchNode);
TreePath tpath = new TreePath(nodes);
tree.scrollPathToVisible(tpath);
tree.setSelectionPath(tpath);
public DefaultMutableTreeNode searchNode(String nodeStr)
DefaultMutableTreeNode node = null;
Enumeration enumeration= root.breadthFirstEnumeration();
while(enumeration.hasMoreElements())
node = (DefaultMutableTreeNode)enumeration.nextElement();
if(nodeStr.equals(node.getUserObject().toString()))
return node;
//tree node with string node found return null
return null;
在我当前的状态下,如果我选择一个对象,它将在JTree
中被选中,并显示它的TreePath
。
但如果entities
选择了多个对象,则不会显示任何内容,我的JTree
将保持不变。
【问题讨论】:
“我有一个JTree
和一个 awt.Canvas
。” 不要将 Swing 与 AWT 组件混合使用。 Canvas
应该是 JPanel
或在 JLabel
中显示的图像。
我知道我通常不应该这样做(我在画布后面展开的主菜单有一些问题),但在这种情况下,它们之间的唯一联系是画布中的实体数组在树中表示。而且在 GUI 中它们之间有一些空间,所以不会造成任何伤害/
【参考方案1】:
您正在寻找JTree
的TreeSelectionModel
(使用getter)。对多个路径使用TreeSelectionModel#setSelectionPaths
。现在,由于您的 tree.setSelectionPath(tpath);
调用,您只设置了一个选定的节点。 TreeSelectionModel
还具有添加/删除现有选择的方法,...(基本上是您将来可能需要的一切)。
一个有趣的扩展方法是JTree#setExpandsSelectedPaths
方法,它允许将JTree
配置为自动扩展选定的路径。如果要手动管理,可以使用JTree#setExpandedState
方法
【讨论】:
谢谢。我被困在这几个月了。以上是关于Java:如何以编程方式选择和扩展 JTree 中的多个节点?的主要内容,如果未能解决你的问题,请参考以下文章