2009-05-06 10 views
10

Ho un oggetto di dati rappresentato in un TreeModel, e mi piacerebbe mostrare solo una parte di esso nella mia JTree --per amor di discussione, dicono le foglie ed i loro genitori. Come posso nascondere/filtrare i nodi non necessari?Nascondere/filtrare i nodi in un JTree?

+0

questo è un thread obsoleto e meno informativo di questo duplicato: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal

risposta

0

Fintanto che è ancora visualizzato un albero, quindi TreeModel che filtra lo esistente TreeModel dovrebbe essere abbastanza semplice.

+0

Puoi spiegarlo ulteriormente? –

+0

Cosa vuoi sapere. Troverai più facile trovare esempi che facciano lo stesso a TableModel. Si desidera creare un TreeModel che delega al modello corrente, ma rimuove i nodi che non si desidera visualizzare.Suggerisco, almeno per cominciare, di far propagare tutto l'evento come structureChanged (anche se ci penso che ciò farà crollare l'espansione dell'albero). –

+1

Parte del problema è che "la rimozione dei nodi che non voglio visualizzare" rimuove anche i loro figli, anche se potrei volerli mostrare. –

0

Leverage il codice da utilizzare per costruire la vostra TreeNode (s) e ricostruire il TreeNode (s) solo inclusi gli elementi che si desidera. Impostare il nodo root su TreeModel con il nodo root filtrato.

+0

È fattibile, ma quando si imposta un altro modello, JTree fa un sacco di cose sotto il cofano, soprattutto se rileva un cambiamento strutturale. Non è molto buono in termini di prestazioni, sia per la velocità che per l'ingombro della memoria. – gouessej

8

mio eventuale applicazione:

  • hanno due TreeModel s, il sottostante uno e l'filtrato uno.
  • Quando si verifica un cambiamento sul sottostante TreeModel, ricostruire il filtrato TreeModel da zero. Clona ogni nodo che dovrebbe essere visibile e aggiungilo al suo primo antenato visibile nel filtro TreeModel (o nella radice se nessuno è visibile). Vedi il codice qui sotto, se sei curioso.
  • Questo ha lo sfortunato effetto collaterale di collassare ogni percorso che l'utente aveva aperto. Per aggirare questo, ho aggiunto un TreeModelListener al filtrato TreeModel. Quando il modello cambia, salverò i percorsi espansi nel JTree (usando getExpandedDescendants()), quindi li espanderò più tardi (usando SwingUtilities.invokeLater()).

    ho dovuto ignorare equals() nella classe TreeNode stavo usando in modo che i nuovi nodi clonati sarebbero stati gli stessi come i vecchi nodi clonati.


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

Hai provato JXTree? (Purtroppo il sito è giù in questo momento, ma è possibile google per gli specchi)

+0

In realtà, il supporto dei filtri in JXTree non è mai stato implementato anche se era stato pianificato, vedo solo un campo protetto inutilizzato sul filtraggio nel suo codice sorgente. – gouessej

1

Se siete alla ricerca di una soluzione commerciale, JideSoft ha un TreeModel filtrabile. Oltre a ciò, SwingX ha un'API Filter che funziona su JXTable, JXTreeTable, JXTree e JXList.

+0

Grazie! Ho provato quello di Jide, ma non riuscivo a farlo fare quello che volevo. Cercherò l'API SwingX quando avrò la possibilità. –

+0

Che cosa stai cercando di fare esattamente? Se fornisci dettagli, potrei essere in grado di fornire un codice specifico. Da quanto ho capito, verranno mostrate le foglie filtrate dai criteri di ricerca, insieme ai loro genitori. Questo è mostrato nella loro demo webstart, all'indirizzo http://www.jidesoft.com/products/download.htm, "Demo per tutti i prodotti JIDE". In questo, guarda la Demo di QuickFilter (Albero). – Aakash

+0

Come ricordo, stavo avendo problemi a ottenere il modello dell'albero Jide per mostrare i figli visibili di genitori invisibili. –

3

È necessario essere consapevoli di GlazedLists. È una libreria fantastica per fare trasformazioni complesse con poco sforzo. Inoltre si sono espansi anche sugli alberi. Potrebbe richiedere un piccolo refactoring del codice esistente per farlo entrare nel modo di lavorare di GlazedLists. Ma controlla la demo e i webcast per vedere quanto è potente. (E 'una delle biblioteche di Swing essenziali nel mio punto di vista, ed è open source.)

+0

Non vedo nulla in GlazedLists per gli alberi: https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/odell/glazedlists/swing?rev=2375 Per favore, puoi dirci dove hai trovato le sue API di filtraggio per gli alberi? – gouessej

+0

@gouessej è all'interno della cartella estensioni: https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo

+1

Grazie, ma lavora su tavoli sugli alberi, non sugli alberi. – gouessej

1

Date un'occhiata a questa implementazione: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm

Crea sottoclassi di DefaultMutableNode aggiunta di una proprietà "IsVisible" piuttosto che in realtà la rimozione/aggiungere nodi da TreeModel.

+0

Recentemente ho avuto bisogno di implementare il filtraggio in un JTree e questa soluzione era di gran lunga la più pulita e semplice. – Aaron

Problemi correlati