„Mühe“ und „Zeug“ sagt erstmal nichts über das Ergebnis aus. Das ganze ist nicht wirklich „engineered“. Ich bin sicher, mit etwas Überlegung und Planung könnte man eine sauberere und bessere Lösung hinbekommen.
(Und, wie so oft, habe ich mir beim Schreiben gedacht: „Ach, das ist eigentlich ganz interessant, und das brauchen bestimmt viele in der einen oder anderen Form - ich muss mir mal die Zeit nehmen, das richtig zu machen, und als Lib auf GitHub zu stellen“. (Vielleicht als kleine, versteckte Unter-Funktionalität neben den JTrees
-Utilities. Vielleicht auch standalone)).
Es gibt da schon einige interessante Fragen.
Das „lazy loading“ ist sehr wichtig. Erstens, weil Festplatten nunmal sehr groß und langsam (!) sind. Und zweitens, weil ich befürchte, dass, wenn man da diese (mir noch etwas unbekannte) FileSystemView
verwendet, dort Zyklen vorkommen könnten. (Sowas wie „Desktop → My Computer → User → Desktop (!!!)“).
Der Fall, dass man gezielt einen Pfad ausklappen will, der (wegen der laziness) zu diesem Zeitpunkt noch gar nicht im Baum enthalten ist, ist auch interessant. Da könnte man überlegen: Angenommen, man hat diese Verzeichnisstruktur:
C:\
Files\
A\
\A0
\A1
\A2
B\
\B0
\B1
\B2
C\
\C0
\C1
\C2
Anfangs sieht man nur das hier im JTree:
C:\
Files\
Nun sagt man, das C:\Files\B\B1
ausgeklappt werden soll. Soll der Tree dann das hier anzeigen:
C:\
Files\
B\
\B1
oder den kompletten Baum? Oder irgendein Mittelding wie
C:\
Files\
A\
B\
\B0
\B1
\B2
C\
???
(Das Problem dabei ist, dass der JTree erstmal keine Metapher hat für "einen Baum, bei dem mehr Kindknoten vorhanden sind, als gerade sichtbar sind…)
Neuere Windows-Versionen versuchen da ja, „schlau“ zu sein: Wenn ein Verzeichnis „viele“ Unterverzeichnisse hat, zeigt der Explorer manchmal nur das an, durch das der gewählte Pfad führt. Die Geschwister muss man händisch aufklappen. (Das finde ich eigentlich nicht so schön, aber bei wirklich vielen Verzeichnissen vielleicht sinnvoll…)
BTW: Das File homePath = new File(System.getProperty("user.home"));
ist im wesentlichen das, was die FileSystemView
intern macht. Aber falls ich mich nicht täusche, hat das bei mir den Desktop zurückgegeben, und nicht das Benutzerverzeichnis. Aber ich muss mir die FileSystemView
nochmal genauer ansehen…
Zum TreeSelectionListener: Ich habe mal gelesen, dass die Berechnung größerer Bäume viel Rechenzeit beanspruchen kann.
Ja, aus verschiedenen Gründen (langsame Platte etc). Man braucht ja nicht den kompletten Baum zu berechnen. Der Unterschied war wirklich nur bezogen auf die Frage: Wann müssen die Kindknoten erstellt werden? Und das muss eigentlich noch nicht passieren, wenn ein Knoten ausgewählt* wird (mit einem TreeSelectionListener
), sondern erst, wenn der Knoten aufgeklappt wird (mit einem TreeWillExpandListener
). Aber der Unterschied könnte nicht soooo wichtig sein.