2017-07-02 3 views
0

Ich möchte meine JTree dynamisch durch eine benutzerinitiierte Suche (über Elemente der Struktur) aktualisiert werden. Von der Ausgabe auf der Konsole kann ich sagen, dass die Suche so funktioniert, wie sie sollte. Das Problem besteht darin, den Baum zu aktualisieren.Dynamic JTree aktualisiert von KeyListener in einem JTextField

Hier ist was ich habe. Ich habe eine Reihe von Klassen wie

public class classA { 

    int id; 

    String name; 

    List<ClassB> listOfClassB; 
} 

public class classB { 

    int id; 

    String name; 

    List<ClassC> listOfClassC; 
} 

public class classC { 

    int id; 

    String name; 
} 

Aus diesen Klassen I durch Looping throught die Klassen Listen in createTree eine JTree erzeugen().

private DefaultMutableTreeNode rootNode; 
rootNode = createTree("New", ""); // "New" tells the method to generate the complete tree 
treeModel = new DefaultTreeModel(rootNode); 
JTree myTree = new JTree(treeModel); 

So weit so gut. Jetzt möchte ich den Baum nach einem String oder Int in classC.name oder classC.id durchsuchen und alle Knoten entfernen, die nicht mit den Suchkriterien übereinstimmen. Aber nicht die Objekte, nur die entsprechenden Baumknoten. Wenn der Benutzer mit der Suche fertig ist, kann ich den gesamten Baum wieder anzeigen.

Die Suche wird mit JTextField und einem KeyListener durchgeführt, der createTree aufruft (searchOption, searchText).

Bis jetzt habe ich versucht, alle Knoten mit removeAllChildren() zu entfernen und dann neue Knoten hinzufügen, die den Suchkriterien entsprechen. Späteres Nachladen des TreeModels scheint hier nicht zu funktionieren.

createTree(searchOption, searchText); 
rootNode.removeAllChildren(); 
treeModel.reload(rootNode); 

Irgendwelche Ideen, wie ich das erreichen könnte?

PS: Ich entschied mich, den Baum zu löschen und einen neuen zu generieren, um zu vermeiden, dass der Baum und die Daten synchron bleiben, weil es viel komplizierter erscheint.

Antwort

0

Ich habe es geschafft, einen "neuen" Baum zu laden, indem ich einen neuen Wurzelknoten erstelle und setze, bevor ich das Modell neu lade. Es scheint mir nicht "sauber", aber es hat den Trick gemacht.

rootNode = createTree(searchOption, searchText); 
    treeModel.setRoot(rootNode); 
    treeModel.reload(); 
0
JTree myTree = new JTree(treeModel); 

Diese Aussage sieht nicht korrekt aus. Sie erstellen einen neuen JTree, aber ich sehe nicht, wo Sie die Struktur zum Rahmen hinzufügen.

Statt einen neuen Baum zu schaffen, nur das Modell des Baumes Zurücksetzen:

myTree.setModel(treeModel); 

Die Suche mit JTextField und einem KeyListener implementiert, die ruft createTree (Search, search).

Verwenden Sie keinen KeyListener. Sie sollten eine DocumentListener verwenden, um auf Änderungen im Text zu hören. Lesen Sie den Abschnitt aus dem Swing-Lernprogramm unter Listener For Change on a Document.

+0

Danke für den Tipp mit dem DocumentListener. Das Zurücksetzen des Modells funktionierte nicht. Ich habe die gefundene Lösung gepostet. – JKB