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

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#e7516ef5]
#code{{
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)メソッドで選択するようになっています。

----
[[Swing - how to get everything in DefaultTreeNode>http://forums.sun.com/thread.jspa?messageID=10584331]]のAndre_Uhresさんの投稿のように、TreeModelを使って検索する方法もあります。
#code{{
//<blockquote cite="http://forums.sun.com/thread.jspa?messageID=10584331#10584331">
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 />
}}

**参考リンク [#vd69b823]
-[[JTreeのノードを展開・折り畳み>Swing/ExpandAllNodes]]
-[[Swing - how to get everything in DefaultTreeNode>http://forums.sun.com/thread.jspa?messageID=10584331]]

**コメント [#a7ae0491]
- ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- [[taji]] &new{2010-01-20 (水) 00:38:18};
- 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- [[taji]] &new{2010-01-20 (水) 00:39:44};
-- JTreeのデフォルトコンストラクタがサンプルモデルを持つ JTree を返しているので、src.zipを展開して、JTree()を見るのがよいと思います。そこからたどって行けばprotected static TreeModel getDefaultTreeModel()の中で、TreeModelを作って要素を挿入している様子が分かります。 -- [[terai]] &new{2010-01-20 (水) 11:15:33};
-- JTreeのデフォルトコンストラクタがサンプルモデルを持つ JTree を返しているので、%JAVA_HOME%\src.zipを展開して、JTree()を見るのがよいと思います。そこからたどって行けばprotected static TreeModel getDefaultTreeModel()の中で、TreeModelを作って要素を挿入している様子が分かります。 -- [[terai]] &new{2010-01-20 (水) 11:15:33};

#comment