IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Evènements suivant une perte de focus


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 12
    Points
    12
    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 ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    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...
    Dernière modification par Invité ; 20/12/2012 à 13h08.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    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 ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/09/2014, 14h14
  2. JPanel : "Saut" lors d'une perte de focus
    Par lepak dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 21/08/2010, 05h50
  3. Action suite à une perte de focus
    Par wecko dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 28/05/2010, 17h37
  4. Contrôle de saisie sur une perte de focus d'une JTextfield
    Par comeochris dans le forum Composants
    Réponses: 3
    Dernier message: 03/04/2006, 16h21
  5. excel -> test lors de la perte du focus d'une cellule
    Par greg778 dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 26/09/2005, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo