|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
[JAVA NETBEANS] Riempire dinamicamente Jtable
Salve ragazzi avrei un problema con il riempimento dinamico di una Jtable.. Qualcuno mi da un aiuto per riempire una Jtable con per esempio nella prima colonna i nomi dei file presi in una determinata cartella? Grazie mille
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il modo più comprensibile per manipolare una JTable è probabilmente quello di passare per i "micrometodi" del suo modello, supponendo che sia un DefaultTableModel (il modello standard).
JTable table = new JTable(0, 0);//tabella vuota DefaultTableModel model = (DefaultTableModel) table.getModel(); Aggiungo una colonna: model.addColumn("Nome del file"); Adesso la tabella ha una colonna e zero righe. Per aggiungere una riga in fondo alla tabella posso dire: model.setRowCount(model.getRowCount() + 1); Per impostare il valore dell'ultima riga posso dire: model.setValueAt("valore", model.getRowCount() - 1, 0); cioè valore, indice di riga, indice di colonna. Ne consegue che, data una cartella, volendo mostrare i nomi dei file in una tabella potrei dire: Codice:
package test; import java.io.File; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Main implements Runnable { public static void main(String[] args) throws IOException { java.awt.EventQueue.invokeLater(new Main()); } public void run() { File folder = new File(System.getProperty("user.home")); File[] files = folder.listFiles(); JTable table = new JTable(0, 0);//tabella "vuota" DefaultTableModel model = (DefaultTableModel) table.getModel(); model.addColumn("Nome del File"); for (int i = 0; i < files.length; i++) { File file = files[i]; model.setRowCount(model.getRowCount() + 1); model.setValueAt(file.getName(), model.getRowCount() - 1, 0); } JScrollPane tableScroller = new JScrollPane(table); JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.add(tableScroller); frame.pack(); frame.setVisible(true); } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
Il problema e' il fatto di lavorare con netbeans e cosi la tabella non viene aggiornata.. Come risolvo?
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
L'editor visuale dichiara la tabella come campo di istanza. Se non l'hai rinominata sarà qualcosa tipo "jTable1". Dopo l'initComponents, invocato nel costruttore, con quel "jTable1" puoi fare quello che preferisci, incluso lavorare col modello come indicato. Ad esempio puoi dire:
Codice:
costruttore() { initComponents(); DefaultTableModel model = new DefaultTableModel(0, 0); jTable1.setModel(model); model.addColumn("pippo"); //eccetera
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
Con l ultimo suggerimento ha funzionato
![]() ![]() |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
Sulla gestione di un Jtree sai dirmi qualcosa?
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Be', non mi sembra il luogo per una dissertazione di carattere generale
![]()
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#8 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
Avere la gerarchia delle cartelle del file system nell albero
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Anche lì puoi sfruttare il fatto che un jtree predefinito usa come modello un DefaultTreeModel (se butti l'occhio alla doc vedrai che ha un tot di metodi utili) e lavora su nodi di tipo DefaultMutableTreeNode.
Nota che quello che è mostrato in un JTree predefinito è l'invocazione del metodo toString sullo userObject di ciascun DefaultMutableTreeNode, quindi se usi un file come userObject dei tuoi nodi vedrai il percorso completo del file, se usi solo il nome vedi solo il nome. Di norma conviene usare un wrapper per lo user object, tipo: Codice:
public class FileWrapper { public final File file; public FileWrapper(File file) { this.file = file; } public String toString() { return file.getName(); } } Qui trovi degli esempio d'uso di JTree http://www.apl.jhu.edu/~hall/java/Sw...ial-JTree.html http://www.java2s.com/Code/Java/Swin...reeexample.htm http://java.sun.com/docs/books/tutor...ents/tree.html
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#10 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
Ho guardato i tuoi link e sono utili solo che ho problemi nell'implementazione in netbeans
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Con netbeans crei l'albero e lo piazzi nella gui. Dopodichè lo maneggi come fai con la tabella, solo che per l'albero usi DefaultTreeModel. Netbeans ti crea il campo - in ipotesi - jTree1. Nell'initComponents lo inizializza e lo inserisce nella gui dove gli hai detto di metterlo. Subito dopo l'initComponents puoi fargli di tutto e di più. Ad esempio, dovendo caricare le cartelle che stanno in un certo file puoi dire:
Codice:
...costruttore() { initComponents(); File rootFile = qualche cartella DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(rootFile); for(File f : rootFile.listFiles()) { if(f.isDirectory()) rootNode.add(new DefaultMutableTreeNode(f))); } DefaultTreeModel model = new DefaultTreeModel(root); jTree1.setModel(model);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#12 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
il problema e' che in netbeans l albero vuole un paramentro in ingresso come root all'inizio quando viene inizializzato; ed e' li lo scoglio che non riesco a superare
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il tuo netbeans è diverso dal mio
![]() Apri la finestra in modalità "design", trascini un "Tree" dalla finestra "Palette" sezione SwingControls nel contenitore dove vuoi metterlo. Appare un albero con un po' di voci (JTree, colors, sports, food). Vai in source, costruttore, dopo l'init components puoi mettere quello che preferisci.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#14 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
:i infatti ora funziona
![]() |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
La questione è un po' lunga da spiegare ma alla fine basterebbe un metodo ricorsivo che attraversi le cartelle (File) e richieda in più un DefaultMutableTreeNode come argomento.
Il fatto è che non è buona idea perchè un filesystem può richiedere diverso tempo (secondi o minuti) per poter essere attraversato completamente, il che ammazzerebbe i tempi di risposta della tua gui. Se è necessario che il tuo programma abbia a disposizione l'albero completo del filesystem allora devi separare la scansione dalla pubblicazione dei nodi nell'albero: la prima la fai con un pool di thread in background, la seconda con l'edt (il thread che maneggia le gui awt/swing). Se, come è più probabile, non ti interessa l'albero completo ma solo la parte attualmente visibile all'utente allora carichi solo le radici e quando l'utente espande una cartella, carichi i file/cartelle che quella contiene. Per intercettare l'espansione del nodo puoi usare il metodo addTreeExpansionListener o il metodo addTreeWillExpandListener: a te interessa più il secondo perchè devi creare i nodi prima che la cartella sia "aperta". L'ascoltatore di eventi che registri col metodo predetto avrà nel suo metodo di gestione un procedimento così composto (ad esempio): 1. prendi il file del nodo-cartella 2. carica la lista L di file contenuti in quella cartella (file.listFiles()) 3. prendi tutti i figli N del nodo-cartella 4. per ogni nodo di N che non ha una controparte in L (file spostato o rimosso o rinominato) -> elimina il nodo dal nodo-cartella 5. per ogni file di L che non ha una controparte in N (nuovo file o primo caricamento) -> aggiungi un nuovo nodo al nodo-cartella Inserimenti e rimozioni si fanno passando per il modello dell'albero, nel presupposto che sia un DefaultTreeModel: DefaultTreeModel model = (DefaultTreeModel) jTree1.getModel(); 4. rimozione model.removeNodeFromParent(il nodo da rimuovere) 5. inserimento DefaultMutableTreeNode nuovo = new DefaultMutableTreeNode(il file); model.insertNodeInto(nuovo, il nodo della cartella) E' necessario passare per il modello (tree.getModel()) altrimenti la vista (il JTree) non riflette le mutazioni che potresti applicare direttamente ai nodi (puoi aggiungere o rimuovere nodi passando direttamente per DefaultMutableTreeNode ma se non avverti il modello il JTree resterà tale e quale).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#16 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
mmm... Non sembra difficile da implementare... Devo provare e sperare di riuscire senza fare casini.. No esistono tutorial o spezzoni di codice?
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
C'è un esempio completo che centra in pieno il bersaglio:
http://www.java2s.com/Code/Java/Swin...aJTreeview.htm
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#18 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
Ma scrivendo il codice l'albero resta con i nomi di default
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
So che non si risponde ad una domanda con un'altra domanda, quindi ne faccio due: cosa intendi per nomi di default e di codice parliamo?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#20 |
Junior Member
Iscritto dal: Jul 2010
Messaggi: 16
|
allora se in designe faccio click di dx sull labero e vado in customize code nell'inizializzazione dell albero devo mettere quale sara' il root giusto? Quindi lo devo dichiare prima dell'init non dopo
/* Ho risolto il problema qui sopra.. l''atro probelam resta il fatto di navigare nel Jtree, ho problemi a richiamarlo ricorsivamente */ Ultima modifica di alfo1 : 30-04-2011 alle 11:15. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:58.