Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Salvare Modifiche Jtable

    Ciao a tutti.

    Devo salvare le modifiche che faccio sugli elementi contenuti in un DefaultTableModel di JTable.

    In pratica la tabella contiene elementi che sono presenti in una TreeSet.

    Quando faccio doppio click su su una cella ,ne modifico il contenuto , e premo invio per confermare la modifica, come faccio a ricavare il contenuto modificato per poi aggiornare anche l'elemento modificato nella TreeSet?

    Qualcuno mi aiuta?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Quando faccio doppio click su su una cella ,ne modifico il contenuto , e premo invio per confermare la modifica, come faccio a ricavare il contenuto modificato per poi aggiornare anche l'elemento modificato nella TreeSet?
    Quando la cella è in edit e premi invio, la editazione termina e il valore viene inviato al table model, ovvero viene invocato il setValueAt sul TableModel. Se vuoi "ascoltare" questo evento di modifica, una possibilità è registrare un TableModelListener sul TableModel. Ma le problematiche sarebbe due: innanzitutto devi "dedurre" tu cosa/dove è stato modificato andando a ispezionare il TableModelEvent e secondo, se all'inizio inizializzi tu qualcosa nel table model con setValueAt, se il listener è già registrato, pure le tue modifiche programmatiche scatenano l'evento tableChanged.

    Inoltre dovresti precisare come è fatta la tabella e in che modo le celle sono in relazione al TreeSet e cosa contiene il TreeSet (oggetti String?). Tieni anche presente che TreeSet è solo un "insieme" di elementi e non c'è una "chiave" di accesso (come per le Map). Quindi se il TreeSet contiene un oggetto X ben preciso, quell'oggetto X non lo puoi riottenere velocemente basandoti su qualcosa. Se vuoi riavere il reference a quell'esatto oggetto X, devi scansionare in qualche modo il TreeSet.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Inoltre dovresti precisare come è fatta la tabella e in che modo le celle sono in relazione al TreeSet e cosa contiene il TreeSet (oggetti String?). Tieni anche presente che TreeSet è solo un "insieme" di elementi e non c'è una "chiave" di accesso (come per le Map). Quindi se il TreeSet contiene un oggetto X ben preciso, quell'oggetto X non lo puoi riottenere velocemente basandoti su qualcosa. Se vuoi riavere il reference a quell'esatto oggetto X, devi scansionare in qualche modo il TreeSet.
    Il mio TreeSet contiene Oggetti di tipo Articolo .

    La tabella contiene per ogni colonna i valori dei campi di Articolo ossia : Tipologia ,Marca , Modello ecc..,
    Ogni riga della tabella rappresenta un oggetto Articolo presente anche nella TreeSet;

    Quello che volevo ottenere è questo :

    Seleziono la cella (Il campo in questo caso) dell'articolo che voglio modificare facendo doppio click ;
    Ne modifico il contenuto ;
    Premo Invio ;

    Quando premo Invio vorrei modificare anche la TreeSet .
    Credo debba modificare l'ascoltatore che ascolta la pressione del tasto invio e dire di dover modificare anche la TreeSet.
    Il problema è che non so come procedere ; Quale metodo di DefaultTableModel Modificare ;

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Il mio TreeSet contiene Oggetti di tipo Articolo .

    La tabella contiene per ogni colonna i valori dei campi di Articolo ossia : Tipologia ,Marca , Modello ecc..,
    Ogni riga della tabella rappresenta un oggetto Articolo presente anche nella TreeSet;
    Ok, ora è sufficientemente chiaro!

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Quando premo Invio vorrei modificare anche la TreeSet .
    Il mio primo dubbio è: perché devi modificare subito il TreeSet? Cosa devi poi farci con il TreeSet? Quando dovrai poi usarlo?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il mio primo dubbio è: perché devi modificare subito il TreeSet? Cosa devi poi farci con il TreeSet? Quando dovrai poi usarlo?

    Dovrò usarlo per esempio per caricare gli elementi salvati ;
    In pratica non ho serializzato il DefaultTableModel , è la TreeSet ed essere salvata su disco ;
    Quando carico gli elementi , scansiono la treeset e riempo il DefaultTableModel.


    Si potevo serializzare direttamente il model ma è complicato spiegare perchè non l'ho fatto , diciamo che ho utilizzato treeset perchè trovo un elemento più semplicemente.


    Ti Spiego la logica che ho in mente per fare la modifica :


    1) Faccio doppio click sulla cella da modificare.
    2) Quando faccio doppio click sulla cella prendo come riferimento per la ricerca in TreeSet il valore contenuto nella cella relativa al campo codice articolo (questo perchè il codice articolo è unico per ogni articolo e quindi è adatto come riferimento per la ricerca).
    3) Modifico la cella e premo Invio
    4) Premendo invio modifico anche i campi dell'articolo presente in TreeSet.


    Vabbè i dettagli della modifica penso non siano necessari a spiegarli.


    Dovrei modificare il metodo che edita la cella . Non so quale è e come è scritto

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Si potevo serializzare direttamente il model ma è complicato spiegare perchè non l'ho fatto , diciamo che ho utilizzato treeset perchè trovo un elemento più semplicemente.
    No, non sarebbe stata comunque una buona idea serializzare un DefaultTableModel. Innanzitutto salva una marea di roba (ricorda sempre che ha una struttura più complessa, è un Vector di Vector di oggetti) e comunque così facendo perderesti la nozione di "articolo", avresti tanti oggettini dei dati "sfusi" e basta.

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    1) Faccio doppio click sulla cella da modificare.
    2) Quando faccio doppio click sulla cella prendo come riferimento per la ricerca in TreeSet il valore contenuto nella cella relativa al campo codice articolo (questo perchè il codice articolo è unico per ogni articolo e quindi è adatto come riferimento per la ricerca).
    3) Modifico la cella e premo Invio
    4) Premendo invio modifico anche i campi dell'articolo presente in TreeSet.
    Ok, cerco di essere più chiaro: perché vuoi complicarti la vita in questo modo? Il TreeSet lo dovrai salvare solo in un secondo momento .... non ogni volta che l'utente aggiorna una cella ... no? È questo che intendevo.

    Presumo tu abbia un tasto es. "Salva" che farà serializzare su file il TreeSet ... giusto? Bene: solo quando l'utente decide di salvare, prendi i dati riga per riga, ricrei dei nuovi oggetti Articolo e li metti in un TreeSet. Non credo (a meno che ci siano requisiti precisi che non conosco) che tu debba mantenere la "identità" degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo alcune cose. La soluzione migliore in assoluto sarebbe stata quella di implementare un apposito table model che gestisce direttamente gli oggetti Articolo. Se non puoi/vuoi scegliere questa strada, ok, ci sono comunque altre soluzioni, anche se meno "belle".

    Prima che ero a pranzo e ci stavo pensando ..... mi è anche venuto in mente che puoi risolvere come dicevi tu (cioè modificare gli oggetti Articolo al "volo" alla modifica di una singola cella) ma passando per un List, invece che direttamente sul TreeSet.

    In pratica, appena hai il TreeSet, crei anche un List, es. ArrayList. Non c'è da fare nulla di complicato o chissà cosa .... basta il costruttore:

    ArrayList<Articolo> listArticoli = new ArrayList<Articolo>(treesetArticoli);

    Gli oggetti nel ArrayList sono gli stessi che hai anche nel TreeSet. Solo che ora gli oggetti sono facilmente accessibili per "indice". Quando una cella viene modificata, sapendo la riga, vai a modificare l'Articolo a quell'indice nel ArrayList.

    Ti rimane solo da implementare il TableModelListener e andare a vedere come interpretare la modifica di una cella dal TableModelEvent.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Già forse mi sto complicando un pò la vita....
    Credo opterò per aggiungere un tasto Salva anzichè salvare al volo tutti i cambiamenti (Rimozioni Modifiche....).
    Come scandisco il table model?

    Ad ogni modo...volendo seguire la strada del salvataggio "al volo" .... (Prenderei un voto più alto forse consegnando il progetto con questa particolarità)
    Come implemento Il TableModelListener per ricavare il valore della cella modificata?
    Potresti farmi qualche esempio?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Già forse mi sto complicando un pò la vita....
    Credo opterò per aggiungere un tasto Salva anzichè salvare al volo tutti i cambiamenti (Rimozioni Modifiche....).
    Come scandisco il table model?
    Sapendo il numero di righe (lo sai dal table model) e conoscendo a priori quante/quali sono le colonne (perché le hai "cablate" tu in quel modo), fai un ciclo for per le righe. Poi con getValueAt sul table model prendi i dati dalle celle.

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Ad ogni modo...volendo seguire la strada del salvataggio "al volo" .... (Prenderei un voto più alto forse consegnando il progetto con questa particolarità)
    Come implemento Il TableModelListener per ricavare il valore della cella modificata?
    Potresti farmi qualche esempio?
    TableModelListener ha un solo metodo: tableChanged, quindi non è certo questa la difficoltà. Il TableModelEvent invece può descrivere vari tipi di cambiamenti. Per il cambiamento di una sola cella, dovrebbe bastare verificare:
    - il type deve essere UPDATE.
    - firstRow e lastRow sono uguali (quindi una sola cella a questa riga).
    - column è la colonna.

    Vedi javadoc di TableModelEvent, ci sono i getter per questi dati.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Ho buttato giù questo (non è completo) ;

    codice:
    package Ascoltatori;
    
    
    import interfacciaGrafica.InterfacciaPrincipale;
    
    
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    
    
    public class ascoltatoreDefaultTableModel implements TableModelListener {
    	
    TableModelEvent tme = new TableModelEvent(InterfacciaPrincipale.modelloJTable , InterfacciaPrincipale.Jtable.getSelectedRow() , InterfacciaPrincipale.Jtable.getSelectedRow() , InterfacciaPrincipale.Jtable.getSelectedColumn() , TableModelEvent.UPDATE );
    
    
    	@Override
    	public void tableChanged(TableModelEvent tme) {
    				
    	}
    	
    }
    nel metodo tableChanged devo implementare il meccanismo per fare la modifica?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.