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

Posted by at 2007-05-07

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

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

  • &jnlp;
  • &jar;
  • &zip;
ExpandAllNodes.png

サンプルコード

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)メソッドを実行することで、展開、折り畳みを行っています。

参考リンク

コメント

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