JTree/TreeModel/DefaultMutableTreeNodes thread safe machen

obscuri

Mitglied
Hey!

Ich habe folgendes wirklich sehr schlecht dokumentiertes Problem. Ich habe einen JTree in einem Thread laufen und der greift auf ein TreeModel zu, dass in einem anderen Thread verändert wird. Mal werden da Nodes hinzugefügt, mal werden welche gelöscht und mal wird der Inhalt eines Nodes geändert.
Mein TreeModel ist ein DefaultTreeModel und in das füge ich DefaultMutableTreeNodes ein. Außerdem habe ich einen TreeSelectionListener implementiert, der eben aus Selektionen im Tree reagiert und zwar liest er das Object des selektierten Nodes aus und gibt es in einem EditorPane aus.
Jetzt kann es eben sein, dass grade ein Node selektiert wird, der gerade vom anderen Thread gelöscht wird oder dessen Inhalt (also das User-Object) geändert wird und das führt eben zu Problemen. In der API steht unter DefaultMutableTreeNode lediglich:
"This is not a thread safe class.If you intend to use a DefaultMutableTreeNode (or a tree of TreeNodes) in more than one thread, you need to do your own synchronizing. A good convention to adopt is synchronizing on the root node of a tree. "
Aber mir ist nicht klar, wie das gehen soll. Weil grade in dem JTree selbst und in dem TreeSelectionListener kenn ich den RootNode ja nicht mal.
Hoffe ihr könnt mir helfen.
Vielen Dank schonmal!
 
Du musst zwischen Domain Model und Präsentation trennen. Ein Tree Model ist sehr GUI spezifisch und daher IMO ungeeignet als Domain Model.
Mach ein Domain Model das nichts mit Swing zu tun hat und keine Tree Nodes kennt. Deine Anwendung operiert nun auf diesem Modell.
Als nächstes übersetzt du dieses Modell für den Tree. Dazu implementierst du die Interfaces und registrierst dich zB als Listener auf dem Domain Model.
Wenn du ein Event vom Domain Model bekommst aktualisierst du den Tree entsprechend über das Swing Event Handling. Das machst du aber nicht in dem Thread der das Domain Model verändert hat, sondern verlagerst es mittels invokeLater in den EDT.
 
Ja sowas habe ich befürchtet ... es läuft zwar jetzt in sagen wir 95% aller Fälle problemlos, aber um es noch auf sagen wir mal 99% zu steigern muss ich jetzt noch soo einen Aufwand betreiben ...

Vielen Dank schonmal für deine Antwort.

Wie genau update ich denn den Tree dann? Mit revalidate() oder wie genau ?
 

Zurück
Oben