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?
risposta
Fintanto che è ancora visualizzato un albero, quindi TreeModel
che filtra lo esistente TreeModel
dovrebbe essere abbastanza semplice.
Puoi spiegarlo ulteriormente? –
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). –
Parte del problema è che "la rimozione dei nodi che non voglio visualizzare" rimuove anche i loro figli, anche se potrei volerli mostrare. –
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.
È 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
mio eventuale applicazione:
- hanno due
TreeModel
s, il sottostante uno e l'filtrato uno. - Quando si verifica un cambiamento sul sottostante
TreeModel
, ricostruire il filtratoTreeModel
da zero. Clona ogni nodo che dovrebbe essere visibile e aggiungilo al suo primo antenato visibile nel filtroTreeModel
(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 filtratoTreeModel
. Quando il modello cambia, salverò i percorsi espansi nelJTree
(usandogetExpandedDescendants()
), quindi li espanderò più tardi (usandoSwingUtilities.invokeLater()
).ho dovuto ignorare
equals()
nella classeTreeNode
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);
}
}
}
Hai provato JXTree? (Purtroppo il sito è giù in questo momento, ma è possibile google per gli specchi)
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
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.
Grazie! Ho provato quello di Jide, ma non riuscivo a farlo fare quello che volevo. Cercherò l'API SwingX quando avrò la possibilità. –
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
Come ricordo, stavo avendo problemi a ottenere il modello dell'albero Jide per mostrare i figli visibili di genitori invisibili. –
È 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.)
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
@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
Grazie, ma lavora su tavoli sugli alberi, non sugli alberi. – gouessej
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.
Recentemente ho avuto bisogno di implementare il filtraggio in un JTree e questa soluzione era di gran lunga la più pulita e semplice. – Aaron
- 1. JTree: selezione programmata di tutti i nodi
- 2. Come cancellare un modello JTree? (Rimozione di tutti i nodi)
- 3. Trascinare e rilasciare nodi in JTree
- 4. Come ottenere tutti i child del nodo root in jtree?
- 5. aggiornamento JTree nella GUI java
- 6. stato del negozio/nodi espansi di un jtree per il ripristino dello stato
- 7. Riga colorata in JTree
- 8. Come posso aggiornare un JTree dopo aver aggiunto alcuni nodi al modello sottostante?
- 9. Jtable come nodo Jtree
- 10. Le etichette dei nodi JTree cambiano spesso ma la larghezza è memorizzata nella cache
- 11. JTree: velocizza il disegno di oltre 1000 nodi figli da oggetti recuperati dal database?
- 12. Espansione del percorso JTree specifico
- 13. Come trovare tutti i nodi in un grafico equidistante da un determinato set di nodi?
- 14. Change Jtree icone dei nodi a seconda del livello di profondità
- 15. Mettere JTable nel JTree
- 16. Aggiunta di padding/spazio verticale tra le righe in un JTree?
- 17. Jenkins: esiste un modo per rimuovere tutti i nodi non in linea (slave)/eliminare i nodi in batch/eliminare tutti i nodi?
- 18. Riordinare i nodi figlio in django-MPTT
- 19. Linee tra i nodi in WPF TreeView
- 20. Recupera i nodi connessi in un grafico NetworkX
- 21. Come cercare un nodo particolare in jtree e far espandere quel nodo.?
- 22. JTree con caselle di controllo
- 23. ricorsivo Query - Solo selezionare nodi in cui i nodi foglia rappresentano i dati attivi
- 24. Scopri i nodi Zeroconf/Bonjour?
- 25. JSON.NET come rimuovere i nodi
- 26. XmlPullParser ottiene i nodi figlio
- 27. Come analizzare i nodi figli?
- 28. saltare i nodi con XSLT
- 29. Ottenere un elenco di tutti i nodi dell'albero (in tutti i livelli) in TreeView Controls
- 30. Come visualizzare un nome e un valore di attributo specifici accanto a un nodo in JTree?
questo è un thread obsoleto e meno informativo di questo duplicato: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal