web-dev-qa-db-ja.com

Java:JTreeで複数のノードをプログラムで選択して拡張する方法は?

JTreeawt.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は変更されません。

11

TreeSelectionModelJTreeを探しています(ゲッターを使用してください)。複数のパスには _TreeSelectionModel#setSelectionPaths_ を使用します。これで、tree.setSelectionPath(tpath);呼び出しのために選択されたノードを1つだけ設定します。 TreeSelectionModelには、既存の選択範囲に追加/削除するメソッドもあります...(基本的には将来必要になる可能性のあるすべてのもの)。

展開の興味深い方法は _JTree#setExpandsSelectedPaths_ メソッドで、選択したパスを自動的に展開するようにJTreeを構成できます。これを手動で管理する場合は、 _JTree#setExpandedState_ メソッドを使用できます。

17
Robin