Newsgroup: it.comp.java
Titolo: Aiuto!Validazione campo in edit (JTextField)

Il problema e' che mentre si sta' processando il focusLost() di
un campo, il focus e' gia' passato al campo successivo; nel caso
in cui questo controllo dia esito negativo io faccio un
requestFocus() sul campo, ma mi viene eseguito in contemporanea anche il
focusLost() del campo successivo. Se anch'esso e' errato faccio anche per
lui un requestFocus() :
  comincia un rimpallo perenne fra i due campi.
Esiste un modo migliore per gestire la validazione dei campi in edit ?
ciao.
--------------------------------
Inviato via 
http://usenet.libero.it

ciao.
La risposta è sempre la stessa: studiare la documentazione fornita da
Sun. A questi due link c'è esattamente quello che ti serve:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/InputVerifier.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html#setInputVerifier(javax.swing.InputVerifier)
InputVerifier è una classe astratta. Estendendo questa classe, sei in
grado di fornire a Swing un metodo per sapere se un dato componente
(che può essere un JTextField, una JComboBox o qualunque JComponent) è
valido secondo parametri stabiliti da te. Ti faccio un esempio:
In un JFrame uno dei miei componenti deve contenere solo numeri
interi, memorizzabili in una variabile di tipo "int" (nemmeno "long",
volevo proprio che fosse "int"). Ho esteso InputVerifier in questo
modo:
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JTextField;
public class OnlyIntsAcceptor extends InputVerifier {
   public boolean verify(JComponent input) {
      int res=0;
		try {
         JTextField tf =(JTextField)input;
         res=Integer.parseInt(tf.getText());
      }
      catch (ClassCastException ex) {}
      catch (NumberFormatException ex) {}
      return res>0;
   }
}
Alcuni degli esperti potrebbero criticare questa soluzione, proponendo
l'uso delle regular expressions. Eccovi accontentati:
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JTextField;
import java.util.regex.*;
public class OnlyNumbersAcceptor extends InputVerifier {
   private static Pattern p=Pattern.compile("^[\+\-]?\d+$");
   public boolean verify(JComponent input) {
		try {
         JTextField tf =(JTextField)input;
         return p.matcher(tf.getText()).matches();
      }
      catch (ClassCastException ex) {}
      return false;
   }
}
L'uso di questa versione però lascia passare qualunque testo che sia
formato da sole cifre (precedute o meno dal simbolo '+' o '-'), e non
verifica che il valore del campo sia inferiore ai limiti massimo e
minimo di int.
A questo punto crei un'istanza della classe appena implementata e...
  ...
  InputVerifier verify=new OnlyNumbersAcceptor();
  JTextField campoTemperatura=new JTextField();
  campoTemperatura.setInputVerifier(verify);
  ...
A runtime, se nel campo "Temperatura" l'utente inserisce qualunque
cosa che non sia un numero, il focus non potrà spostarsi dal campo e
il caret (il cursore lampeggiante) non si sposterà da lì finchè
l'utente non inserisce un valore valido.
Ci sarebbero anche altre cose da considerare, ad esempio: come dire
all'utente che il campo inserito non è valido nel momento in cui cerca
di spostarsi su un altro campo?
Non pensi che sarebbe ora che qualcosa la facessi pure te? ;)
--
"tanto va la gatta al largo che affoga"
(per rispondere personalmente leva IlDitoDalCulo)

 ha
scritto:

--------------------------------
Inviato via 
http://usenet.libero.it