13

我有一个JTree和一个awt.Canvas。当我从 中选择多个对象时CanvasobjList我希望所有选定的项目都显示在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; 
}

在我当前的状态下,如果我选择一个对象,它将被选中JTreeTreePath显示。但是,如果entities选择了超过 1 个对象,它将不显示任何内容,myJTree将保持不变。

4

1 回答 1

19

您正在寻找TreeSelectionModelJTree(使用吸气剂)。用于TreeSelectionModel#setSelectionPaths多个路径。现在您只设置一个因您的tree.setSelectionPath(tpath);呼叫而选择的节点。TreeSelectionModel还具有添加/删除现有选择的方法,...(基本上是您将来可能需要的一切)。

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

于 2012-04-20T09:15:39.473 回答