Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Invité régulier
    Inscrit en
    février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : février 2005
    Messages : 13
    Points : 7
    Points
    7

    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
    Membre émérite
    Avatar de Enerian
    Homme Profil pro Etienne Tissières
    Ingénieur développement logiciels
    Inscrit en
    août 2011
    Messages
    229
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Tissières
    Âge : 24
    Localisation : France

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

    Informations forums :
    Inscription : août 2011
    Messages : 229
    Points : 874
    Points
    874

    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...

  3. #3
    Invité régulier
    Inscrit en
    février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : février 2005
    Messages : 13
    Points : 7
    Points
    7

    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
    Membre émérite
    Avatar de Enerian
    Homme Profil pro Etienne Tissières
    Ingénieur développement logiciels
    Inscrit en
    août 2011
    Messages
    229
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Tissières
    Âge : 24
    Localisation : France

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

    Informations forums :
    Inscription : août 2011
    Messages : 229
    Points : 874
    Points
    874

    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
    Invité régulier
    Inscrit en
    février 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : février 2005
    Messages : 13
    Points : 7
    Points
    7

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •