Newsgroup: it.comp.java
Titolo: Problema nella validazione di un campo in una GUI e focus

Ho una gui con delle JTextField e vorrei controllare, per esempio, che
i valori immessi siano un int compreso in un certo range.
Mi piacerebbe che il focus rimanesse sull'edit box fnche' questa e'
"sbagliata" e che apparisse una dialog window per avvisarmi.
Ho quindi realizzato la seguente classe di focusListener
class TextNumberValidator extends FocusAdapter
{
	int min,max;
	JFrame f;
	public TextNumberValidator(JFrame myF, int myMin, int myMax)
	{
		min = myMin;
		max = myMax;
		f = myF;
	}
	public void focusLost(FocusEvent e) 
	{ 
	 	JTextField input = (JTextField)e.getSource(); 
		String text = input.getText(); 
		try
		{
			int value = Integer.parseInt(text);
			if (value<min | value>max)
			{
				if (f.isFocused())
					JOptionPane.showMessageDialog(f, "valore errato", "Errore",
JOptionPane.ERROR_MESSAGE);
				input.requestFocusInWindow();
			}
 
		}
		catch (NumberFormatException ex)
		{
			if (f.isFocused())
				JOptionPane.showMessageDialog(f, "Formato errato", "Errore",
JOptionPane.ERROR_MESSAGE);
			input.requestFocusInWindow();
		}
	}
}
L'ho poi agganciato al JTextBox.
Mi da due problemi:
1)Quando immetto un valore sbagliato e clicco su un pulante della gui,
appare la finesta di errore ed il focus mi ritorna nel JEdit in attesa
di essere corretto. Sembra tutto OK ma il pulsante che ha ricevuto il
focus per un picosecondo rimane permanentemente "sballato", cioe'
quando gli passo sopra con la freccia assume l'aspetto del click
attivo (i pulsanti normali vanno "in dentro", le checkbos "si
inscuriscono" ecc..) E questo quando gli passo solo sopra senza fare
niente.
2)Se, partendo dall'edit in stato di errore, clikko su un'altra
finestra, la gui si inchioda, la messagebox non viene visualizzata
completamente e non riesco a recuperare il focs sull'applicazione ora
in stato "limbico". Per evitare questo ho inserito la condizione
if (f.isFocused())
in modo da non far visualizzare la message box modale se il focus va
su un'altr finbestra ... ma sembra non servire a niente (ho provato
anbnche con f.isFocused() ma e' uguale.
Come posso fare?
Grazie,
Matteo

 "sbagliata" e che apparisse una dialog window per avvisarmi.
Da java 1.3 in poi puoi usare un InputVerifier. Controlla:
1) Swing tutorial;
2) JavaDoc
3) Su BugParade ;-) infatti c'e' un fastidioso bug che non permette di
visualizzare JOptionPane di errore, per fortuna e' descritto un
workaround. 
Scusa la risposta sintetica, ma vado un po' do fretta ;-))))
-- 
__/\__ * this mail has been written by Talpa Stellare
\ TS / * che da piccolo una volta e' morto.
 |/\|  * icq# 78630739 - togli i caratteri maiuscoli x e-mail

 Scusa la risposta sintetica, ma vado un po' do fretta ;-))))
Grazie mille, ho trovato ed utilizzato l'InputVerifier. Purtroppo le
swing hanno un fastidioso baco durante la perdita del focus di un
controllo su cui c'e' un'InputVerifier (o in ogni caso un gestore di
FocusLost). Se il nuovo focus lo prende un quasiasi Jbutton, allora,
dopo che e' scattata l'azione (per esempio una dialog di warning) il
bottone non viene ripristinato totalemnte e rimane in una situazione
strana, in cui se ci si passa sopra col mouse assume l'aspetto di
"clikkato". Da quello che ho capito e' dovuto al fatto che al bottone
non viene mai passato un certo messaggio di ripristino. Le soluzioni
proposte sono (per me) decisamente complesse, si tratta di riscrivere
parte del l&f.
Qualcuo conosce dei workaround?
Grazie e ciao!