JTreeのノードを展開すると他の兄弟ノードをすべて折り畳むよう設定する
Total: 2862
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTree
の第一階層にあるノードを展開すると、他の兄弟ノードをすべて折り畳むよう設定し、展開できるノードを一つに限定します。
Screenshot
Advertisement
サンプルコード
JTree tree = new JTree(makeModel());
tree.setRootVisible(false);
tree.addTreeWillExpandListener(new TreeWillExpandListener() {
private boolean isAdjusting;
@Override public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException {
if (isAdjusting) {
return;
}
isAdjusting = true;
collapseFirstHierarchy(tree);
tree.setSelectionPath(e.getPath());
isAdjusting = false;
}
@Override public void treeWillCollapse(TreeExpansionEvent e) throws ExpandVetoException {
// throw new ExpandVetoException(e, "Tree collapse cancelled");
}
});
// ...
public static void collapseFirstHierarchy(JTree tree) {
TreeModel model = tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
Enumeration e = root.breadthFirstEnumeration();
while (e.hasMoreElements()) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
boolean isOverFirstLevel = node.getLevel() > 1;
if (isOverFirstLevel) { // Collapse only nodes in the first hierarchy
return;
} else if (node.isLeaf() || node.isRoot()) {
continue;
}
tree.collapsePath(new TreePath(node.getPath()));
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTree
にTreeWillExpandListener
を設定し、TreeWillExpandListener#treeWillExpand(...)
をオーバーライドして、ノードを展開する前にすべての兄弟ノードを一旦折り畳み、これから展開するノードに選択状態を戻すことで、展開可能なノードを一つに限定しています。
- 第
1
階層のノードのみを対象にしているため、ルートノードや、第2
階層以下のノードの展開、折り畳みには影響しない- ノードの階層には
DefaultMutableTreeNode#getLevel()
で取得した値を使用してルートノードを第0
階層としている - JTreeでノード階層の深さを取得する
- ノードの階層には