Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia
Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia
Sony Xperia 1 VII propone un design sobrio e funzionale, con un comparto fotografico di ottimo livello caratterizzato da uno zoom continuo e prestazioni generali da top di gamma puro. Viene proposto con una personalizzazione software sobria e affidabile, ma presenta qualche criticità sul fronte ricarica rapida. Il dispositivo punta su continuità stilistica e miglioramenti mirati, rivolgendosi al solito pubblico specifico del brand giapponese.
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-09-2009, 12:15   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[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. Ora vorrei che quando l'utente, per una determinata tabella, preme il tasto "Inserisci", o "Cancella" (una o più righe), oppure quando modifica una determinata riga, il programma salvi i cambiamenti fatti sul DB. Come faccio a capire quali righe l'utente modifica, cancella o aggiunge man mano e poi registrare questi cambiamenti?

Ho provato a vedere i metodi fireTable*() di TableModel ma non saprei come lanciarli.

Grazie, spero di essermi spiegato.

Posto il codice della funzione che crea le tabelle insieme a tutta l'interfaccia grafica (da completare):

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;
				DefaultTableModel model = (DefaultTableModel) e.getSource();

/* Per quanto riguarda insert e delete c'è TableModelEvent.INSERT e TableModelEvent.DELETE, ma per "ascoltare" una riga intera non c'è niente c'è solo TableModelEvent.UPDATE che ascolta i cambiamente di una cella */				
switch(e.getType()){ 
				}
			}

/* 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();
			}
		});
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2009, 12:41   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
La soluzione è quella che hai già. Il modello della tabella spara un TableModelEvent sia per mutazioni nella struttura - righe o colonne che vanno o vengono - sia per mutazioni nel contenuto - l'utente cambia il valore della cella (x,y).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2009, 12:47   #3
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
D'accordo e fino a qui ci siamo. Però l'utente potrebbe anche inserire una nuova riga e inserire quindi il contenuto che lui vuole in ogni cella di quella riga. Se TableModelEvent.UPDATE intercetta i cambiamenti in una sola cella, come faccio a dirgli di intercettare i cambiamenti in una riga intera?
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2009, 12:56   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Lo fa già. Quando l'utente inserisce una riga il modello notifica agli ascoltatori l'inserimento: il tipo dell'evento sarà INSERT e gli indici di riga ti dicono dove si trova la nuova riga.

Se la riga contiene dei valori di default, puoi prendere ed esaminare le singole celle per capire cosa andare a salvare nel database.

Quando l'utente cambia uno dei valori di quella riga il modello spara un altro TableModelEvent, stavolta un UPDATE: qui sono gli indici di riga e l'indice della colonna a dirti quale cella è cambiata.

Attraverso TableModelListener sei già in grado di recuperare tutte ma proprio tutte le mutazioni che coinvolgono il modello della tabella.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2009, 12:58   #5
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ah ok d'accordo. Ora mi è più chiara la situazione. Grazie.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2009, 14:10   #6
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Un'ultima domanda. Ma se l'utente mettiamo il caso preme tre volte inserisci (magari perché vuole inserire più righe alla volta) come faccio a catturare questo con il TableModeListener? Io ho scritto una cosa simile ma ovviamente non funziona perché ogni volta che inserisce una nuova riga firstRow e lastRow sono sempre uguali.

Codice:
lavTable.getModel().addTableModelListener(new TableModelListener(){
			public void tableChanged(TableModelEvent e) {
				int first = e.getFirstRow();
				int lastRow = e.getLastRow();
				int column = e.getColumn();
				Object[][] changedData = new Object[lastRow-first][3];
				DefaultTableModel model = (DefaultTableModel) e.getSource();
				switch(e.getType()){
				case TableModelEvent.UPDATE:
					for(int i=first; i<=lastRow; ++i){
						changedData[i][column]= model.getValueAt(i,column);
						System.out.println("changedData[" + i + "][" + column + "]: " + changedData[i][column]);
					}
				break;
				case TableModelEvent.DELETE:
				break;
				}
			}
		});
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2009, 20:39   #7
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
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). Come posso risolvere questo inconveniente?

Spero di essere stato chiaro.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2009, 20:46   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Scarti l'evento INSERT se la riga inserita è vuota. Per verificare se la riga è vuota controlli il contenuto di ogni cella di quella riga. Il numero di riga lo conosci tramite il TableModelEvent.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2009, 21:18   #9
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ok, grazie. Ci avevo pensato infatti ma poi sorgeva il problema di distinguere tra una nuova riga inserita e una riga esistente solamente aggiornata. Ora che ci penso potrei aggiungere un'ulteriore informazione nell'array, ad esempio scrivo N se la riga è nuova e E se è una riga esistente che ho modificato.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2009, 21:23   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
L'aggiornamento lo ricevi come UPDATE. Se la riga è nuova allora l'evento della tabella sarà di tipo INSERT. Ricevi due notifiche diverse.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2009, 21:27   #11
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Si quello lo so. Io intendevo proprio che l'utente una volta che inserisce una riga nuova (evento INSERT), dopo che è stata inserita viene popolata con i dati (evento UPDATE). Il problema è che in questo caso è come se trattassi le due cose come un evento UPDATE (scarto l'evento INSERT) e quindi c'è il problema di distinguere se sto aggiornando una riga nuova o una riga già esistente.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2009, 08:27   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Manugal Guarda i messaggi
Si quello lo so. Io intendevo proprio che l'utente una volta che inserisce una riga nuova (evento INSERT), dopo che è stata inserita viene popolata con i dati (evento UPDATE). Il problema è che in questo caso è come se trattassi le due cose come un evento UPDATE (scarto l'evento INSERT) e quindi c'è il problema di distinguere se sto aggiornando una riga nuova o una riga già esistente.
Prima di utilizzare le info raccolte nell'array per eseguire le query sul db sottostante (se ho capito bene l'intera faccenda) puoi processare l'array stesso per arrivare a produrne uno isomorfo che invece di conservare le coppie di elementi INSERT - UPDATE le condensa in un singolo elemento di tipo INSERT con i valori dei campi uguali a quello dell'UPDATE relativo. Rispetto all'array originale è l'elemento corrispondente all'indice dell'UPDATE che viene eliminato e quello corrispondente all'indice dell'INSERT che viene conservato.
A questo punto hai l'array pronto per produrre le query.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 29-09-2009 alle 08:30.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2009, 22:02   #13
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Grazie, ma ora sto provando a crearmi un mio TableModel e vedere se così riesco a risolvere. Altrimenti proverò la tua soluzione.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2

Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson
Manugal è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia Recensione Sony Xperia 1 VII: lo smartphone per ...
Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
L'amministrazione Trump vorrebbe distrug...
La NASA vorrebbe realizzare un reattore ...
Oltre 1.700 km con una ricarica: l'assur...
Maxi annuncio dalla Casa Bianca: Apple p...
Microonde con grill, super venduto e app...
Pubblicazioni scientifiche false in aume...
Ecco le 100 startup che prenderanno part...
Pandora colpita da un attacco informatic...
Cooler Master MasterFrame 360 Panorama S...
Motorola e Swarovski lanciano The Brilli...
Wikipedia dichiara guerra all'IA spregiu...
Dai social ai farmaci dimagranti: il nuo...
Addio spam su WhatsApp? Ecco le nuove di...
Su Windows 11 25H2 cambierà (in p...
Per la prima volta un portatile gaming c...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v