Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2007, 14:19   #1
DigitalKiller
Senior Member
 
L'Avatar di DigitalKiller
 
Iscritto dal: Aug 2004
Città: Salento
Messaggi: 1080
[JAVA] JTable & JComboBox

E' da alcuni giorni che sto provando a risolvere un problema con una jtable senza riuscirci.
Nel programma che sto scrivendo, vado a leggere la tabella UTENTI di un database Mysql. All'interno di questa tabella c'è un campo di tipo VARCHAR il cui contenuto è true o false che mi indica se un utente è abilitato o meno. Quello che voglio fare, è visualizzare i record in una jtable e, per la colonna ABILITATo, visualizzare una checkbox.

Ho creato una classe generica per la gestione (connessione, query, ecc) del database a cui passo una stringa sql (es. SELECT * FROM UTENTI) ottendendo come valore di ritorno un vettore contenente tutti i record selezionati. Questo è una parte del codice della classe Database.java:

Codice:
while(rs.next()) {
  record = new Vector();
  for (int i = 0; i < colonne; i++) {
     record.add(rs.getString(i + 1));
  }
  v.add(record.clone());
}
Il vettore ritornato, lo passo al costruttore della classe TabellaSolaLettura che estende DefaultTableModel. Questa è la classe TabellaSolaLettura.java:

Codice:
    public TabellaSolaLettura(Vector tabellaDati, Vector tabellaNomColonne) {
    	super(tabellaDati, tabellaNomColonne);	
    }
    
    public boolean isCellEditable(int riga, int colonna) {
        return false;
    }
       
    public Class getColumnClass(int colonna) {
	return getValueAt(0, colonna).getClass();	
    }
In questo modo, i record letti dal database vengono visualizzati correttamente ma per la colonna ABILITATO vengono visualizzati i valori letti, cioè true o false. Il problema è che tutti i record sono letti come stringhe e quindi il metodo getColumnClass(int colonna) mi restituisce sempre String. Ho modificato il metodo in questo modo:

Codice:
public Class getColumnClass(int colonna) {
	switch (colonna) {
	case 7: 
	    return Boolean.class;
	default: 
	    return getValueAt(0, colonna).getClass();	
	}
    }
ma ottengo questa eccezione java.lang.String cannot be cast to java.lang.Boolean.
Come posso risolvere?
__________________
Il 90% dei problemi riscontrati sui computer sono localizzabili tra la sedia e la tastiera, il restante 10% nella scopa della donna delle pulizie.
DigitalKiller è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 14:32   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da DigitalKiller Guarda i messaggi
ma ottengo questa eccezione java.lang.String cannot be cast to java.lang.Boolean.
Come posso risolvere?
Come dici tu, quel campo ce l'hai come stringa. Tecnicamente non è sbagliato far ritornare in modo forzato Boolean.class nel caso della colonna 7 ma il succo è che quel campo è comunque ancora un String!

