Wie man einen bestimmten Knoten in jtree sucht und diesen Knoten erweitert.

Ich habe einen Baum mit 100 Knoten. Jetzt möchte ich bestimmten Knoten von diesem Baum suchen und diesen Knoten erweitert ..? Wie kann ich dieses Problem lösen?

   

Erweitern Sie die @ mKorbel-Antwort und wie unter Verwendung von Bäumen beschrieben , können Sie Ihr TreeModel rekursiv TreeModel und einen TreePath für den resultierenden Knoten erhalten. Sobald Sie den gewünschten path , ist es einfach, ihn im Baum anzuzeigen.

 tree.setSelectionPath(path); tree.scrollPathToVisible(path); 

Nachtrag: Hier ist eine Möglichkeit, “einen 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; } 

Ich nehme an, du meinst, du willst einen Knoten mit einer bestimmten Zeichenfolge finden, oder? Die anderen Antworten erklären Möglichkeiten, dies mit dem Enumerationsansatz zu tun … (und ich bin mir sicher, dass sie alle wissen, dass in der realen Welt auch die Möglichkeit berücksichtigt werden muss, dass mehr als ein Knoten die gesuchte Zeichenfolge hat, etc.)

Aber es gibt potenziell andere, sexierere Wege, es zu tun. Zum Beispiel, wenn Sie alle Knoten in eine collection irgendeiner Art ( ArrayList , etc. *) setzen, so wie sie in die Baumstruktur eingefügt wurden (und sie entfernt haben, als sie entfernt wurden, einschließlich das explizite Entfernen aller ihrer Nachkommen) … und wenn Sie auch implementiert Dinge so, dass zwei Knoten als gleich angesehen wurden, wenn sie das gleiche Ergebnis von toString (oder einen Comparator implementiert haben, der das getan hat), könnten Sie dann einfach den tatsächlichen Knoten (oder Knoten) in der ArrayList die übereinstimmen, und dann geh

 tree.expandPath( new TreePath( node_found.getPath()) 

Einer der Punkte von Bäumen ist, dass es wirklich der Pfad zu dem Knoten ist (manchmal als “Brotkrumen” bezeichnet), der die wahre “Identität” eines gegebenen Knotens darstellt. In Bezug auf die angezeigten String Werte bedeutet dies, dass Sie in derselben Baumstruktur möglicherweise Folgendes haben:

Pfad: “Peter” – “Piper” – “eingelegte” – “Pfeffer”
Pfad: “Kulinarische Spezialitäten” – “Gewürze” – “Pfeffer”
Pfad: “Meine Favoriten” – “Essen” – “Würzmittel” – “Pfeffer”

Wenn Sie also nach einem dieser “Pfeffer” -Knoten suchen und dann einen dieser “Pfeffer” -Knoten auswählen oder hervorheben möchten … ist es nicht wirklich effizient, einen “Brute-Force” -Enumerationsansatz für jedes der Elemente auf diesem Pfad zu haben (der Je größer der Baum, desto schlimmer das Problem natürlich).

Mit meinem Vorschlag wird es ziemlich einfach: Teilen Sie einfach Ihren “Brotkrumen” -Pfad ein, beginnend bei root oder wo auch immer, und verwenden Sie dann node.isNodeDescendant() auf dem “höheren” Knoten (n), wenn Sie in den Baum hinein bohren. (dh diejenigen, die weiter von der Wurzel entfernt sind), die Sie bereits gefunden haben (hier die 3 “Pfeffer” -Knoten): Wenn Sie den ersten Pfad oben haben wollten, würden Sie zuerst den Knoten “Peter” finden und dann sofort den einzigen “Pfeffer” -Knoten isNodeDescendant den isNodeDescendant Test erfüllen, erhalten isNodeDescendant den gesamten Pfad, den Sie suchen.

* Eine Form der Hashing-Sammlung wäre natürlich noch effizienter. Aber das ist nur eine Überlegung, wenn Sie viele Tausende oder mehr Knoten in Ihrem Baum haben.

Hier ist ein Beispiel, wie man in einer Suche durch einen Baum fährt:

  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); } } } }