概要

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

サンプルコード

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--;
  }
}

private void visitAll(JTree tree, TreePath parent, boolean expand) {
  TreeNode node = (TreeNode) parent.getLastPathComponent();
  // children(node).forEach(n -> visitAll(tree, parent.pathByAddingChild(n), expand));
  if (!node.isLeaf()) {
    // Java 9: Enumeration<TreeNode> e = node.children();
    Enumeration<?> e = node.children();
    while (e.hasMoreElements()) {
      visitAll(tree, parent.pathByAddingChild(e.nextElement()), expand);
    }
  }
  if (expand) {
    tree.expandPath(parent);
  } else {
    tree.collapsePath(parent);
  }
}

// private static Stream<TreeNode> children(TreeNode node) {
//   // Java 9:
//   // return Collections.list(node.children()).stream();
//   // Java 8:
//   return Collections.list((Enumeration<?>) node.children())
//     .stream().filter(TreeNode.class::isInstance).map(TreeNode.class::cast);
// }
View in GitHub: Java, Kotlin

解説

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

参考リンク

コメント