TITLE:JTreeのノードを検索する
Posted by terai at 2009-01-12

JTreeのノードを検索する

JTreeを検索して、一致するアイテムを選択します。
  • category: swing folder: SearchBox title: JTreeのノードを検索する tags: [JTree, TreeModel, TreePath, TreeNode] author: aterai pubdate: 2009-01-12T18:57:42+09:00 description: JTreeを検索して、一致するアイテムを選択します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTSs3gdysI/AAAAAAAAAjM/r_j-mrb83aU/s800/SearchBox.png

概要

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

#screenshot

サンプルコード

#spanend
#spanadd
protected static void searchTree(
#spanend
    JTree tree, TreePath path, String q,
    List<TreePath> rollOverPathLists) {
  Object o = path.getLastPathComponent();
  if (o instanceof TreeNode) {
    TreeNode node = (TreeNode) o;
    if (node.toString().startsWith(q)) {
      rollOverPathLists.add(path);
      tree.expandPath(path.getParentPath());
    }
    if (!node.isLeaf()) {
      // Java 9: Enumeration<TreeNode> e = node.children();
      Enumeration<?> e = node.children();
      while (e.hasMoreElements()) {
        searchTree(tree, path.pathByAddingChild(e.nextElement()),
                   q, rollOverPathLists);
      }
    }
  }
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin

サンプルコード

解説

上記のサンプルでは、選択されたJTreeのノード以下に検索文字列と一致するノードを検索してJTree#addSelectionPath(TreePath)メソッドで選択しています。
  • -
#spandel
private static void searchTree(JTree tree, TreePath path, String q) {
#spanend
  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);
#spanadd
// <blockquote cite="https://community.oracle.com/thread/1357454">
#spanend
#spanadd
public void traverse(JTree tree) {
#spanend
  TreeModel model = tree.getModel();
  Object root;
  if (model != null) {
    root = model.getRoot();
    walk(model, root);
  } else {
    System.out.println("Tree is empty.");
  }
}
#spanadd

#spanend
#spanadd
protected void walk(TreeModel model, Object o) {
#spanend
  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);
    }
  }
#spanadd
}
#spanend
#spanadd
// </blockquote>
#spanend

解説

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

参考リンク

  • JTreeのノードを展開・折り畳み
    #spanend
    #spanadd
    TreeModel model = tree.getModel();
    #spanend
    #spanadd
    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    #spanend
    #spanadd
    Enumeration depth = root.depthFirstEnumeration();
    #spanend
    #spanadd
    while (depth.hasMoreElements()) {
    #spanend
      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;
      }
    #spanadd
    }
    #spanend
    #spanadd
    

コメント

参考リンク

コメント