概要

JTreeの選択されたノードまでのパスをすべて展開して可視状態にします。

サンプルコード

// tree.setExpandsSelectedPaths(true);
JTextField textField = new JTextField("soccer");
JButton button = new JButton("Select");
button.addActionListener(e -> {
  String q = textField.getText().trim();
  searchTree(tree1, tree1.getPathForRow(0), q);
  searchTree(tree2, tree2.getPathForRow(0), q);
});
// ...

private static void searchTree(JTree tree, TreePath path, String q) {
  Object o = path.getLastPathComponent();
  if (o instanceof TreeNode) {
    TreeNode node = (TreeNode) o;
    if (node.toString().equals(q)) {
      tree.addSelectionPath(path);
    }
    if (!node.isLeaf()) {
      // Java 9: Collections.list(node.children())
      Collections.list((Enumeration<?>) node.children())
          .forEach(n -> searchTree(tree, path.pathByAddingChild(n), q));
    }
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、マウスによるノード選択ではなくJTree#addSelectionPath(TreePath)などによるノード選択が行われた場合にそのノードまでのパスを展開するかどうかをJTree#setExpandsSelectedPaths(...)メソッドを使って切り替えるテストを行っています。

  • JTree#setExpandsSelectedPaths(false)
    • ノード選択を変更しても親パスが閉じている場合は展開しない
  • JTree#setExpandsSelectedPaths(true)
    • Java 1.3からのデフォルト
    • 選択されたノードまでのパスをすべて展開して可視化(スクロールはしない)

参考リンク

コメント