Ich habe ein Datenobjekt in einer TreeModel
vertreten, und ich möchte nur einen Teil davon in meiner JTree
zeigen - um der Argumentation gerecht zu werden, sagen die Blätter und ihre Eltern. Wie kann ich die unnötigen Knoten verstecken/filtern?Knoten in einem JTree ausblenden/filtern?
Antwort
Solange es noch ein Baum ist, den Sie anzeigen, dann TreeModel
, die Sie filtert vorhandene TreeModel
sollte einfach genug sein.
Können Sie das weiter erklären? –
Was möchten Sie wissen? Sie werden es einfacher finden, Beispiele zu finden, die TableModel ähnlich machen. Sie möchten ein TreeModel erstellen, das an Ihr aktuelles Modell delegiert, aber die Knoten entfernt, die nicht angezeigt werden sollen.Ich schlage vor, zumindest damit zu beginnen, dass Sie das ganze Ereignis als "structureChanged" propagieren (obwohl wir darüber nachdenken, dass die Baumerweiterung zusammenbricht). –
Ein Teil des Problems besteht darin, dass durch das Entfernen von Knoten, die nicht angezeigt werden sollen, auch die untergeordneten Elemente entfernt werden, auch wenn ich sie möglicherweise anzeigen möchte. –
Nutzen Sie den Code, den Sie zum Erstellen Ihrer TreeNode (s) verwenden, und erstellen Sie die TreeNode (s) nur mit den gewünschten Elementen neu. Legen Sie den Stammknoten im TreeModel mit dem gefilterten Stammknoten fest.
Es ist machbar, aber wenn Sie ein anderes Modell einstellen, macht JTree eine Menge Dinge unter der Haube, besonders wenn es eine strukturelle Änderung entdeckt. Es ist nicht sehr gut in Bezug auf die Leistung, sowohl für die Geschwindigkeit und Speicherbedarf. – gouessej
Meine eventuelle Umsetzung:
- Haben zwei
TreeModel
s, die darunterliegende und das gefilterte ein. - Wenn eine Änderung an der zugrunde liegenden
TreeModel
auftritt, erstellen Sie die gefilterteTreeModel
von Grund auf neu. Klonen Sie jeden Knoten, der sichtbar sein soll, und fügen Sie ihn dem ersten sichtbaren Vorgänger in der gefiltertenTreeModel
(oder der Wurzel, wenn keine sichtbar sind) hinzu. Wenn Sie neugierig sind, sehen Sie sich den Code unten an. Dies hat den unglücklichen Nebeneffekt, jeden Pfad, den der Benutzer geöffnet hat, zu reduzieren. Um dies zu umgehen, fügte ich einen
TreeModelListener
zum gefiltertenTreeModel
hinzu. Wenn sich das Modell ändert, speichere ich die erweiterten Pfade in derJTree
(mitgetExpandedDescendants()
), und erweitern Sie sie später (mitSwingUtilities.invokeLater()
).Ich musste
equals()
in derTreeNode
Klasse überschreiben, die ich verwendete, damit die neuen geklonten Knoten die gleichen wie die alten geklonten Knoten waren.
...
populateFilteredNode(unfilteredRoot, filteredRoot);
...
void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode)
{
for (int i = 0; i < unfilteredNode.getChildCount(); i++)
{
TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i);
if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER)
{
populateFilteredNode(unfilteredChildNode, filteredNode);
}
else
{
TreeNode filteredChildNode = unfilteredChildNode.clone();
filteredNode.add(filteredChildNode);
populateFilteredNode(unfilteredChildNode, filteredChildNode);
}
}
}
Wenn Sie nach einer kommerziellen Lösung suchen, hat JideSoft ein filterbares treemodel. Ansonsten hat SwingX eine Filter-API, die auf JXTable, JXTreeTable, JXTree und JXList arbeitet.
Danke! Ich habe es mit dem Jide versucht, aber ich konnte es nicht dazu bringen, das zu tun, was ich wollte. Ich werde in die SwingX API schauen, wenn ich eine Chance bekomme. –
Was genau versuchen Sie zu tun? Wenn Sie Details angeben, kann ich möglicherweise einen bestimmten Code angeben. Soweit ich weiß, werden die gefilterten Blätter der Suchkriterien zusammen mit ihren Eltern angezeigt. Dies wird in ihrer Webstart-Demo unter http://www.jidesoft.com/products/download.htm, "Demo für alle JIDE-Produkte" gezeigt. Schauen Sie sich die QuickFilter (Tree) Demo an. – Aakash
Soweit ich mich erinnere, hatte ich Probleme, das Jide Tree Model zu bekommen, um die sichtbaren Kinder von unsichtbaren Eltern zu zeigen. –
Sie sollten auf GlazedLists achten. Es ist eine fantastische Bibliothek für komplexe Tabellentransformationen mit wenig Aufwand. Sie haben sich auch auf Bäume ausgedehnt. Es kann ein wenig Umgestaltung Ihres vorhandenen Codes erforderlich sein, um es in die Arbeitsweise von GlazedLists zu bringen. Aber schau dir die Demo und die Webcasts an, um zu sehen, wie mächtig es ist. (Es ist eine der wesentlichen Swing-Bibliotheken aus meiner Sicht, und es ist Open Source.)
Ich sehe nichts in GlazedLists für Bäume: https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/modell/glazedlists/swing?rev=2375 Bitte können Sie uns sagen, wo Sie gefunden haben seine Filter-APIs für Bäume? – gouessej
@gouessej es im Ordner Erweiterungen: https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo
Danke, aber es arbeitet an Baumtischen, nicht an Bäumen. – gouessej
Werfen Sie einen Blick auf diese Implementierung: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
Es schafft Subklassen von DefaultMutableNode eine „isVisible“ Eigenschaft Hinzufügen eher dann tatsächlich zu entfernen/Hinzufügen von Knoten aus dem TreeModel.
Ich musste vor kurzem die Filterung in einem JTree implementieren und diese Lösung war bei weitem die sauberste und einfachste. – Aaron
- 1. Drag & Drop-Knoten in JTree
- 2. Beseitigung von Blättern, zwischen Knoten in einem JTree sind
- 3. Wie Pfad zu einem Knoten in JTree speichern?
- 4. JDialog - Aktualisieren dynamisch hinzugefügten Knoten in JTree
- 5. Beschleunigen alle Knoten eines JTree erweitern/reduzieren
- 6. Setze ein Icon auf jeden Knoten in Jtree
- 7. Hinzufügen von vertikalem Abstand zwischen Zeilen in einem JTree?
- 8. Kann ich JTree-Caching-Knoten stoppen (in einer Dateisystemstruktur)?
- 9. Java Swing JTree Expansion
- 10. Aktualisierung von JTree in Java GUI
- 11. Speicherstatus/erweiterte Knoten eines jtree für die Wiederherstellung des Status
- 12. Farbreihen in JTree
- 13. manipulieren jtree Knoten über Referenzen scheint nicht funktioniert (Swing)
- 14. JTree-Verbindungslinien in Substance
- 15. Erweiterten spezifischen JTree-Pfad
- 16. Java: Wie programmgesteuert mehrere Knoten in einem JTree auswählen und erweitern?
- 17. JTree mit Kontrollkästchen
- 18. zeigt Popup-Box auf Rechtsklick auf JTree Knoten Swing
- 19. Swing: Wie könnte ich JTree mit JTextPanes als Knoten verwenden?
- 20. Wie lösche ich ein JTree-Modell? (Entfernen aller Knoten)
- 21. Wie erstellt man einen Knoten mit der Zeichenfolge JTree?
- 22. überschreiben JTree doppelklicken, um Knotenerweiterung zu verhindern?
- 23. wie zu säen Ergebnis mehrere Wortkombination übereinstimmen in jtree Suchfilter jquery (mehrere Wort & Condition in jtree)
- 24. Drag & Drop-Feedback in einem JTree mit benutzerdefinierten TreeCellRenderer (Java, Swing)
- 25. Gibt es eine schnelle Möglichkeit, viele Pfade in einem JTree zu erweitern?
- 26. Wie bekomme ich die Tiefe des aktuellen Knotens in JTree?
- 27. Java Jtree von SQL-Abfrage
- 28. Synchronisieren von JTable und JTree
- 29. Wie zeigt man nur Verzeichnisse in JTree?
- 30. So zeigen Sie Daten in jtree an
Dies ist ein veralteter und weniger informativer Thread als dieses Duplikat: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal