Как искать определенный узел в jtree и расширять этот узел.?
У меня есть jtree со 100 узлами. теперь я хочу искать определенный узел из этого дерева и расширять этот узел ..? Как я могу решить эту проблему.?
- Расширяет JFrame и создает его внутри программы
- .gif изображение не перемещается при добавлении его в панель JTabbed
- Ключевые привязки и ключевые слушатели в Java
- Как добавить гиперссылку в JLabel
- Невозможно создать прозрачный и незадекларированный JFrame в JDK7 при включении nimbus
- Java - проверьте, не является ли JTextField пустым или нет.
- Как нарисовать в JPanel? (Swing / графика Java)
- Зачем использовать SwingUtilities.invokeLater в основном методе?
Развернувшись на ответе @ mKorbel и, как описано в разделе « Использование деревьев» , вы можете рекурсивно выполнять поиск в TreeModel
и получить TreePath
для результирующего узла. Когда у вас есть нужный path
, его легко показать в дереве.
tree.setSelectionPath(path); tree.scrollPathToVisible(path);
Добавление: Вот один из способов «получить TreePath
».
private TreePath find(DefaultMutableTreeNode root, String s) { @SuppressWarnings("unchecked") Enumeration e = root.depthFirstEnumeration(); while (e.hasMoreElements()) { DefaultMutableTreeNode node = e.nextElement(); if (node.toString().equalsIgnoreCase(s)) { return new TreePath(node.getPath()); } } return null; }
Я предполагаю, что вы хотите, чтобы вы нашли узел с определенной строкой, не так ли? Другие ответы объясняют, как это сделать, используя подход enums … (и я уверен, что они все знают, что в реальном мире вам также нужно будет использовать более одного узла с искомой строкой, и т.д.)
Но есть потенциально другие, более сексуальные, способы сделать это. Например, если вы поместили все узлы в какую-либо collection
( ArrayList
и т. Д. *), Поскольку они были вставлены в дерево (и удалили их по мере их удаления, включая явное удаление всех их потомков) … и если вы также реализованные вещи, так что два узла считались «равными», если они имели тот же результат от toString
(или реализовали Comparator
который сделал это), тогда вы могли бы легко вытащить фактический узел (или узлы) в ArrayList
который соответствует, и тогда иди
tree.expandPath( new TreePath( node_found.getPath())
Одна из точек деревьев состоит в том, что на самом деле это путь к узлу (иногда называемый «панировочными сухарями»), который является реальной «идентичностью» любого данного узла. С точки зрения отображаемых значений String
это означает, что вы можете иметь в том же дереве:
путь: «Питер» – «Пайпер» – «маринованный» – «перец»
путь: «Кулинарные блюда» – «специи» – «перец»
путь: «Мои любимые» – «еда» – «приправы» – «перец»
Итак, скажите, что вы хотите искать, а затем выбирать или выделять один из этих «перечных» узлов … на самом деле не очень эффективно иметь подменю «перебор» для каждого элемента по этому пути ( больше дерево, тем хуже проблема, конечно).
Используя мое предложение, это становится довольно простым: просто разделите свой путь «панировки», начиная с корня или где угодно, а затем, когда вы node.isNodeDescendant()
в дерево, используйте node.isNodeDescendant()
на «более высоких» узлах (узлах) (т. е. те из корня), которые вы уже нашли (здесь 3 узла «перец»): если вы хотите первый путь выше, вы сначала найдете узел «Питер», а затем сразу же после этого единственный узел «перец» который может удовлетворить тест isNodeDescendant
, даст весь путь, который вы ищете.
Конечно, некоторая форма хеширования будет еще более эффективной. Но это соображение, только если у вас много или больше узлов в вашем дереве.
Вот пример того, как циклически перемещаться по дереву в поиске:
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; public class TreeDemo extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; public JTree tree; public JButton button; public JTextField text; public TreeDemo() { button = new JButton("Enter search text below and click"); text = new JTextField(); button.addActionListener(this); tree = new JTree(); DefaultMutableTreeNode root = new DefaultMutableTreeNode( "Deck" ); DefaultMutableTreeNode itemClubs= new DefaultMutableTreeNode( "Clubs" ); addAllCard( itemClubs ); root.add( itemClubs ); DefaultMutableTreeNode itemDiamonds = new DefaultMutableTreeNode( "Diamonds" ); addAllCard( itemDiamonds ); root.add( itemDiamonds ); DefaultMutableTreeNode itemSpades = new DefaultMutableTreeNode( "Spades" ); addAllCard( itemSpades ); root.add( itemSpades ); DefaultMutableTreeNode itemHearts = new DefaultMutableTreeNode( "Hearts" ); addAllCard( itemHearts ); root.add( itemHearts ); DefaultTreeModel treeModel = new DefaultTreeModel( root ); tree = new JTree( treeModel ); JScrollPane scrollPane = new JScrollPane(tree); getContentPane().add(scrollPane, BorderLayout.CENTER); getContentPane().add(button, BorderLayout.NORTH); getContentPane().add(text, BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(375, 400); } public void addAllCard( DefaultMutableTreeNode suit ) { suit.add( new DefaultMutableTreeNode( "Ace" ) ); suit.add( new DefaultMutableTreeNode( "Two" ) ); suit.add( new DefaultMutableTreeNode( "Three" ) ); suit.add( new DefaultMutableTreeNode( "Four" ) ); suit.add( new DefaultMutableTreeNode( "Five" ) ); suit.add( new DefaultMutableTreeNode( "Six" ) ); suit.add( new DefaultMutableTreeNode( "Seven" ) ); suit.add( new DefaultMutableTreeNode( "Eight" ) ); suit.add( new DefaultMutableTreeNode( "Nine" ) ); suit.add( new DefaultMutableTreeNode( "Ten" ) ); suit.add( new DefaultMutableTreeNode( "Jack" ) ); suit.add( new DefaultMutableTreeNode( "Queen" ) ); suit.add( new DefaultMutableTreeNode( "King" ) ); } public final DefaultMutableTreeNode findNode(String searchString) { List searchNodes = getSearchNodes((DefaultMutableTreeNode)tree.getModel().getRoot()); DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); DefaultMutableTreeNode foundNode = null; int bookmark = -1; if( currentNode != null ) { for(int index = 0; index < searchNodes.size(); index++) { if( searchNodes.get(index) == currentNode ) { bookmark = index; break; } } } for(int index = bookmark + 1; index < searchNodes.size(); index++) { if(searchNodes.get(index).toString().toLowerCase().contains(searchString.toLowerCase())) { foundNode = searchNodes.get(index); break; } } if( foundNode == null ) { for(int index = 0; index <= bookmark; index++) { if(searchNodes.get(index).toString().toLowerCase().contains(searchString.toLowerCase())) { foundNode = searchNodes.get(index); break; } } } return foundNode; } private final List getSearchNodes(DefaultMutableTreeNode root) { List searchNodes = new ArrayList (); Enumeration e = root.preorderEnumeration(); while(e.hasMoreElements()) { searchNodes.add((DefaultMutableTreeNode)e.nextElement()); } return searchNodes; } public static void main(String[] args) { TreeDemo app = new TreeDemo(); app.setVisible(true); } public void actionPerformed(ActionEvent e) { String search = text.getText(); if(search.trim().length() > 0 ) { DefaultMutableTreeNode node = findNode(search); if( node != null ) { TreePath path = new TreePath(node.getPath()); tree.setSelectionPath(path); tree.scrollPathToVisible(path); } } } }