• title: JTreeのノードを検索する tags: [JTree, TreeModel, TreePath, TreeNode] author: aterai pubdate: 2009-01-12T18:57:42+09:00 description: JTreeを検索して、一致するアイテムを選択します。

概要

JTreeを検索して、一致するアイテムを選択します。

サンプルコード

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);
  }
}
View in GitHub: Java, Kotlin

解説

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


Swing - how to get everything in DefaultTreeNodeのAndre_Uhresさんの投稿のように、TreeModelを使って検索する方法もあります。

//<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を検索しています。

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

参考リンク

コメント