我有JTree
和awt.Canvas
。当我从Canvas
中选择多个对象到objList
时,我希望所有选定的项目都显示在所选的JTree
内。这意味着,例如,如果我选择了2个对象,则应扩展其到root的路径,并且每个所选对象也应选择其对应的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
将保持不变。
答案 0 :(得分:16)
您正在寻找TreeSelectionModel
的{{1}}(使用getter)。将TreeSelectionModel#setSelectionPaths
用于多个路径。现在,由于您的JTree
调用,您只需设置一个节点。 tree.setSelectionPath(tpath);
还有添加/删除现有选择的方法,......(基本上是您将来可能需要的所有内容)。
一种有趣的扩展方法是JTree#setExpandsSelectedPaths
方法,它允许配置TreeSelectionModel
以自动扩展所选路径。如果您想手动管理,可以使用JTree#setExpandedState
方法