概要

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

サンプルコード

private static void searchTree(
    JTree tree, TreePath path, String q, List<TreePath> rollOverPathLists) {
  TreeNode node = (TreeNode) path.getLastPathComponent();
  if (node == null) {
    return;
  }
  if (node.toString().startsWith(q)) {
    rollOverPathLists.add(path);
    tree.expandPath(path.getParentPath());
  }
  if (!node.isLeaf() && node.getChildCount() >= 0) {
    Enumeration e = node.children();
    while (e.hasMoreElements()) {
      searchTree(
          tree, path.pathByAddingChild(e.nextElement()), q, rollOverPathLists);
    }
  }
}
view all

解説

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


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

//<blockquote cite="https://community.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;
  }
}

参考リンク

コメント

  • ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- taji
  • 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- taji
    • JTreeのデフォルトコンストラクタがサンプルモデルを持つJTreeを返しているので、%JAVA_HOME%/src.zipを展開して、JTree()を見るのがよいと思います。そこからたどって行けばprotected static TreeModel getDefaultTreeModel()の中で、TreeModelを作って要素(ノード)を挿入している様子が分かります。 -- aterai
/**
 * Creates and returns a sample <code>TreeModel</code>.
 * Used primarily for beanbuilders to show something interesting.
 *
 * @return the default <code>TreeModel</code>
 */
protected static TreeModel getDefaultTreeModel() {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("JTree");
    DefaultMutableTreeNode parent;

    parent = new DefaultMutableTreeNode("colors");
    root.add(parent);
    parent.add(new DefaultMutableTreeNode("blue"));
    parent.add(new DefaultMutableTreeNode("violet"));
    parent.add(new DefaultMutableTreeNode("red"));
    parent.add(new DefaultMutableTreeNode("yellow"));

    parent = new DefaultMutableTreeNode("sports");
    root.add(parent);
    parent.add(new DefaultMutableTreeNode("basketball"));
    parent.add(new DefaultMutableTreeNode("soccer"));
    parent.add(new DefaultMutableTreeNode("football"));
    parent.add(new DefaultMutableTreeNode("hockey"));

    parent = new DefaultMutableTreeNode("food");
    root.add(parent);
    parent.add(new DefaultMutableTreeNode("hot dogs"));
    parent.add(new DefaultMutableTreeNode("pizza"));
    parent.add(new DefaultMutableTreeNode("ravioli"));
    parent.add(new DefaultMutableTreeNode("bananas"));
    return new DefaultTreeModel(root);
}
  • JTree#getNextMatch(...)は、展開されているノードのみ検索する? -- aterai
  • 一致するノードが複数ある場合、ボタンクリックで選択状態がループするように変更。 -- aterai