Java:如何以编程方式选择和扩展JTree中的多个节点?

我有一个JTree和一个awt.Canvas 。 当我从Canvas选择多个对象到objList ,我希望所有选定的项目都在JTree为选中状态。 这意味着,例如,如果我选择了2个对象,则应扩展其到root的路径,并且每个所选对象也应选择其对应的TreeNode 。 我的JTree有TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION

这是我使用的扩展function的示例:

 public void selectTreeNodes() { HashMap  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将保持不变。

您正在寻找JTreeTreeSelectionModel (使用getter)。 将TreeSelectionModel#setSelectionPaths用于多个路径。 现在,由于tree.setSelectionPath(tpath);您只设置了一个节点tree.setSelectionPath(tpath); 呼叫。 TreeSelectionModel还具有添加/删除现有选择的方法,…(基本上您将来可能需要的所有内容)。

一种有趣的扩展方法是JTree#setExpandsSelectedPaths方法,该方法允许配置JTree以自动扩展所选路径。 如果要手动管理,可以使用JTree#setExpandedState方法