Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160

    [JAVA] "Ascoltare" modifiche alle righe di una JTable

    Ciao a tutti!

    Ho un problema che non riesco a risolvere. Ho tre tabelle (memorizzate su un DB SQL) che l'utente può modificare a piacimento. Quando l'utente vuole inserire, ad esempio, tre righe preme tre volte il tasto Inserisci, che aggiunge una riga vuota per ogni pressione. Ora vorrei poter registrare tutti i cambiamenti fatti in queste tre nuove righe ed ho scritto una cosa simile che ovviamente non funziona:


    codice:
    final JTable lavTable = db.genTableLav(nome);
    /* Questa è da completare */
    lavTable.getModel().addTableModelListener(new TableModelListener(){
    			public void tableChanged(TableModelEvent e) {
    				int firstRow = e.getFirstRow();
    				int lastRow = e.getLastRow();
    				int index = e.getColumn();
    				Object[][] changedData = new changedData[lastRow-firstRow][3];
    				DefaultTableModel model = (DefaultTableModel) e.getSource();	
    switch(e.getType()){ /* Come faccio a catturare i cambiamenti in un'intera riga? */
    				
    			
    				}
    }
    
    /* Per inserire una riga faccio così */
    insert.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				DefaultTableModel model = (DefaultTableModel)  prevTable.getModel();
    				model.addRow(new Object[2]); /* Inserisco una riga vuota. Non lancio alcun fireTable*() perché prima la riga la inserisco vuota e poi la modifico, per questo mi serve qualcosa che ascolti i cambiamenti di una riga per intero */
    				prevTable.setModel(model);
    				prevTable.repaint();
    			}
    		});
    Il codice sopra non funziona perché ogni volta che premo Inserisci, viene invocata tableChanged() e ogni volta quindi firstRow e lastRow sono uguali; invece io devo fare in modo che quando entro dentro tableChanged() firstRow valga 1 e lastRow valga 3 (facendo sempre l'esempio delle tre righe, ma possono essere anche di più). Come posso fare? Spero di essermi spiegato. Ho in mente una soluzione (cioè di impedire di aggiungere più righe) però sicuramente c'è qualcosa di più elegante.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] "Ascoltare" modifiche alle righe di una JTable

    Originariamente inviato da Manugal
    codice:
    insert.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				DefaultTableModel model = (DefaultTableModel)  prevTable.getModel();
    				model.addRow(new Object[2]); /* Inserisco una riga vuota. Non lancio alcun fireTable*() perché prima la riga la inserisco vuota e poi la modifico, per questo mi serve qualcosa che ascolti i cambiamenti di una riga per intero */
    				prevTable.setModel(model);
    				prevTable.repaint();
    			}
    		});
    Solo alcune note: il fireTable() infatti non devi farlo tu ... lo fa il addRow(). Insomma, è DefaultTableModel che "sa" come modificare la sua struttura dati interna e quindi si preoccupa lui di inviare le notifiche.

    Inoltre il setModel() e il repaint() che hai fatto non servono!!

    Originariamente inviato da Manugal
    invece io devo fare in modo che quando entro dentro tableChanged() firstRow valga 1 e lastRow valga 3 (facendo sempre l'esempio delle tre righe, ma possono essere anche di più).
    Ovviamente così no.
    Fai 1 addRow()? E allora avviene la notifica per 1 riga!! DefaultTableModel ovviamente non può avere il dono della preveggenza e sapere che poi tu cliccherai altre 2 volte sul pulsante inserisci e aggiungerai altre 2 righe una per volta!!!

    Gli hai chiesto di aggiungere 1 riga .... e lui notifica l'inserimento di 1 riga. Tutto qui.
    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
    Mar 2006
    Messaggi
    160
    Ah ho capito, quindi in teoria dovrei crearmi un TableModel personalizzato per poterlo fare e modificare opportunamente addRow(), giusto?.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    Ah ho capito, quindi in teoria dovrei crearmi un TableModel personalizzato per poterlo fare e modificare opportunamente addRow(), giusto?.
    Se facessi un "tuo" table model che avesse un metodo es. aggiungiRighe(int numRighe) per aggiungere N righe subito, allora ovviamente il table model "sa" quante righe aggiungere e quindi può notificare che sono state aggiunte N righe.

    Ma .... è proprio questo che vorresti? Se sì, ok allora implementa un tuo table model. Altrimenti chiarisci meglio la tua necessità.
    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
    Mar 2006
    Messaggi
    160
    La mia necessità è di dover fare una sola INSERT nel DB per tutte le righe inserite e non una INSERT per ogni riga che inserisco (per una questione di efficienza). L'utente può anche inserire una sola riga alla volta, ma poi devo poter fare una INSERT di tutte le righe inserite fino a quel momento quando premerò il tasto OK.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    La mia necessità è di dover fare una sola INSERT nel DB per tutte le righe inserite e non una INSERT per ogni riga che inserisco (per una questione di efficienza). L'utente può anche inserire una sola riga alla volta, ma poi devo poter fare una INSERT di tutte le righe inserite fino a quel momento quando premerò il tasto OK.
    Beh ma questo allora si può fare benissimo .... e non devi certo pensare/pretendere di ricevere chissà che cosa come notifica.

    Semplicemente quando ricevi la notifica della modifica di una riga ti metti da qualche parte es. un flag "questa riga è stata modificata". Quando premi OK vai a vedere quali sono le righe modifiche e farai la tua insert.
    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
    Registrato dal
    Mar 2006
    Messaggi
    160
    Grazie, non ci avevo pensato.

    Mi inventerò qualcosa.

    Ciao.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Rieccomi di nuovo!

    Sono riuscito a gestire la situazione dei cambiamenti fatti nelle righe delle tabelle scrivendo in un array tutte le modifiche che ho fatto e in quali tabelle. E' un array di String in cui inserisco, per ogni elemento:

    "<tipo operazione> <tabella> <indice di riga> <ID di riga nel DB>"

    dove <tipo operazione> può essere Add,Upd o Del.

    Ora sorge un problema. L'utente quando inserisce una riga tramite il tasto Inserisci, in realtà inserisce una riga vuota che lui poi deve popolare. Supponiamo che inserisca la prima riga nella tabella 0 (ometto l'ID di riga del DB). In quel caso il TableModelListener associato alla tabella intercetta tale cambiamento e aggiunge nell'array la stringa "Add 0 0 ID"; ora l'utente vorrà popolare la riga appena aggiunta e quando finisce di popolarla viene intercettato il cambiamento e viene aggiunta la stringa "Upd 0 0 ID".

    In questo modo nasce il problema che quando vado a salvare i cambiamenti fatti, nel DB inserisce prima la riga vuota e poi aggiorna la riga stessa (facendo 2 query invece che magari 1 sola). Mi è stato suggerito di scartare l'evento INSERT e trattare tutto come UPDATE; però in questo modo c'è il problema di distinguere una riga vuota che l'utente inserisce e poi aggiorna da una riga esistente che l'utente aggiorna. Come posso risolvere questo inconveniente?

    Spero di essere stato chiaro.

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    Come posso risolvere questo inconveniente?
    Innanzitutto sarebbe buona cosa se realizzassi un "tuo" table model per gestire i dati. Potresti offrire, per la tua applicazione, un metodo es. aggiungiNuovaRiga() e per le modifiche fatte dall'utente implementando ovviamente il setValueAt() del table model puoi quindi "sentire" quando una cella viene aggiornata.
    E non avresti bisogno di ricevere alcuna notifica tramite un TableModelListener!

    E per la questione insert/update potresti tenere 2 flag per ogni riga: uno "modificato" e l'altro "nuovo". Modificato vuol dire che comunque, in ogni caso, devi aggiornare sul db, poi se è nuovo =insert, altrimenti =update.

    Sono solo ipotesi, ovviamente.
    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
    Mar 2006
    Messaggi
    160
    Ok, grazie. Appena riesco a farlo se ci sono problemi posto qui.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.