[JAVA] Pb de FocusListener : je vais devenir FOU !!!

Pb de FocusListener : je vais devenir FOU !!! [JAVA] - Programmation

Marsh Posté le 19-07-2001 à 16:13:48    

Bonjour, et bienvenue dans un monde de fou ...
Je sais que mon post est long, mais s'il vous plait donnez vous la peine de
le lire, car je bloque vraiment ...
 
desole, mais là j'ai vraiment un probleme etrange, je me creuse la tete
depuis des heures et je vais devenir fou !!
 
Je m'explique : j'ai une classe etandant JPanel. Cette classe contient un
Box, dans laquelle est ajouté un JPanel. Enfin, ce JPanel contient un
JTextField.
 
Ensuite, mon composant est parametrable, et on peut entre autres configurer
un masque de saisie. La verification pourra se faire soit a la fin de la
saisie, soit au cours de la frappe dans le champs de saisie.
Pour l'instant, j'essaie de le faire a la fin de la saisie.
 
Au niveau evenementiel, deux cas possibles :
-soit l'utilisateur appuis sur Entree (dans ce cas, c l'evenement
ActionPerformed qui est declenché)
-soit l'utilisateur passe a un autre champs de saisie. Donc c a dire lorsque
le champs de saisie perd le focus.
 
Jusque là tout va bien.
 
J'ai donc une classe pour mon composant, et une classe pour le listener .
Cette classe etends KeyAdapter et implemente ActionListener et FocusListener
(ouf!).
 
Donc dans ma classe listener, j'ai redefinie la methode FocusLost. La
methode FocusGained est bien redefini aussi (vide).
 
Voici le code dans FocusLost :

Code :
  1. public void focusLost(FocusEvent e)
  2. {
  3.   checkField();
  4.   if (!this.check)
  5.   {
  6.    JOptionPane.showMessageDialog(this.field, msgError,"Capture
  7. error",JOptionPane.ERROR_MESSAGE);
  8.    //on rend le focus au champ, pour ressaisir
  9.    this.field.text.requestFocus();
  10.   }
  11. }


 
Checkfield permet de verifier le champs de saisie, suivant les conditions
definies (aucune importantce ici). Il place le boolean check a faux si il y
a une erreur, et msgError contient alors le message d'erreur approprié.
Donc pour moi ça me paraissait bon : je lance, je saisie mal, je quitte le
champs de saisie : paf; le msg d'erreur, normal. Je fais ok, paf, a nouveau
le msg d'erreur. je fais ok, paf .... etc etc.
 
Ha bizarre.
je fais la trace : en fait je me rend compte que le focusLost se declhenche
deux fois : la premiere fois normal, puis la deuxieme est declenchée lors de
l'appel a showMessageDialog .... bizarre bizarre ?
j'ai essayer de feinter : j'ai retirer le focus listener sur mon composant
juste avant l'appel a la boite de dialogue, puis je lui redonne juste apres.
là effectivement ça marche, ça boucle plus. Par contre, a la place j'ai un
drole de bug avec le focus ;
Dans ma fenetre contenant mon composant, il y a aussi deux boutons.
Pour faire perdre le focus a mon champs de saisie, je click sur un bouton.
et bin une fois l'erreur declenchée, apres qd je passe avec la sourie au
dessus du bouton, celui s'enfonce comme si je clickai dessus alors que je ne
fais rien !!! et il reste enfoncé tant que ma sourie reste au dessus.
Si ensuite je reclick sur mon champs de saisie (prise de focus), on a
toujours le meme scenario pour le bouton. Et si cette fois je click sur
l'autre (pour faire perdre le focus a mon champs de saisie), alors ce bouton
a le meme comportement que precedemment. Et ça le fait toujours pour
l'autre.
 
Bref je devient FOU !! arrrg a l'aide  !!!

Reply

Marsh Posté le 19-07-2001 à 16:13:48   

Reply

Marsh Posté le 20-07-2001 à 00:20:48    

pour le premier pb au sujet du dialog box et du focus en boucle.. c normal.. rien de bizarre a tout ca...
Je m'explique :
 
quand tu quittes ton champ de saisie => focuslost => dialogBox
 
Normal... :D
 
Mais quand tu tas ton focuslost... ton dialogbox souvre et ton champ de saisie reprend le focus...
 
Quand tu cliques sur ok => focuslost => fermeture de dialogBox
 
Là, ya a nouveau focuslost.. donc re dialogbox et re focus du champ de saisie.. etc..

Reply

Marsh Posté le 20-07-2001 à 00:28:20    

bref.. la solution c de ne pas mettre ton  
 
this.field.text.requestFocus()
 
dans ton focusLost() tel quel..
fo le faire lorsque tu fermes le dialogBox... enfin tu vois le truc... :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed