Java: как программно выбрать и развернуть несколько узлов в JTree?

у меня есть 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; 
}

In мое текущее состояние, если я выберу один объект, он будет выбран в JTree и TreePath будет показано. Но если ... --10--> имеет более 1 выбранного объекта, он ничего не будет отображать, мой JTree останется без изменений.

1 ответов


вы ищете TreeSelectionModel на JTree (использовать геттер). Используйте TreeSelectionModel#setSelectionPaths на несколько путей. Теперь вы устанавливаете только один узел, выбранный из-за вашего tree.setSelectionPath(tpath); звонок. The TreeSelectionModel также есть методы для добавления/удаления в существующий выбор... (в основном все, что вам может понадобиться в будущем).

интересным методом расширения является JTree#setExpandsSelectedPaths метод, который позволяет настроить JTree для автоматического расширения выбранного пути. Если вы хотите управлять этим вручную, вы можете использовать JTree#setExpandedState метод