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

Posted

技术标签:

【中文标题】Java:如何以编程方式选择和扩展 JTree 中的多个节点?【英文标题】:Java: How to programmatically select and expand multiple nodes in a JTree? 【发布时间】:2012-05-01 20:12:57 【问题描述】:

我有一个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 选择了多个对象,则不会显示任何内容,我的JTree 将保持不变。

【问题讨论】:

“我有一个 JTree 和一个 awt.Canvas。” 不要将 Swing 与 AWT 组件混合使用。 Canvas 应该是 JPanel 或在 JLabel 中显示的图像。 我知道我通常不应该这样做(我在画布后面展开的主菜单有一些问题),但在这种情况下,它们之间的唯一联系是画布中的实体数组在树中表示。而且在 GUI 中它们之间有一些空间,所以不会造成任何伤害/ 【参考方案1】:

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

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

【讨论】:

谢谢。我被困在这几个月了。

以上是关于Java:如何以编程方式选择和扩展 JTree 中的多个节点?的主要内容,如果未能解决你的问题,请参考以下文章

Java JTree 仅扩展一级节点

如何将复选框添加到 JTree 节点以管理多选?

设置新 TreeModel 时如何自动扩展 JTree?

如何以编程方式安装所有VSCode工作区扩展

java中jtree双击叶节点如何获取该文件所在的路径

java的JTree的使用方法,