Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > AWT/SWING
AWT/SWING
Forum d'entraide pour les API Swing et AWT. Avant de poster -> FAQ AWT/SWING
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/12/2012, 10h42   #1
gloode
Invité régulier
 
Inscription : février 2005
Messages : 13
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : février 2005
Messages : 13
Points : 7
Points : 7
Envoyer un message via MSN à gloode Envoyer un message via Skype™ à gloode
Par défaut Evènements suivant une perte de focus

Bonjour à tous. J'ai une question de conception générale, je ne crois pas qu'il y ait besoin d'exemple code pour comprendre le problème mais si vraiment vous y tenez, dites-le moi

J'ai dans mon IHM un JTextField qui, sur perte de focus, doit déclencher une action "A1". J'ai aussi d'autres composants déclenchant des actions "A2, A3..." lors d'un clic souris. Quand je suis en train d'éditer le JTextField et que je clique sur un des composants (ce qui entraine la perte de focus du JTextField), je veux que ce soit l'action A1 qui soit exécutée.

En quelques sorte, il faut que les évènements qui viennent après la perte de focus du JTextField soient "consommés" sans être pris en compte par les listeners. Je ne trouve pas de solution simple pour faire ce genre de chose, est-ce que quelqu'un aurait par hasard une idée hors du commun ?
gloode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 11h58   #2
Enerian
Membre expérimenté
 
Homme Etienne
Ingénieur développement logiciels
Inscription : août 2011
Messages : 108
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : août 2011
Messages : 108
Points : 506
Points : 506
Salut,

Ca devrait être faisable avec un flag boolean : quand ton textfield reçoit le focus, tu met un flag textfieldHasFocus à true. Lors de la perte du focus, tu le met à false. Si bien que, lorsque tu as un des autres événements, tu n'exécute l'événement associé que si textfieldHasFocus est à false.
Pour que cette solution marche, il faut que, quand tu cliques sur un bouton alors que le textfield a le focus, l'événement associé au click s'exécute avant celui lié à la perte de focus. Je ne sais pas si c'est le cas

Sinon, tu as une méthode bien plus radicale qui marcheras à coup sur : quand ton textfield reçoit le focus, tu supprimes les listener associés à tes boutons. Et quant il perd le focus, tu les ajoutes. Ainsi, les événements liés aux bouttons ne seront traités que lorsque le textfield n'a pas le focus. Pour ne pas recréer les listeners à chaque fois, ça implique que tu les conserves en attributs. Tu joues après avec les removeXXXListener et addXXXListener...
Enerian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 13h17   #3
gloode
Invité régulier
 
Inscription : février 2005
Messages : 13
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : février 2005
Messages : 13
Points : 7
Points : 7
Envoyer un message via MSN à gloode Envoyer un message via Skype™ à gloode
Merci pour ces propositions. Le flag n'est pas la solution la plus propre que j'avais envisagé Quant au fait de supprimer tous les listeners de mon application lorsque mon JTextField gagne le focus, c'est potentiellement la bonne solution mais je risque de galérer un peu. Il aurait fallu que je prenne cette contrainte en considération lors de la conception de tous mes composants graphiques.

Cependant, certains composants ont des comportements par défaut. Par exemple un JTable : on n'a pas besoin d'ajouter un listener pour que la sélection soit prise en compte et que la ligne sélectionnée soit mise en surbrillance. Dans ce cas, comment faire pour désactiver temporairement les listeners "natifs" des composants swing ? Du coup je trouve que ça commence à être compliqué...

N'est-ce pas possible de "purger" la file d'évènements de l'EventDispathThread ?
gloode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 14h00   #4
Enerian
Membre expérimenté
 
Homme Etienne
Ingénieur développement logiciels
Inscription : août 2011
Messages : 108
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : août 2011
Messages : 108
Points : 506
Points : 506
Je ne sais pas si ça correspond exactement à tes besoins, mais tu as la méthode setEnabled sur les composants.
Tu peux désactiver les boutons quand ton textfield a le focus et les réactiver quand il le perd. Après, je ne sais pas si ça a un impact graphique et il te faudra peut-être surcharger le rendu du composant désactivé.
doc setEnabled
Enerian est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2012, 16h11   #5
gloode
Invité régulier
 
Inscription : février 2005
Messages : 13
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : février 2005
Messages : 13
Points : 7
Points : 7
Envoyer un message via MSN à gloode Envoyer un message via Skype™ à gloode
Effectivement, c'est pas mal. Je ne peux pas l'appliquer comme ça dans mon appli mais par contre, je peux éventuellement envisager la chose suivante : lorsque le JTextField gagne le focus, j'installe un GlassPane transparent dans ma fenêtre. Et lorsqu'il perd le focus, je retire le GlassPane.

Par contre ça veut dire qu'il faut que le GlassPane soit "focusable" et ne recouvre pas mon JTextField... Je ne sais pas encore si c'est possible mais je vais essayer de me dépatouiller avec ça.

Merci pour ces éléments de réflexion, à bientôt !
gloode est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h16.


 
 
 
 
Partenaires

Hébergement Web