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 :

Comment laisser les actions de focus à son parent ?


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut Comment laisser les actions de focus à son parent ?
    Bonjour,

    J'ai un petit soucis avec le focus d'un de mes composants. Je vous expose le problème :
    J'ai un container qui contient deux autres composants.
    Lorsque l'on entre dans la région du container, je voudrais effectuer une action. Le problème est que lorsque j'entre dans le container en passant par le premier composant, c'est l'action du focus de ce composant qui est pris en compte et pas celle du container.
    Comment faire pour que le container intercepte tout les fois où il est censé gagner le focus ?

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Tu peux simplement abonner ton container aux événements de focus des 2 autres composants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonComposant.addFocusListener((FocusListener)getParent());

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Bon ça à l'air de marcher, merci.
    J'ai même redéfini un autre FocusListener spécial pour dire que c'est le fiston.
    Par contre, j'ai l'impression que lorsque l'on passe très vite dans la zone du composant et en dehors, mais alors très vite... Parfois, des évenements ne sont pas pris en compte... Et du coup, on est considéré comme toujours dans la zone du composant...
    C'est normal ça ?

  4. #4
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Je ne pense pas que cela soit normal, il faudrait voir exactement ce que tu as fait.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    En fait, j'ai simplifié pour l'histoire des composants pour faire simple disons que mon conteneur peut contenir des tas d'autres composants. Mais dans tous les cas, à chaque fois que l'on est sur le container, il faut que le premier composant qu'il contient mette dans une certaine couleur une donnée qu'il contient et dès que l'on sort du container, ce composant doit avoir la couleur qui redevient normale.

    Pour le composant, j'ai surchargé sa méthode focusLost() qui ne fait rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public void focusLost() {   
    }
    Pour le container :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public class MyContainer extends X {
     
        private MyComponent component = null;
     
     
        public void afterCreate() {
    ...
           // component = On récupére le composant, donc il n'est plus à null.
               component.addFocusListener(new MyFocusListener(this));            
            }
        }
     
        public void focusGained() {        
            super.focusGained();
            if (null != component) {
                    // On met à jour la donnée
            }                         
        }
     
     
        public void focusLost() {
            super.focusLost();
     
            if (null != component) {
                  // On met à jour la donnée
            }
        }
     
     
        class MyFocusListener implements FocusListener {      
     
            /** The container */
            private My container;
     
            public MyFocusListener(MyContainer container) {
                this.container = container;
            }
     
            public void focusGained(FocusEvent e) {        
                container.focusGained();            
            }
     
            /** {@inheritDoc} */
            public void focusLost(FocusEvent e) {
            }
     
        };
    }

    En fait, en écrivant tout ceci, je me rend compte d'une chose. C'est que je veux remettre la donnée à sa valeur initial que lorsque j'en suis sortie... et pas quand je sors uniquement du composant. MAis dès fois, je me demande quand on sort du composant qui est dans le container et que l'on ne se trouve plus sur le container, si le fait d'être aussi sortie du container a vraiment été pris en compte... ?

  6. #6
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    je ne suis pas sûr te comprendre exactement...pourquoi ne pas faire en sorte que MyContainer implémente FocusListener ? MyFocusListener ne sert à rien.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    En fait, MyContainer étends une classe X qui elle possède les caractéristique de FocusListener, c'est pour cela que je peux directement surcharger ces méthodes dans la classe MyContainer.

    En fait, mon soucis, c'est que j'ai fait des tests avec des log pour voir quand est ce que le focus est gagné ou perdu par le container.
    Mais j'ai l'impression que parfois, lorsque je rentre dans la région de mon container mais que je suis également sur mon composant, alors, c'est le focus du composant qui prédomine et du coup meme si je ressors du container, les logs me disent que je suis encore dans le premier composant... C'est très louche.
    En gros voici comment l'on pourrait voir la superposition de mes composants dans mon container :

    ********************************
    *######################*
    *######################*
    *######################*
    *.....&&&&&&&&&&&........*
    *.....&&&&&&&&&&&........*
    *.....&&&&&&&&&&&........*
    *......................................*
    *......................................*
    *......................................*
    *......................................*
    *......................................*
    *......................................*
    ********************************

    *** Container
    ### Composant
    &&& Autres composants eventuels...

  8. #8
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Dans ce cas tu devrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    component.addFocusListener(this);
    Et supprime la classe MyFocusListener, elle ne sert strictement à rien, cela fait un "mic-mac" inutile.

    Comment ajoutes-tu les écoutes aux composants?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Mais si j'ajoute le même listener pour mon container et au composant. Cela ne va t'il pas vouloir dire qu'à chaque fois que je sortirais de l'un il se passera la même action.
    Chose que je ne veux faire que lorsque l'on sort du container ???

  10. #10
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    C'est ce que j'avais compris, depuis le début tu dis que tu veux que ton container intercepte les événements se produisant sur tes composants afin de changer la couleur d'un autre composant.

    En gros, dès que tu entres dans un composant et peu importe lequel, tu veux que la couleur d'un autre composant change de couleur. Ce n'est pas correct?

    Dans ce cas c'est le containeur qui doit écouter les événements de focus se produisant sur les composants.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Oui, c'est cela. Je veux qu'il n'y ait que le container qui agisse. Et j'aimerais pouvoir intercepter tout les evenement lorsque l'on entre dans le container meme par un composant qu'il contient. Parce que le chevauchement fait que des fois, je n'entre pas dans la fonction focusLost() de mon container meme si j'en suis sortie et que j'étais sur un de mes composants avant.

  12. #12
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    D'où ma question, comment ajoutes-tu les écoutes à tes composants?

    Tu devrais forcément rentrer dans la focusLost du container si il écoute la perte de focus de tous les composants.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Ben justement... Toute la discution vient de là...
    J'ai mis des logs pour voir quand j'entre dans la zone du container et quand j'en sors... Et il arrive que j'en sorte et que le log ne me le confirme pas.
    Donc, j'ai regardé si cela était reproduisible et il s'avère que cela se passe à chaque fois que je passais sur le premier composant qui prend vraiment tout la largeur de mon container...

    Je vais re tester quand même si je mets juste un listener sur mon composant et aucun autre focus listener que mon container...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Je viens de vérifier... et voici ma conclusion :

    ça a l'air de bien fonctionné (sauf que je dis "ça a l'air" parce que quand je passe très vite dedans/dehors.... Il arrive toujours un moment imprévu où pof !!! JE suis dehors mais c'est comme si j'étais toujours dedans !!)
    Ce pourait il que des events soient perdu ?

  15. #15
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Non les events ne se perdent pas en route, c'est ce qu'on en fait qui peut faire penser qu'ils se sont perdus. (ou un oubli d'abonnement d'un composant)

    Pourquoi ne donnes-tu pas le code?

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/05/2011, 17h33
  2. Réponses: 8
    Dernier message: 04/04/2007, 11h16
  3. Réponses: 3
    Dernier message: 26/02/2007, 10h14
  4. Réponses: 5
    Dernier message: 31/03/2006, 18h12
  5. Comment désactiver les actions automatiques de Windows ?
    Par j-phi dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 06/01/2005, 12h53

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