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 :

Ordre d'appel des listeners


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué Avatar de Modulpro
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2010
    Messages : 76
    Points : 175
    Points
    175
    Par défaut Ordre d'appel des listeners
    Bonjour,

    Mon problème est simple, mais je ne suis pas parvenu à trouver une réponse dans le forum, la faq, ou la doc de l'API (même google n'a pas pu me renseigner )

    J'ai un composant (en l'occurrence un JToggleButton) auquel j'ajoute successivement deux itemListener. Expérimentalement, j'ai pu constater que lors du changement d'état du JToggleButton, c'est le code du dernier listener ajouté qui est exécuté en premier. Je me demande donc si l'API garanti toujours cet ordre dans l'appel des méthodes des listeners, ou bien si cela peut changer d'une jvm à l'autre.

    Merci d'avance si vous pouvez m’éclairer sur ce point.
    Cordialement.

  2. #2
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Bonjour,
    peux tu poster le code utilisé pour permettre un bon checking???
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    à défaut d'indication contraire dans les méthodes de JToggleButton, tu dois considérer que rien n'est acquis à ce sujet.

  4. #4
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    Bonjour,

    C'est une très bonne question
    Lors du clique sur un JToggleButton, la méthode setSelected(boolean b) du model (ToggleButtonModel) envoie une notification (un fireItemStateChanged()) pour que le code du listener soit exécuté....

    Voici le corps de cette méthode :

    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
     
        /**
         * Notifies all listeners that have registered interest for
         * notification on this event type.
         *
         * @param e the <code>ItemEvent</code> to deliver to listeners
         * @see EventListenerList
         */
        protected void fireItemStateChanged(ItemEvent e) {
            // Guaranteed to return a non-null array
            Object[] listeners = listenerList.getListenerList();
            // Process the listeners last to first, notifying
            // those that are interested in this event
            for (int i = listeners.length-2; i>=0; i-=2) {
                if (listeners[i]==ItemListener.class) {
                    // Lazily create the event:
                    // if (changeEvent == null)
                    // changeEvent = new ChangeEvent(this);
                    ((ItemListener)listeners[i+1]).itemStateChanged(e);
                }
            }
        }
    On déduit bien que les listeners sont notifiés dans cet ordre : du dernier au premier ajouté au composant.
    Donc pour répondre à ta question : oui actuellement le code du JDK (ToggleButtonModel : classe interne de la classe JToggleButton) garanti toujours cet ordre de notifications aux listeners.
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par awane Voir le message
    On déduit bien que les listeners sont notifiés dans cet ordre : du dernier au premier ajouté au composant.
    Donc pour répondre à ta question : oui actuellement le code du JDK (ToggleButtonModel : classe interne de la classe JToggleButton) garanti toujours cet ordre de notifications aux listeners.
    Salut,
    seul le contrat de la méthode importe (indiqué dans la javadoc de la méthode) : on ne doit jamais se fonder sur une implémentation particulière pour fonder un traitement de ce type : on ne sait jamais comment l'implémentation peut évoluer. C'est typiquement le truc qui fait que ça peut foirer dans des années avec la mise à jour d'un jdk ou openjdk ou autre... ou sur un autre système.
    Comme le disait @Tchize_, si le contrat de la méthode ne spécifie rien, on doit partir de principe qu'il n'y a pas d'ordre garanti.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,
    seul le contrat de la méthode importe (indiqué dans la javadoc de la méthode) : on ne doit jamais se fonder sur une implémentation particulière pour fonder un traitement de ce type : on ne sait jamais comment l'implémentation peut évoluer. C'est typiquement le truc qui fait que ça peut foirer dans des années avec la mise à jour d'un jdk ou openjdk ou autre... ou sur un autre système.
    Comme le disait @Tchize_, si le contrat de la méthode ne spécifie rien, on doit partir de principe qu'il n'y a pas d'ordre garanti.
    Salut,

    Je suis d'accord avec toi, d’ailleurs j'ai dis "oui actuellement ....." (Le JDK du moment 7)
    Mon affirmation est fondée sur une analyse du code actuel ainsi que sur des tests. Si tu as bien compris le problème, ici on parle bien d'un itemListener d'un JToggleButton en passant par ToggleButtonModel..... Je ne parlais pas de quelque chose de générique.
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Bon, déjà, si tu regarde bien le code, listenerList, c'est pas une ArrayList. C'est une classe interne en sun.quelquechose. Pour le même prix ca te retourne des trucs dans le désordre, trie par ordre naturel ou dans l'ordre inverse ou ça dépend des phase lunaire. On n'est sais rien.


    Ensuite, si tu regarde le code dans openjdk, c'est déjà plus le même code. Si tu regarde la jvm version apple, c'est encore autre chose. Etc etc.

    On ne peux rien conclure. Tout ce qu'on risque de produire, c'est une code qui tombe en marche.

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    @Tchize, par sûr que ce soit une classe sun.*

    Plutôt une EventListenerList
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sinok Voir le message
    @Tchize, par sûr que ce soit une classe sun.*

    Plutôt une EventListenerList
    oui, et qui justement envoit les évenements dans l'ordre inverse (j'avais regardé dès le début) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    protected void fireStateChanged() {
            // Guaranteed to return a non-null array
            Object[] listeners = listenerList.getListenerList();
            // Process the listeners last to first, notifying
            // those that are interested in this event
            for (int i = listeners.length-2; i>=0; i-=2) {
                if (listeners[i]==ChangeListener.class) {
                    // Lazily create the event:
                    if (changeEvent == null)
                        changeEvent = new ChangeEvent(this);
                    ((ChangeListener)listeners[i+1]).stateChanged(changeEvent);
                }          
            }
        }
    Mais tous ces échanges montrent bien pourquoi la compréhension du code ne doit pas servir à déduire une implémentation en amont, mais seulement pour comprendre le fonctionnement courant éventuellement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    @Tchize
    @joel.drigo

    Bien entendu, je retiens
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    @Modulpro
    Ta question était seulement une demande de confirmation de comportement de la JVM
    ou bien tu as aussi un besoin réel que tes itemListeners s’exécutent dans un ordre précis ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #12
    Membre habitué Avatar de Modulpro
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2010
    Messages : 76
    Points : 175
    Points
    175
    Par défaut
    Bonjour et merci pour vos réponses, désolé de répondre si tard,

    Si je résume ce que j'ai compris, l'implémentation actuelle confirme bien les résultats que j'ai obtenu MAIS rien ne garanti que ça n'évolue pas, donc je ne peux pas utiliser ces résultats

    Citation Envoyé par Népomucène Voir le message
    @Modulpro
    Ta question était seulement une demande de confirmation de comportement de la JVM
    ou bien tu as aussi un besoin réel que tes itemListeners s’exécutent dans un ordre précis ?
    En fait j'ai un conteneur avec plusieurs JToggleButtons dessus. Certains ont déjà été associés à un listener lors de leur création, d'autres non. Pour définir un comportement par défaut, j'ai surchargé la méthode add du conteneur, pour associer un listener à chaque JToggleButton qui est ajouté. Ainsi ceux qui avaient déjà un listener en ont deux, mais c'est le premier qui est appelé en dernier (c'est ce que je cherche, le comportement par défaut est alors "ignoré")

    Au vu de vos réponse, (encore une fois, c'est en vous exposant le problème que la solution m'a paru évidente), je ne vais affecter le listener par défaut qu'aux JToggleButtons qui n'en possèdent pas déjà un, en testant le nombre d'éléments renvoyé par AbstractButton.getItemListeners()

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Modulpro Voir le message
    , je ne vais affecter le listener par défaut qu'aux JToggleButtons qui n'en possèdent pas déjà un, en testant le nombre d'éléments renvoyé par AbstractButton.getItemListeners()
    Mauvaise idée, aussi. Tu ne peux pas prévoir combien de listener il y à là dedans. En interne, swing enregistre aussi des listenres (que ce soit pour changer ,l'icone, l'apparence, etc)


    Vu que tu as déjà affecté des listener à certains boutons, c'est qu'il sont créés différement des autres. C'est à cet endroit là qu'il faut différencier le comportement et rajouter un else addListener(defaultListener)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/04/2014, 16h47
  2. Position de POI selon l'ordre d'appel des couches
    Par christian.bleau dans le forum IGN API Géoportail
    Réponses: 3
    Dernier message: 20/09/2012, 18h48
  3. Bizarrerie avec getXhr() et ordre d'appel des fonctions
    Par LadyArwen dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2011, 11h32
  4. Ordre d'appel des fonctions
    Par ElSegador66 dans le forum Langage
    Réponses: 5
    Dernier message: 26/11/2010, 16h27
  5. Ordre d'appel des delegates sur un EventHandler
    Par TiboodiT dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/06/2010, 18h37

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