Se nel campo puoi avere "true" oppure "false", Allora crea un Boolean (e c'è un costruttore di Boolean apposito che prende un String).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 14:41   #3
DigitalKiller
Senior Member
 
L'Avatar di DigitalKiller
 
Iscritto dal: Aug 2004
Città: Salento
Messaggi: 1080
Quote:
Originariamente inviato da andbin Guarda i messaggi
Come dici tu, quel campo ce l'hai come stringa. Tecnicamente non è sbagliato far ritornare in modo forzato Boolean.class nel caso della colonna 7 ma il succo è che quel campo è comunque ancora un String!

Se nel campo puoi avere "true" oppure "false", Allora crea un Boolean (e c'è un costruttore di Boolean apposito che prende un String).
Intendi una cosa del genere?
Codice:
    public Class getColumnClass(int colonna) {
	switch (colonna) {
	case 7: 
	    //return Boolean.class;
	    Boolean abilitato = new Boolean(getValueAt(0, colonna).toString());
	    return abilitato.getClass();
	default: 
	    return getValueAt(0, colonna).getClass();	
	}
    }
Se si, avevo già provato come soluzione ma ho sempre la stessa eccezione
__________________
Il 90% dei problemi riscontrati sui computer sono localizzabili tra la sedia e la tastiera, il restante 10% nella scopa della donna delle pulizie.
DigitalKiller è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 15:00   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da DigitalKiller Guarda i messaggi
Intendi una cosa del genere?
No, nel tuo Vector del record devi avere un Boolean se in getColumnClass fai ritornare un Boolean.class per quel valore!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 15:19   #5
DigitalKiller
Senior Member
 
L'Avatar di DigitalKiller
 
Iscritto dal: Aug 2004
Città: Salento
Messaggi: 1080
Quote:
Originariamente inviato da andbin Guarda i messaggi
No, nel tuo Vector del record devi avere un Boolean se in getColumnClass fai ritornare un Boolean.class per quel valore!
Scusami, potresti essere più chiaro? Non sto riuscendo a capire
__________________
Il 90% dei problemi riscontrati sui computer sono localizzabili tra la sedia e la tastiera, il restante 10% nella scopa della donna delle pulizie.
DigitalKiller è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 15:25   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da DigitalKiller Guarda i messaggi
Scusami, potresti essere più chiaro? Non sto riuscendo a capire
Codice:
while(rs.next()) {
  record = new Vector();
  for (int i = 0; i < colonne; i++) {
     record.add(rs.getString(i + 1));
  }
  v.add(record.clone());
}
Così metti nel Vector sempre e comunque delle String. Per quel campo dove hai true/false, nel Vector devi mettere un Boolean.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 15:31   #7
DigitalKiller
Senior Member
 
L'Avatar di DigitalKiller
 
Iscritto dal: Aug 2004
Città: Salento
Messaggi: 1080
Quote:
Originariamente inviato da andbin Guarda i messaggi
Codice:
while(rs.next()) {
  record = new Vector();
  for (int i = 0; i < colonne; i++) {
     record.add(rs.getString(i + 1));
  }
  v.add(record.clone());
}
Così metti nel Vector sempre e comunque delle String. Per quel campo dove hai true/false, nel Vector devi mettere un Boolean.
Ho modificato il codice in questo modo, senza fare riferimento al numero della colonna. Così posso riutilizzare il metodo anche in altre classi del programma
Codice:
for (int i = 0; i < colonne; i++) {
     		    if (rs.getString(i + 1).equals("true") || rs.getString(i + 1).equals("false")) {
     			record.add(rs.getBoolean(i + 1));
     		    } else {
     			record.add(rs.getString(i + 1));
     		    }
     		}
Che ne pensi?
Grazie dell'aiuto!
__________________
Il 90% dei problemi riscontrati sui computer sono localizzabili tra la sedia e la tastiera, il restante 10% nella scopa della donna delle pulizie.
DigitalKiller è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 16:12   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da DigitalKiller Guarda i messaggi
Codice:
for (int i = 0; i < colonne; i++) {
     		    if (rs.getString(i + 1).equals("true") || rs.getString(i + 1).equals("false")) {
     			record.add(rs.getBoolean(i + 1));
     		    } else {
     			record.add(rs.getString(i + 1));
     		    }
     		}
Che ne pensi?
No, non mi sembra una buona cosa. Se vai a vedere la documentazione di getBoolean(), dice:
If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 16:57   #9
DigitalKiller
Senior Member
 
L'Avatar di DigitalKiller
 
Iscritto dal: Aug 2004
Città: Salento
Messaggi: 1080
Quote:
Originariamente inviato da andbin Guarda i messaggi
No, non mi sembra una buona cosa. Se vai a vedere la documentazione di getBoolean(), dice:
If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned.
In origine, la colonna ABILITATO nel database era TINYINT (BOOLEAN in mysql). Sono passato a VARCHAR proprio per visualizzare la checkbox nella jtable. A questo punto posso ritornare anche a TINTINT lasciando inalterato il codice, o no?
__________________
Il 90% dei problemi riscontrati sui computer sono localizzabili tra la sedia e la tastiera, il restante 10% nella scopa della donna delle pulizie.
DigitalKiller è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 17:04   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da DigitalKiller Guarda i messaggi
In origine, la colonna ABILITATO nel database era TINYINT (BOOLEAN in mysql). Sono passato a VARCHAR proprio per visualizzare la checkbox nella jtable. A questo punto posso ritornare anche a TINTINT lasciando inalterato il codice, o no?
Rimetti pure il campo a BOOLEAN (o TINYINT(1) che poi è la stessa cosa) ma poi nel codice ovviamente non devi usare getString() per quella colonna!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2007, 20:05   #11
DigitalKiller
Senior Member
 
L'Avatar di DigitalKiller
 
Iscritto dal: Aug 2004
Città: Salento
Messaggi: 1080
Quote:
Originariamente inviato da andbin Guarda i messaggi
Rimetti pure il campo a BOOLEAN (o TINYINT(1) che poi è la stessa cosa) ma poi nel codice ovviamente non devi usare getString() per quella colonna!
No? Io pensavo di fare in questo modo:
Codice:
for (int i = 0; i < colonne; i++) {
     if (rs.getString(i + 1).equals("1") || rs.getString(i + 1).equals("0")) {
     	record.add(rs.getBoolean(i + 1));
     } else {
	record.add(rs.getString(i + 1));
     }
}
altrimenti sono costretto a fare riferimento al numero di colonna della tabella UTENTI. Il mio intento, invece, è di creare una classe generica per la gestione del database. Ho sbagliato approccio? Mi consigli di fare in qualche altro modo?
__________________
Il 90% dei problemi riscontrati sui computer sono localizzabili tra la sedia e la tastiera, il restante 10% nella scopa della donna delle pulizie.
DigitalKiller è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Nuove fotografie dagli astronauti di Art...
La toilette della capsula Orion Integrit...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
I coupon nascosti di Amazon si rinnovano...
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: 00:07.


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