2009-05-06 8 views
10

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?

+0

Dies ist ein veralteter und weniger informativer Thread als dieses Duplikat: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal

Antwort

0

Solange es noch ein Baum ist, den Sie anzeigen, dann TreeModel, die Sie filtert vorhandene TreeModel sollte einfach genug sein.

+0

Können Sie das weiter erklären? –

+0

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). –

+1

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. –

0

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.

+0

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

8

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 gefilterte TreeModel von Grund auf neu. Klonen Sie jeden Knoten, der sichtbar sein soll, und fügen Sie ihn dem ersten sichtbaren Vorgänger in der gefilterten TreeModel (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 gefilterten TreeModel hinzu. Wenn sich das Modell ändert, speichere ich die erweiterten Pfade in der JTree (mit getExpandedDescendants()), und erweitern Sie sie später (mit SwingUtilities.invokeLater()).

    Ich musste equals() in der TreeNode 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); 
     } 
    } 
    } 
2

Haben Sie JXTree versucht? (leider ist die Website jetzt down, aber Sie können nach Spiegeln googeln)

+0

Eigentlich wurde die Unterstützung von Filtern in JXTree nie implementiert, obwohl es geplant war. Ich sehe nur ein geschütztes, ungenutztes Feld über das Filtern im Quellcode. – gouessej

1

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.

+0

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. –

+0

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

+0

Soweit ich mich erinnere, hatte ich Probleme, das Jide Tree Model zu bekommen, um die sichtbaren Kinder von unsichtbaren Eltern zu zeigen. –

3

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.)

+0

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

+0

@gouessej es im Ordner Erweiterungen: https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo

+1

Danke, aber es arbeitet an Baumtischen, nicht an Bäumen. – gouessej

1

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.

+0

Ich musste vor kurzem die Filterung in einem JTree implementieren und diese Lösung war bei weitem die sauberste und einfachste. – Aaron

Verwandte Themen