• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTreeのノードを検索する
#navi(../)
#tags(JTree, TreeModel, TreePath, TreeNode)
RIGHT:Posted by &author(aterai); at 2009-01-12
*JTreeのノードを検索する [#l1857467]
``JTree``を検索して、一致するアイテムを選択します。
* JTreeのノードを検索する [#l1857467]
`JTree`を検索して、一致するアイテムを選択します。

-&jnlp;
-&jar;
-&zip;
#download
#ref(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTSs3gdysI/AAAAAAAAAjM/r_j-mrb83aU/s800/SearchBox.png)

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTSs3gdysI/AAAAAAAAAjM/r_j-mrb83aU/s800/SearchBox.png)

**サンプルコード [#e7516ef5]
** サンプルコード [#e7516ef5]
#code(link){{
private static void searchTree(JTree tree, TreePath path, String q) {
  TreeNode node = (TreeNode)path.getLastPathComponent();
  if(node==null) return;
  if(node.toString().equals(q))
    tree.addSelectionPath(path);
  if(!node.isLeaf() && node.getChildCount()>=0) {
    Enumeration e = node.children();
    while(e.hasMoreElements())
      searchTree(tree, path.pathByAddingChild(e.nextElement()), q);
  }
}
}}

**解説 [#h95e65f3]
上記のサンプルでは、選択された``JTree``のノード以下に、検索文字列と一致するノードがあれば、``JTree#addSelectionPath(TreePath)``メソッドで選択するようになっています。
** 解説 [#h95e65f3]
上記のサンプルでは、選択された`JTree`のノード以下に、検索文字列と一致するノードがあれば、`JTree#addSelectionPath(TreePath)`メソッドで選択するようになっています。

----
[https://forums.oracle.com/forums/thread.jspa?threadID=1355454 Swing - how to get everything in DefaultTreeNode]のAndre_Uhresさんの投稿のように、``TreeModel``を使って検索する方法もあります。
[https://forums.oracle.com/thread/1357454 Swing - how to get everything in DefaultTreeNode]のAndre_Uhresさんの投稿のように、`TreeModel`を使って検索する方法もあります。

#code{{
//<blockquote cite="https://forums.oracle.com/message/5727950">
//<blockquote cite="https://forums.oracle.com/thread/1357454">
public void traverse(JTree tree) {
  TreeModel model = tree.getModel();
  Object root;
  if(model != null) {
    root = model.getRoot();
    walk(model,root);
  }else{
    System.out.println("Tree is empty.");
  }
}
protected void walk(TreeModel model, Object o) {
  int cc = model.getChildCount(o);
  for(int i=0; i < cc; i++) {
    DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(o, i);
    if(model.isLeaf(child)) {
      System.out.println(child);
    }else{
      System.out.println(child);
      walk(model, child);
    }
  }
}
//</blockquote>
}}

----
以下は、``DefaultMutableTreeNode#depthFirstEnumeration()``を使用して、``bananas``を検索しています。
以下は、`DefaultMutableTreeNode#depthFirstEnumeration()`を使用して、`bananas`を検索しています。

- [[JTreeのノードを走査する>Swing/TraverseAllNodes]]

#code{{
TreeModel model = tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
Enumeration depth = root.depthFirstEnumeration();
while(depth.hasMoreElements()) {
  DefaultMutableTreeNode node = (DefaultMutableTreeNode)depth.nextElement();
  if(node!=null && "bananas".equals(node.toString())) {
    TreePath path = new TreePath(node.getPath());
    tree.setSelectionPath(path);
    tree.scrollPathToVisible(path);
    return;
  }
}
}}

**参考リンク [#vd69b823]
-[[JTreeのノードを展開・折り畳み>Swing/ExpandAllNodes]]
-[https://forums.oracle.com/message/5727950 Swing - how to get everything in DefaultTreeNode]
-[https://forums.oracle.com/forums/thread.jspa?threadID=1355454 Swing - how to get everything in DefaultTreeNode]
-[[JTreeで条件に一致するノードを検索しハイライト>Swing/TreeNodeHighlightSearch]]
-[[JTreeのノードを走査する>Swing/TraverseAllNodes]]
** 参考リンク [#vd69b823]
- [[JTreeのノードを展開・折り畳み>Swing/ExpandAllNodes]]
- [https://forums.oracle.com/thread/1357454 Swing - how to get everything in DefaultTreeNode]
- [[JTreeで条件に一致するノードを検索しハイライト>Swing/TreeNodeHighlightSearch]]
- [[JTreeのノードを走査する>Swing/TraverseAllNodes]]

**コメント [#a7ae0491]
** コメント [#a7ae0491]
- ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- [[taji]] &new{2010-01-20 (水) 00:38:18};
- 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- [[taji]] &new{2010-01-20 (水) 00:39:44};
-- ``JTree``のデフォルトコンストラクタがサンプルモデルを持つ``JTree``を返しているので、``%JAVA_HOME%\src.zip``を展開して、``JTree()``を見るのがよいと思います。そこからたどって行けば``protected static TreeModel getDefaultTreeModel()``の中で、``TreeModel``を作って要素(ノード)を挿入している様子が分かります。 -- [[aterai]] &new{2010-01-20 (水) 11:15:33};
- ``JTree#getNextMatch(...)``は、展開されているノードのみ検索する? -- [[aterai]] &new{2010-11-18 (木) 01:40:07};
-- `JTree`のデフォルトコンストラクタがサンプルモデルを持つ`JTree`を返しているので、`%JAVA_HOME%\src.zip`を展開して、`JTree()`を見るのがよいと思います。そこからたどって行けば`protected static TreeModel getDefaultTreeModel()`の中で、`TreeModel`を作って要素(ノード)を挿入している様子が分かります。 -- [[aterai]] &new{2010-01-20 (水) 11:15:33};
- `JTree#getNextMatch(...)`は、展開されているノードのみ検索する? -- [[aterai]] &new{2010-11-18 (木) 01:40:07};
- 一致するノードが複数ある場合、ボタンクリックで選択状態がループするように変更しました(いつ修正したのかは不明...)。 -- [[aterai]] &new{2011-09-15 (木) 21:32:23};

#comment