Swing-Bäume leicht gemacht

Nun stehen also der Pfad zu dem Elternelement, die Position, in der das Kind hinzugefügt wurde sowie die ID der hinzugefügten Mitteilung zur Verfügung. Man kann jetzt eine der Methoden des AbstractTreeModel, fireChildAdded, aufrufen, die die geeigneten TreeModelEvents auslöst. Wenn man fireChildAdded ganz einfach und direkt aufruft, dann kann es allerdings vorkommen, dass Änderungen nur an dem Baum und nicht im Swing-Ereignis-Thread ausgeführt werden, was zu einer Beschädigung des UI führen kann. Besser ist es daher, den Aufruf SwingUtilities.invokeLater() zu benutzen, der ein Runnable-Objekt zu der auszuführenden Reihe von Swing-Ereignissen hinzufügt. Man sollte nicht versuchen, den TreePath und die Index-Informationen in diesem Runnable zu evaluieren – dies kann noch zu einem späteren Zeitpunkt erfolgen, wobei es angesichts der sich rasch verändernden Datenquelle eventuell ohnehin nicht möglich ist, die Pfad-Informationen zu erhalten. Ein ähnlicher Ansatz wird in der Methode deleteMessage angewandt, obgleich hierfür der Index-Wert und die Elternelement-ID bekannt sein müssen, da die Mitteilung nicht mehr die Datenquelle darstellt. Bei deleteMessage ruft man im Allgemeinen fireChildRemoved auf.

Nachdem diese Methoden implementiert wurden, liegt nun ein dynamisches Baummodell vor, mit dem man experimentieren kann. MessagesFrame enthält ein einfaches UI, das zunächst eine MessageBox und anschließend einen Jtree mithilfe des MessageTreeBoxModel erstellt. Nun folgt der letzte Teil des Zen. Sie müssen einen Cellrenderer für den Baum installieren, der die Long-ID-Werte handhaben kann. In diesem Fall legt die Klasse MessageRenderer den Text für einen direkt von der MessageBox empfangenen String fest.

Beim Ausführen des Beispielcodes entsteht ein schneller und reaktionsfähiger Baum, der große Updates durchführen und zahlreiche Knoten handhaben kann, ohne dass die Schnittstelle beeinträchtigt wird. Einzig die Schaltfläche ExpandAll dauert etwas länger, da der Baum einige Zeit braucht, um die Höhe und Weite des komplett erweiterten Baums zu berechnen. Man kann diesen Vorgang ein wenig beschleunigen, indem man die Methode setRowHeight() von Jtree benutzt, um die Höhe festzusetzen, und setLargeModel(true) im Baum einsetzt, so dass dieser für seine Größenberechnungen weniger Cache belegt. So kann man auch erheblich größere Bäume beschleunigen, obgleich man bei Baumelementen variabler Höhe an Flexibilität einbüßt.

Der Quellcode für dieses Tutorial steht als Zip-Datei zum Download zur Verfügung.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Swing-Bäume leicht gemacht

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *