• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTreeの選択されたノードを展開する
#navi(../)
RIGHT:Posted by [[aterai]] at 2012-09-24
*JTreeの選択されたノードを展開する [#fdd0db61]
JTreeの選択されたノードまでのパスをすべて展開して可視状態にします。
---
category: swing
folder: ExpandsSelectedPaths
title: JTreeの選択されたノードを展開する
tags: [JTree, TreePath]
author: aterai
pubdate: 2012-09-24T13:08:25+09:00
description: JTreeの選択されたノードまでのパスをすべて展開して可視状態にします。
image: https://lh6.googleusercontent.com/-sOsnOftT8xE/UF_b7dSxzQI/AAAAAAAABS0/i_xYkTfxbZg/s800/ExpandsSelectedPaths.png
---
* 概要 [#summary]
`JTree`の選択されたノードまでのパスをすべて展開して可視状態にします。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/-sOsnOftT8xE/UF_b7dSxzQI/AAAAAAAABS0/i_xYkTfxbZg/s800/ExpandsSelectedPaths.png)

//#screenshot
#ref(https://lh6.googleusercontent.com/-sOsnOftT8xE/UF_b7dSxzQI/AAAAAAAABS0/i_xYkTfxbZg/s800/ExpandsSelectedPaths.png)
* サンプルコード [#sourcecode]
#code(link){{
// 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);
});
// ...

**サンプルコード [#pffd84f2]
#code(link){{
tree.setExpandsSelectedPaths(true);
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));
    }
  }
}
}}

**解説 [#s84ec3a0]
- JTree#setExpandsSelectedPaths(false);
-- ノード選択を変更しても親パスを展開しない
- JTree#setExpandsSelectedPaths(true);
-- デフォルト(JDK 1.3 から)
-- マウスによる選択ではない、JTree#addSelectionPath(TreePath)などによるノード選択が行われた場合、選択されたノードまでのパスをすべて展開して可視化(スクロールはしない)
* 解説 [#explanation]
上記のサンプルでは、マウスによるノード選択ではなく`JTree#addSelectionPath(TreePath)`などによるノード選択が行われた場合にそのノードまでのパスを展開するかどうかを`JTree#setExpandsSelectedPaths(...)`メソッドを使って切り替えるテストを行っています。

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

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/1.3/guide/swing/JTreeChanges.html JTree の expandsSelectedPaths 新規プロパティおよび removeDescendantSelectedPaths 新規メソッド]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTree.html#setExpandsSelectedPaths-boolean- JTree#setExpandsSelectedPaths(boolean) (Java Platform SE 8)]
- [[JTreeのノードを検索する>Swing/SearchBox]]

**コメント [#l42b97e5]
* コメント [#comment]
#comment
#comment