Torna indietro   Hardware Upgrade Forum > Software > Programmazione

realme GT7: un "flaghsip killer" concreto! La recensione
realme GT7: un "flaghsip killer" concreto! La recensione
Abbiamo provato l'ultimo smartphone di realme, il nuovo GT7. Si tratta di un device che si colloca in una fascia di mercato delicata, ovvero quella che possiamo definire medio-alta. La specifica che salta all'occhio è senza dubbio la sua batteria da 7.000 mAh e un design elegante e premium. Ma come funziona nel quotidiano? E soprattutto è davvero un Flagship Killer? Ve lo diciamo nella nostra recensione completa.
Oracle guida Stargate UAE: nasce il supercluster per l'IA sovrana
Oracle guida Stargate UAE: nasce il supercluster per l'IA sovrana
Il cloud ottimizzato per l'intelligenza artificiale di Oracle si combina con un'infrastruttura per la sovranità sul dato negli Emirati Arabi. "Questa implementazione epocale stabilisce un nuovo standard per la sovranità digitale", afferma Larry Ellison, fondatore di Oracle
Tutto sulla nuova Tesla Model Y: autonomia in autostrada, prova bagagliaio e dettagli
Tutto sulla nuova Tesla Model Y: autonomia in autostrada, prova bagagliaio e dettagli
Abbiamo guidato per diversi giorni la nuova Tesla Model Y, in versione di lancio dual motor e con batteria long range. Ecco tutto quello che c'è da sapere sull'erede dell'auto più venduta al mondo
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


realme GT7: un "flaghsip killer" concreto! La recensione realme GT7: un "flaghsip killer" concr...
Oracle guida Stargate UAE: nasce il supercluster per l'IA sovrana Oracle guida Stargate UAE: nasce il supercluster...
Tutto sulla nuova Tesla Model Y: autonomia in autostrada, prova bagagliaio e dettagli Tutto sulla nuova Tesla Model Y: autonomia in au...
HONOR 400 Pro trasforma ogni scatto in capolavoro animato. Recensione HONOR 400 Pro trasforma ogni scatto in capolavor...
Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU ...
SpaceX ha eseguito il nono volo del razz...
Tesla in caduta libera: in Europa -52,6%...
WhatsApp arriva finalmente su iPad: abbi...
Sony annuncia il ritorno dei proiettori ...
Concept Astro, il progetto di Dell per a...
Dubai pronta a offrire accesso gratuito ...
PlayStation Portatile: SoC AMD con proce...
Tor Alva: ecco l'edificio più alto al mo...
Finale di Champions con un maxischermo: ...
OnePlus AI: la nuova era dell'intelligen...
TeamViewer ONE: la piattaforma per unifi...
Volkswagen blinda l'architettura SSP: pr...
Sapphire Phantomlink: il produttore cine...
Formula E pronta a Shanghai: due gare de...
Offerte Tech da urlo: le componenti perf...
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: 04:27.


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