我有一个 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 将保持不变。

最佳答案

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

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

关于Java:如何以编程方式选择和展开 JTree 中的多个节点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10242896/

10-12 18:19