Swing/SearchBox のバックアップの現在との差分(No.8)
TITLE:JTreeのノードを検索する
Posted by aterai 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:
概要
JTree
を検索して、一致するアイテムを選択します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#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
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#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);
}
}
}
}
解説
上記のサンプルでは、選択されたJTreeのノード以下に、検索文字列と一致するノードがあれば、JTree#addSelectionPath(TreePath)メソッドで選択するようになっています。解説
上記のサンプルでは、選択されたJTree
のノード以下に検索文字列と一致するノードを検索してJTree#addSelectionPath(TreePath)
メソッドで選択しています。
Swing - how to get everything in DefaultTreeNodeのAndre_Uhresさんの投稿のように、TreeModelを使って検索する方法もあります。
- Swing - how to get everything in DefaultTreeNodeのAndre_Uhresさんの投稿のように
TreeModel
を使って検索する方法もある
#spandel
//<blockquote cite="http://forums.sun.com/thread.jspa?messageID=10584331#10584331">
#spanend
#spanadd
// <blockquote cite="https://community.oracle.com/thread/1357454">
#spanend
public void traverse(JTree tree) {
TreeModel model = tree.getModel();
Object root;
if(model != null) {
if (model != null) {
root = model.getRoot();
walk(model,root);
}else{
walk(model, root);
} else {
System.out.println("Tree is empty.");
}
}
#spanadd
#spanend
protected void walk(TreeModel model, Object o) {
int cc = model.getChildCount(o);
for(int i=0; i < cc; i++) {
for (int i = 0; i < cc; i++) {
DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(o, i);
if(model.isLeaf(child)) {
if (model.isLeaf(child)) {
System.out.println(child);
}else{
} else {
System.out.println(child);
walk(model, child);
}
}
}
#spandel
//</blockquote>
#spanend
#spanadd
// </blockquote>
#spanend
以下は、DefaultMutableTreeNode#depthFirstEnumeration()を使用して、"bananas"を検索しています。
- 以下は
DefaultMutableTreeNode#depthFirstEnumeration()
を使用してbananas
を検索
TreeModel model = tree.getModel();
#spandel
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
#spanend
#spanadd
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
#spanend
Enumeration depth = root.depthFirstEnumeration();
#spandel
while(depth.hasMoreElements()) {
#spanend
DefaultMutableTreeNode node = (DefaultMutableTreeNode)depth.nextElement();
if(node!=null && "bananas".equals(node.toString())) {
#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;
}
}
参考リンク
参考リンク
- JTreeのノードを展開・折り畳み
- Swing - how to get everything in DefaultTreeNode
- JTreeで条件に一致するノードを検索しハイライト
- JTreeのノードを走査する
コメント
- ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- taji?
- 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- taji?
- JTreeのデフォルトコンストラクタがサンプルモデルを持つ JTree を返しているので、%JAVA_HOME%\src.zipを展開して、JTree()を見るのがよいと思います。そこからたどって行けばprotected static TreeModel getDefaultTreeModel()の中で、TreeModelを作って要素を挿入している様子が分かります。 -- aterai
- JTree#getNextMatch(...)は、展開されているノードのみ検索する? -- aterai
コメント
- ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- taji
- 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- taji
-
JTree
のデフォルトコンストラクタがサンプルモデルを持つJTree
を返しているので、%JAVA_HOME%/src.zip
を展開して、JTree()
を見るのがよいと思います。そこからたどって行けばprotected static TreeModel getDefaultTreeModel()
の中で、TreeModel
を作って要素(ノード)を挿入している様子が分かります。 -- aterai
-
#spanend
#spanadd
/**
#spanend
* Creates and returns a sample <code>TreeModel</code>.
* Used primarily for beanbuilders to show something interesting.
*
* @return the default <code>TreeModel</code>
*/
#spanadd
protected static TreeModel getDefaultTreeModel() {
#spanend
DefaultMutableTreeNode root = new DefaultMutableTreeNode("JTree");
DefaultMutableTreeNode parent;
#spanadd
#spanend
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"));
#spanadd
#spanend
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"));
#spanadd
#spanend
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);
#spanadd
}
#spanend
#spanadd
-
JTree#getNextMatch(...)
は、展開されているノードのみ検索する? -- aterai - 一致するノードが複数ある場合、ボタンクリックで選択状態がループするように変更。 -- aterai