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
は変更されません。
TreeSelectionModel
のJTree
を探しています(ゲッターを使用してください)。複数のパスには _TreeSelectionModel#setSelectionPaths
_ を使用します。これで、tree.setSelectionPath(tpath);
呼び出しのために選択されたノードを1つだけ設定します。 TreeSelectionModel
には、既存の選択範囲に追加/削除するメソッドもあります...(基本的には将来必要になる可能性のあるすべてのもの)。
展開の興味深い方法は _JTree#setExpandsSelectedPaths
_ メソッドで、選択したパスを自動的に展開するようにJTree
を構成できます。これを手動で管理する場合は、 _JTree#setExpandedState
_ メソッドを使用できます。