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 :

Utilisation d'EventListenerList en java5


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de MicroPuce
    Inscrit en
    Mai 2004
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 262
    Par défaut Utilisation d'EventListenerList en java5
    Salut,
    J'ai un souci pour ajouter un listener à une listenerlist, j'ai un truc qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EventListenerList listenerList = new EventListenerList();
    MouseListener ml = new MouseAdapter() {};
    listenerList.add(ml.getClass(), ml);//erreur sur le add
    J'ai simplifié à outrance
    Et j'ai une erreur de compil (merci Eclipse) :
    The method add(Class<T>, T) in the type EventListenerList is not applicable for the arguments (Class<capture-of ? extends MouseListener>, MouseListener)
    Y a quelqu'un qui peut m'expliquer ce qui se passe et comment je peux résoudre ça?

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Février 2007
    Messages : 80
    Par défaut
    Bonjour,

    Essaye plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EventListenerList listenerList = new EventListenerList();
    MouseListener ml = new MouseAdapter() {};
    listenerList.add(MouseAdapter.class, ml);
    Ca marche chez moi comme ça. Par contre je ne connais pas l'explication Faudra attenre qu'un des fortiches du forum nous éclaire

    A +
    Philippe

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faut plutôt utiliser la classe exacte du listener (donc MouseListener dans ton cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listenerList.add(MouseListener.class, ml);
    L'explication est simple : la méthode add() est déclarée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public <T extends EventListener> void add(Class<T> t, T l)
    Ce qui signifie :
    • <T extends EventListener> : la méthode est paramétré par un type T qui doit hériter/implementer EventListener.
    • Class<T>, le premier paramètre, doit correspondre exactement à la classe correspondant au type paramétré.
    • T, le second paramètre, doit correspondre à une instance du type paramétré (ou une classe fille puisqu'il y a un cast implicite)


    Pourquoi ce code ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MouseListener ml = new MouseAdapter() {};
    listenerList.add(ml.getClass(), ml);//erreur sur le add
    On a le paramètre 1 qui correspond à MouseAdapter$1 ($1 car c'est une classe anonyme) et le second paramètre qui correspond à MouseListener (son type de déclaration), et comme un MouseListener n'est pas assignable dans un MouseAdapter la cohérence n'est plus valide...
    Bref on a deux types T différents et incompatible (dans le sens "MouseListener n'est pas une instance de MouseAdapter")

    A la rigueur si tu aurais fait ceci cela "marcherait" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MouseAdapter ml = new MouseAdapter() {};
    listenerList.add(MouseAdapter.class, ml);
    Mais ce n'est pas bon car généralement on récupère le listener depuis son interface (donc MouseListener) et non pas une implémentation (comme MouseAdapter).


    a++

  4. #4
    Membre confirmé Avatar de MicroPuce
    Inscrit en
    Mai 2004
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 262
    Par défaut
    Okay, merci à tous pour vos réponses, à force, j'vais y arriver avec ces types parametrés... un jour, peut-être?

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Février 2007
    Messages : 80
    Par défaut
    Citation Envoyé par pverley Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listenerList.add(MouseAdapter.class, ml);
    Ca marche chez moi comme ça.
    Faux, effectivement, ça ne passe pas à la compilation j'ai parlé trop vite...

    Merci adiGuba pour la correction et les explications

    A +
    Philippe.

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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