我有一个 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
选择了 1 个以上的对象,它将不会显示任何内容,我的 JTree
将保持不变。 最佳答案
您正在寻找 TreeSelectionModel
的 JTree
(使用 getter)。对多个路径使用 TreeSelectionModel#setSelectionPaths
。现在,由于您的 tree.setSelectionPath(tpath);
调用,您只设置了一个选择的节点。 TreeSelectionModel
还具有添加/删除现有选择的方法,...(基本上是您将来可能需要的所有内容)。
一个有趣的扩展方法是 JTree#setExpandsSelectedPaths
方法,它允许配置 JTree
以自动扩展所选路径。如果要手动管理,可以使用 JTree#setExpandedState
方法
关于Java:如何以编程方式选择和展开 JTree 中的多个节点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10242896/