„Messages“ ist ein Beispiel, um den Umgang mit dynamischen Bäumen zu verdeutlichen. Die Klasse MessageBox ist eine einfache In-Memory-Tabelle aus SimpleMessages, von denen jede eine Long-ID-Nummer, ein Elternelement (das eine ID oder Null sein kann) sowie eine Liste von Mitteilungs-IDs umfasst, die die jeweilige Mitteilung als Elternelement besitzen. In der Praxis könnte die MessageBox ein dauerhafter Mitteilungsspeicher sein, hinter dem eine Datenbank oder ein mit einem entfernten Dienst interagierender Netzwerk-Client steht. An dieser Stelle genügt es jedoch zu wissen, dass die MessageBox über Methoden wie getNumberOfCommentingMessages() und getChildMessageId() verfügt, mithilfe derer eine Anwendung unter Nutzung einer Long-ID in den Mitteilungs-Threads navigieren kann. Die MessageBox besitzt hier keinen Baum; es gibt keine „root message“, mit der alle Elemente verknüpft sind.
Mit einem Root-Knoten wäre das Erstellen des TreeModel viel unproblematischer. Das Modell könnte einfach die Root-ID der MessageBox ausgeben, wenn es nach dem Root gefragt wird, und die anderen TreeModel-Methoden könnten die ID als Objektparameter verwenden und die Anfrage einfach an die MessageBox weitergeben. Das es nun aber keinen Root-Knoten gibt, muss ein solcher simuliert werden. In dem MessageBoxTreeModel gibt der Aufruf an getRoot ein Dummy-Objekt aus, das speziell dazu dient, den Root zu bezeichnen. Das MessageBoxTreeModel führt eine ArrayList der ihm bekannten Mitteilungen ohne Elternelement und greift auf dieses Array zurück, wenn es nach dem Root gefragt wird. Ein Beispiel hierfür ist der Aufruf getChild: Er prüft, ob das Elternelement tatsächlich das Root-Objekt ist. Wenn ja, dann gibt er einen Wert aus dem Array aus, andernfalls fragt er die MessageBox nach Resultaten ab.
Wenn die Bäume statisch wären, könnte man zur Implementierung eines Modells einfach diese Art von Umweg für isLeaf, getChildCount und getIndexOfChild anwenden.
Die MessageBox benachrichtigt jedoch auch bestimmte Listener, wenn Mitteilungen hinzugefügt oder gelöscht werden. Dieser Vorgang soll anhand der Methode newMessage() im MessageBoxTreeModel verdeutlicht werden. Die MessageBox liefert lediglich die ID einer neuen Mitteilung an den Listener. Als Erstes muss man daher die Mitteilungs-ID des Elternelements in der MessageBox überprüfen. Ist das Elternelement gleich Null, fügt man die ID zu der Array-Liste für Root hinzu und stellt fest, an welcher Stelle die ID in die Liste eingefügt wurde. Ist das Elternelement dagegen nicht Null, fragt man bei der MessageBox einfach einen Index-Wert ab. Nun fehlt zur Benachrichtigung über eine Änderung nur noch ein TreePath für die Elternelement-Mitteilung. Ein TreePath ist eine Liste aus Knoten-Objekten, die vom Root bis zu einem bestimmten Punkt im Baum verlaufen, wobei alle Zwischenkonten aufgelistet werden. Im hier verwendeten Beispiel ist eine eigene getTreePath()-Methode vorhanden. Wenn das an getTreePath() übergebene Objekt ein Root-Objekt ist, kann man auch hier das Verfahren abkürzen und einen TreePath ausgeben, der nur den Root enthält. Andernfalls geht man die Liste der Elternelemente nach oben hin durch (wobei man erneut die Baum-Beziehung bei der MessageBox anfragt) und fügt dabei so lange die jeweiligen Knoten zu einer Liste hinzu, bis keine Elternelemente mehr übrig sind. Dann kann der Root am Ende der Liste gekennzeichnet, die Liste umgedreht und daraus dann ein TreePath erstellt werden.
Neueste Kommentare
Noch keine Kommentare zu Swing-Bäume leicht gemacht
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.