Swing/SearchBox のバックアップの現在との差分(No.12)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/SearchBox へ行く。
- 1 (2009-03-19 (木) 11:26:38)
- 2 (2010-01-20 (水) 00:38:18)
- 3 (2010-01-20 (水) 11:15:33)
- 4 (2010-10-12 (火) 13:18:56)
- 5 (2010-10-18 (月) 14:51:09)
- 6 (2010-11-18 (木) 01:39:29)
- 7 (2011-07-01 (金) 15:19:53)
- 8 (2011-09-15 (木) 21:32:23)
- 9 (2012-01-16 (月) 15:31:53)
- 10 (2013-01-12 (土) 21:51:12)
- 11 (2013-08-23 (金) 15:05:48)
- 12 (2013-09-05 (木) 00:38:13)
- 13 (2014-08-11 (月) 18:59:50)
- 14 (2014-08-11 (月) 20:33:21)
- 15 (2014-10-10 (金) 01:36:36)
- 16 (2014-11-25 (火) 03:03:31)
- 17 (2015-11-20 (金) 15:17:24)
- 18 (2016-05-31 (火) 14:30:14)
- 19 (2017-08-17 (木) 14:26:47)
- 20 (2018-03-30 (金) 16:07:19)
- 21 (2018-09-25 (火) 15:39:04)
- 22 (2020-09-26 (土) 17:32:50)
- 23 (2022-05-29 (日) 11:44:28)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTreeのノードを検索する #navi(../) #tags(JTree, TreeModel, TreePath, TreeNode) RIGHT:Posted by &author(aterai); at 2009-01-12 *JTreeのノードを検索する [#l1857467] ``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 --- * 概要 [#summary] `JTree`を検索して、一致するアイテムを選択します。 -&jnlp; -&jar; -&zip; #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTSs3gdysI/AAAAAAAAAjM/r_j-mrb83aU/s800/SearchBox.png) //#screenshot #ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTSs3gdysI/AAAAAAAAAjM/r_j-mrb83aU/s800/SearchBox.png) **サンプルコード [#e7516ef5] * サンプルコード [#sourcecode] #code(link){{ 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); protected static void searchTree( 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); } } } } }} **解説 [#h95e65f3] 上記のサンプルでは、選択された``JTree``のノード以下に、検索文字列と一致するノードがあれば、``JTree#addSelectionPath(TreePath)``メソッドで選択するようになっています。 * 解説 [#explanation] 上記のサンプルでは、選択された`JTree`のノード以下に検索文字列と一致するノードを検索して`JTree#addSelectionPath(TreePath)`メソッドで選択しています。 ---- [https://forums.oracle.com/forums/thread.jspa?threadID=1355454 Swing - how to get everything in DefaultTreeNode]のAndre_Uhresさんの投稿のように、``TreeModel``を使って検索する方法もあります。 - [https://community.oracle.com/thread/1357454 Swing - how to get everything in DefaultTreeNode]のAndre_Uhresさんの投稿のように`TreeModel`を使って検索する方法もある #code{{ //<blockquote cite="https://forums.oracle.com/message/5727950"> // <blockquote cite="https://community.oracle.com/thread/1357454"> 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."); } } 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); } } } //</blockquote> // </blockquote> }} ---- 以下は、``DefaultMutableTreeNode#depthFirstEnumeration()``を使用して、``bananas``を検索しています。 - 以下は`DefaultMutableTreeNode#depthFirstEnumeration()`を使用して`bananas`を検索 -- [[JTreeのノードを走査する>Swing/TraverseAllNodes]] - [[JTreeのノードを走査する>Swing/TraverseAllNodes]] #code{{ TreeModel model = tree.getModel(); DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); Enumeration depth = root.depthFirstEnumeration(); while(depth.hasMoreElements()) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)depth.nextElement(); if(node!=null && "bananas".equals(node.toString())) { 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; } } }} **参考リンク [#vd69b823] -[[JTreeのノードを展開・折り畳み>Swing/ExpandAllNodes]] -[https://forums.oracle.com/message/5727950 Swing - how to get everything in DefaultTreeNode] -[https://forums.oracle.com/forums/thread.jspa?threadID=1355454 Swing - how to get everything in DefaultTreeNode] -[[JTreeで条件に一致するノードを検索しハイライト>Swing/TreeNodeHighlightSearch]] -[[JTreeのノードを走査する>Swing/TraverseAllNodes]] * 参考リンク [#reference] - [[JTreeのノードを展開・折り畳み>Swing/ExpandAllNodes]] - [https://community.oracle.com/thread/1357454 Swing - how to get everything in DefaultTreeNode] - [[JTreeで条件に一致するノードを検索しハイライト>Swing/TreeNodeHighlightSearch]] - [[JTreeのノードを走査する>Swing/TraverseAllNodes]] **コメント [#a7ae0491] - ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- [[taji]] &new{2010-01-20 (水) 00:38:18}; - 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- [[taji]] &new{2010-01-20 (水) 00:39:44}; -- ``JTree``のデフォルトコンストラクタがサンプルモデルを持つ``JTree``を返しているので、``%JAVA_HOME%\src.zip``を展開して、``JTree()``を見るのがよいと思います。そこからたどって行けば``protected static TreeModel getDefaultTreeModel()``の中で、``TreeModel``を作って要素(ノード)を挿入している様子が分かります。 -- [[aterai]] &new{2010-01-20 (水) 11:15:33}; - ``JTree#getNextMatch(...)``は、展開されているノードのみ検索する? -- [[aterai]] &new{2010-11-18 (木) 01:40:07}; - 一致するノードが複数ある場合、ボタンクリックで選択状態がループするように変更しました(いつ修正したのかは不明...)。 -- [[aterai]] &new{2011-09-15 (木) 21:32:23}; * コメント [#comment] #comment - ソースを拝見させていただきましたが, 要素の挿入の箇所がさっぱりわかりません... -- &user(taji); &new{2010-01-20 (水) 00:38:18}; - 途中で切れてしまい失礼しました. できればどこで挿入しているのか教えていただけませんか? -- &user(taji); &new{2010-01-20 (水) 00:39:44}; -- `JTree`のデフォルトコンストラクタがサンプルモデルを持つ`JTree`を返しているので、`%JAVA_HOME%/src.zip`を展開して、`JTree()`を見るのがよいと思います。そこからたどって行けば`protected static TreeModel getDefaultTreeModel()`の中で、`TreeModel`を作って要素(ノード)を挿入している様子が分かります。 -- &user(aterai); &new{2010-01-20 (水) 11:15:33}; #code{{ /** * 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(...)`は、展開されているノードのみ検索する? -- &user(aterai); &new{2010-11-18 (木) 01:40:07}; - 一致するノードが複数ある場合、ボタンクリックで選択状態がループするように変更。 -- &user(aterai); &new{2011-09-15 (木) 21:32:23}; #comment