Problem
Anwendung der Filterung auf eine JTree
um zu vermeiden, dass bestimmte Knoten/Blätter in der gerenderten Version des Dokuments auftauchen JTree
. Idealerweise suche ich nach einer Lösung, die einen dynamischen Filter ermöglicht, aber ich wäre schon froh, wenn ich einen statischen Filter zum Laufen bringen könnte.
Um es etwas einfacher zu machen, nehmen wir an, die JTree
unterstützt nur das Rendering, aber nicht die Bearbeitung. Das Verschieben, Hinzufügen und Entfernen von Knoten sollte möglich sein.
Ein Beispiel ist ein Suchfeld oberhalb einer JTree
und bei der Eingabe der JTree
würde nur den Teilbaum mit Übereinstimmungen anzeigen.
Ein paar Einschränkungen: Es soll in einem Projekt verwendet werden, das Zugriff auf JDK und SwingX hat. Ich möchte vermeiden, andere Drittanbieter-Libs einzubeziehen.
Ich hatte bereits einige mögliche Lösungen im Kopf, aber keine davon schien mir ideal
Zugänge
Modellbasierte Filterung
- schmücken die
TreeModel
um einige der Werte herauszufiltern. Eine schnelle und einfache Version ist leicht zu schreiben. Filtern Sie Knoten heraus, und bei jeder Änderung des Filters oder des DelegatenTreeModel
kann der Dekorator ein Ereignis auslösen, das besagt, dass sich der gesamte Baum geändert hat (treeStructureChanged
mit dem Wurzelknoten als Knoten). Kombinieren Sie dies mit Listenern, die den Auswahlstatus und den Expansionsstatus desJTree
und Sie erhalten eine Version, die mehr oder weniger funktioniert, aber die Ereignisse, die von derTreeModel
sind verkorkst. Dies ist mehr oder weniger der Ansatz, der in diese Frage - schmücken die
TreeModel
sondern versuchen, die richtigen Ereignisse auszulösen. Ich habe (noch) nicht geschafft, mit einer funktionierenden Version von diesem zu kommen. Es scheint eine Kopie des Delegaten zu benötigenTreeModel
um ein Ereignis mit den richtigen Child-Indizes auslösen zu können, wenn Knoten aus dem Delegatenmodell entfernt werden. Ich denke, mit etwas mehr Zeit, die ich bekommen konnte, dies zu arbeiten, aber es fühlt sich einfach falsch (Filtern fühlt sich wie etwas die Ansicht tun sollte, und nicht das Modell) - dekorieren, welche Datenstruktur auch immer verwendet wurde, um die ursprüngliche
TreeModel
. Dies ist jedoch komplett nicht wiederverwendbar und wahrscheinlich genauso schwierig wie einen Dekorator für eineTreeModel
Ansichtsbasierte Filterung
Dies scheint der richtige Weg zu sein. Die Filterung sollte sich nicht auf das Modell, sondern nur auf die Ansicht auswirken.
-
Ich habe einen Blick auf
RowFilter
Klasse. Obwohl die Javadoc vorzuschlagen scheint, dass man sie in Kombination mit einerJTree
:Wenn ein Eintrag mit einem JTree verbunden ist, entspricht er einem Knoten.
Ich konnte keine Verbindung finden zwischen
RowFilter
(oderRowSorter
) und dieJTree
Klasse. Die Standardimplementierungen vonRowFilter
und die Swing-Tutorials scheinen darauf hinzudeuten, dassRowFilter
kann nur direkt mit einerJTable
(sieheJTable#setRowSorter
). Es gibt keine ähnlichen Methoden auf einerJTree
-
Ich habe mir auch die
JXTree
javadoc. Es hat eineComponentAdapter
verfügbar und die Javadoc vonComponentAdapter
zeigt eineRowFilter
mit der Zielkomponente interagieren könnte, aber ich weiß nicht, wie ich die Verbindung zwischen derRowFilter
und dieJTree
-
Ich habe mir noch nicht angesehen, wie ein
JTable
übernimmt die Filterung mitRowFilter
s, und vielleicht kann dasselbe auch mit einer modifizierten Version einesJTree
.
Kurz gesagt: Ich habe keine Ahnung, wie ich dieses Problem am besten lösen kann.
Hinweis: Diese Frage ist eine mögliche Wiederholung von diese Frage aber diese Frage ist immer noch unbeantwortet, die Frage ist ziemlich kurz und die Antworten scheinen unvollständig zu sein, also dachte ich, ich stelle eine neue Frage. Wenn dies nicht geschieht (die FAQ haben keine klare Antwort darauf gegeben), werde ich diese 3 Jahre alte Frage aktualisieren