TITLE:JTreeのノードを展開・折り畳み

Posted by at 2007-05-07

JTreeのノードを展開・折り畳み

JTreeのすべてのノードに対して、展開、折り畳みを行います。

ExpandAllNodes.png

サンプルコード

//@see http://www.rgagnon.com/javadetails/java-0210.html
//Expand or collapse a JTree - Real's Java How-to
private void expandAll(JTree tree) {
  int row = 0;
  while(row<tree.getRowCount()) {
    tree.expandRow(row);
    row++;
  }
}
private void collapseAll(JTree tree) {
  int row = tree.getRowCount()-1;
  while(row>=0) {
    tree.collapseRow(row);
    row--;
  }
}
View in GitHub: Java, Kotlin
private void visitAll(JTree tree, TreePath parent, boolean expand) {
  TreeNode node = (TreeNode)parent.getLastPathComponent();
  if(!node.isLeaf() && node.getChildCount()>=0) {
    Enumeration e = node.children();
    while(e.hasMoreElements()) {
      TreeNode n = (TreeNode)e.nextElement();
      TreePath path = parent.pathByAddingChild(n);
      visitAll(tree, path, expand);
    }
  }
  if(expand) tree.expandPath(parent);
  else       tree.collapsePath(parent);
}

解説

  • expandAll(A)
    • JTreeをリストとみなしてexpandAllでは先頭から順番にJTree#expandRow(int)メソッドを実行しています。
    • ループは全展開された時のJTreeの行インデックス数だけ繰り返されます。
  • collapseAll(A)
    • 末尾から順番にJTree#collapseRow(int)メソッドを実行し、見かけ上すべてのノードを折り畳みます。
    • 子ノードは展開されているが、親ノードが折り畳まれている場合、その子ノードは折り畳まれません。
  • expandAll(B), collapseAll(B)
    • visitAll(tree, new TreePath(root), true);
    • visitAll(tree, new TreePath(root), false);
    • 再帰的にTreePathを辿って、JTree#expandPath(TreePath)JTree#pacollapsePath(TreePath)メソッドを実行することで、展開、折り畳みを行っています。

参考リンク

コメント

  • 解説のラベルABが、ソースとは逆になっていたのを修正しました。 -- aterai