34 Stimmen

Filtern in einem JTree

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 Delegaten TreeModel 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 des JTree und Sie erhalten eine Version, die mehr oder weniger funktioniert, aber die Ereignisse, die von der TreeModel 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ötigen TreeModel 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 eine TreeModel

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 einer JTree :

    Wenn ein Eintrag mit einem JTree verbunden ist, entspricht er einem Knoten.

    Ich konnte keine Verbindung finden zwischen RowFilter (oder RowSorter ) und die JTree Klasse. Die Standardimplementierungen von RowFilter und die Swing-Tutorials scheinen darauf hinzudeuten, dass RowFilter kann nur direkt mit einer JTable (siehe JTable#setRowSorter ). Es gibt keine ähnlichen Methoden auf einer JTree

  • Ich habe mir auch die JXTree javadoc. Es hat eine ComponentAdapter verfügbar und die Javadoc von ComponentAdapter zeigt eine RowFilter mit der Zielkomponente interagieren könnte, aber ich weiß nicht, wie ich die Verbindung zwischen der RowFilter und die JTree

  • Ich habe mir noch nicht angesehen, wie ein JTable übernimmt die Filterung mit RowFilter s, und vielleicht kann dasselbe auch mit einer modifizierten Version eines JTree .

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X