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

2022-09-04 02:02:55

我有一个和一个.当我从中选择多个对象时,我希望所有选定的项目都显示在所选内容中。这意味着,例如,如果我选择了2个对象,则它们到root的路径都应该展开,并且每个选定的对象都应该选择其相应的对象。我的JTree有.JTreeawt.CanvasCanvasobjListJTreeTreeNodeTreeSelectionModel.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; 
}

在我目前的状态下,如果我选择单个对象,它将在 中选择,并且将显示出来。但是如果选择了1个以上的对象,它将不显示任何内容,我的将保持不变。JTreeTreePathentitiesJTree


答案 1

你正在寻找的(使用 getter)。对多个路径使用 TreeSelectionModel#setSelectionPaths。现在,您只需设置由于调用而选择的一个节点。还具有向现有选择添加/删除,...(基本上是你将来可能需要的一切)。TreeSelectionModelJTreetree.setSelectionPath(tpath);TreeSelectionModel

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


答案 2

推荐