Newsgroup: it.comp.java
Titolo: come capire chi ha lanciato l'eccezione

Da due JTextField prendo il valore con il metodo getText() e poi li porto a
double con Double.parseDouble:
String input = testo1.getText();
double x = Double.parseDouble(input);
input = testo2.getText();
double y = Double.parseDouble(input);
Chiaramente se l'utente non ha messo un numero, parseDouble() lancia un
eccezione di tipo NumberFormatException.
Io non problemi a catturare l'eccezione, solo che vorrei colorare di rosso
l'etichetta che si riferisce al campo sbagliato (invece di colorare
entrambi di rosso quando magari è sbagliato solo uno).
Come faccio a sapere chi dei due ha lanciato l'eccezione?
-- 
Ciao. Fabrizio.
(icq:241182067) 
http://groups.yahoo.com/group/jug_brescia/
< MISTAH KURTZ -- HE DEAD.
   A penny for the Old Guy>  (T.S. Elliot: the hollow men)

"oizirbaF" <fabri.t...@GRAZIEtiscali.it> ha scritto nel messaggio
news:b9sstk$sqn$1...@lacerta.tiscalinet.it...

Io farei
try{
String input = testo1.getText();
double x = Double.parseDouble(input);
} catch(Exception e){ ... }
try{
input = testo2.getText();
double y = Double.parseDouble(input);
} catch(Exception e){ ... }
In questo modo riesci a capire in quale moemnto viene lanciata l'eccezione.
ciao
sergio

 sergio
È una strada che avevo già percorso , ma speravo di poterla evitare per non
dover utilizzare una semplicissima variabile booleana che dentro a catch
settavo a false nel caso che i campi non fossero stati ben formattati e non
proseguire: perchè poi non volevo usare la variabile booleana ? perchè sto
studiando è speravo vi fosse un altro modo più "raffinato". :-)


 
A fini di studio creerei una classe derivata da JTextField che incapsula 
il comportamento voluto.
A fini pratici userei il nuovo JFormattedTextField introdotto dal jdk 
1.4. ;-)
Ciao.
\mirko

 \mirko
E come si usa , sulle doc non c'ho capito una mazza.
Se voglio che accetti solo valori double che devo fare:
JFormattedTextField testo1 = new JFormattedTextField(_come la metto giu?_);


  
Nel caso più semplice gli passi un valore
   new JFormattedTextField(new Double(0.0));
oppure puoi passare una formattazione, ad es. per visualizzare sempre 
due decimali e opzionalmente i separatori di migliaia:
   new JFormattedTextField(new DecimalFormat("#,##0.00"));
(vedi java.text.DecimalFormat per i formati).
Ciao.
\mirko

 \mirko
Questo decisamente di più e capita anche a fagiuolo.


 Questo decisamente di più e capita anche a fagiuolo.
Ah ah ... siccome mi passava la localizzazione in italiano gli passo questo
metodo statico:
public static String unlocalize(String input)
{
        String result = "";
        for (int i = 0; i < input.length(); i++)
        {
                char ch = input.charAt(i);
                if (ch == '.')
                        continue;
                if (ch == ',')
                        ch = '.';
                result += ch;
        }
        return result;
}
 
C'era qlc'altro al posto di questo , magari?


 
Per prendere il valore? Si, con JFormattedTextField puoi fregartene 
della rappresentazione testuale (getText, setText) e lavorare solo con i 
valori (setValue, getValue).
Ad es.:
   JFormattedTextField field = new JFormattedTextField();
   field.setValue(new Double(0.0));
   //...
   Double result = (Double)field.getValue();
Ciao.
\mirko

 \mirko
Oh bella , io faccio così:
*****************
rateField = new JFormattedTextField();
rateField.setValue(new Double(0.0));
//.....
Double wrapper = (Double)rateField.getValue();
double rate = wrapper.doubleValue();
//avevo fatto così rate = ((Double)rateField.getValue).doubleValue();
***************************
Ma mi salta fuori un ClassCastException e non capisco perchè !


 
Ah, scusa, ho sbagliato io. Bisogna passare il valore iniziale (o un 
formato) direttamente al costruttore così sa che tipi di valore accettare:
JFormattedTextField field = new JFormattedTextField(new Double(0.0));


 \mirko
Ma neanche così, mi da il ClassCastException.
A questo punto mi viene il dubbio di aver sbagliato qlc da qlc parte , ma
non capisco dove.
Ricapitolando (così faccio un po' di mente locale):
1) Dichiaro come variabile di istanza: 
 private JFormattedTextField rateField;
2)Nel costruttore istanzio rateField:
 rateField = new JFormattedTextField(new Double(0.0));
3)Nel listener metto:
 Double wrapper = (Double)rateField.getValue();
 double amount = wrapper.doubleValue();
Ma perchè mi lancia l'eccezione ? porca vacca che rabbia.
Non c'è un esempio di come si usa una JFormattedTextField da qlc parte ?
.... mhmm provo a vedere sul tutorial di swing.


 
Quella parte del tutorial è in costruzione...
Scoperto l'inghippo: getValue() non ritorna un Double ma per tutti i 
tipi numerici ritorna sempre un Number!
field = new JFormattedTextField(new Double(0.0));
// oppure con formattazione:
//field = new JFormattedTextField(new DecimalFormat("#,##0.00");
Number number = (Number)field.getValue();
double amount = number.doubleValue();
Ciao.
\mirko

 \mirko
Grandioso , così è perfetto.
Come hai fatto a capirlo ? io mi sono scartabellato la doc , ma col cazzo
che c'ero arrivato (eh lo so l'esperienza .... :-) ).


 
Eh eh... più che l'esperienza le prove! ;-)
Ho messo un
   Object value = field.getValue();
   System.err.println(value.getClass() +": "+ value);
e visto che scrivendo "5" stampa
   class java.lang.Long: 5
mentre scrivendo "5,5" stampa
   class java.lang.Double: 5.5
Quindi ritorna Long o Double a seconda che ci siano decimali o no. 
Usando Number che è la superclasse funziona in tutti i casi.
Ciao.
\mirko

 \mirko
È una cosa che non mi era venuto in mente.
Grazie Mirko.
