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

Langage Java Discussion :

Créer ses propres listeners


Sujet :

Langage Java

  1. #1
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut Créer ses propres listeners
    Bonjour

    J'ai lu l'excellent tuto sur Developpez pour créer ses propres listeners. J'ai réussi à faire marcher le programme mais j'ai dû utiliser une "astuce" qui casse tout le design pattern MVC...

    En fait, mon interface graphique lance un thread.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void run()
    {
       Partie p = new Partie(1,4);
    }
    Le problème, c'est que 'p' lance une boucle infinie (c'est voulu) et donc si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void run()
    {
       Partie p = new Partie(1,4);
       p.addMyListener(this);
    }
    évidemment, le listener n'est jamais crée... Donc je ne vois pas comment faire... Ce que j'ai réussi à faire pour au moins tester que tout marche au niveau du code, c'est faire addMyListener dans le constructeur de Partie et de passer au constructeur de Partie une référence sur l'interface graphique et donc j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Partie(int a, int b, Gui ig)
    {
       // du code...
       // avant la boucle infinie
        addMyListener(ig);
    Et là, ça marche ... Seulement je perds l'intérêt du listener puisque mon modèle dépend de l'interface graphique...

    La solution est sûrement évidente, c'est peut-être l'heure tardive qui me rend c*n

    Nas'

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il faut que tu lances la boucle infinie dans un autre thread ; ainsi, le thread de base continuera à tourner, et donc aura la possibilité d'inscrire tous les listeners qu'il voudra.

    Avoir une boucle infinie n'est pas en soi un problème (c'est peu ou prou le choix de swing, et de tous les systèmes client / serveur). Ici il faut que tu voyes si c'est un simple choix de mise en oeuvre, une facilité technique que tu as trouvée, auquel cas il est préférable de masquer au maximum ce point pour l'extérieur, ou bien si c'est justifié par ton domaine d'application, auquel cas tu auras probablement avantage à le rendre plus explicite, et à faire que ton Runnable soit public (sur le modèle du thread swing, par exemple, que chacun peut manipuler).

  3. #3
    Membre éclairé Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Par défaut
    Ce que tu peux faire, c'est utiliser le polymorphisme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Partie(int a, int b, Gui ig)
    {
       // du code...
       // avant la boucle infinie
        addMyListener(ig);
    Devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Partie(int a, int b,MyListenerInterface ig)
    {
       // du code...
       // avant la boucle infinie
        addMyListener(ig);
    Où MyListenerInterface est ton interface d'écoute

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Ta boucle infinie pourrait être dans une méthode "start()" (ou autre, mais une méthode) plutôt que dans le constructeur directement.
    Ainsi, tu pourrais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Partie p = new Partie(...);
    p.addXListener(...);
    p.start();
    Sinon, si tu veux absolument garder ta partie telle quelle, tu peux utiliser une (horrible) astuce:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Partie p = new Partie(...) {{addXListener(...);}};
    Attention cependant, le addXListener a lieu AVANT le constructeur, donc il faut bien initialiser EventListenerList avant le constructeur (comme dans le tuto).

    Donc la première solution est meilleure je pense...

  5. #5
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Merci pour vos réponses.

    En fait, juste après avoir posté mon message hier, j'ai pensé à la première méthode de ®om qui me semble la plus simple à mettre en oeuvre.

    Belegkarnil, je ne savais pas qu'on pouvait faire ça, évidemment si j'avais su ...

    gifffftane, la boucle infinie c'est pour l'écoute/client serveur. Et je préfère éviter d'avoir encore un thread, j'en ai tellement pour l'instant

    Merci à vous.

    Nas'

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    D'ailleurs, pour ajouter tous tes listeners au constructeur, tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Partie(int a, int b,MyListenerInterface... ig)
    Comme ça t'as le droit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new Partie(1,2); // pas de listener
    new Partie(1,2,ig1,ig2,ig3); // 3 listeners
    new Partie(1,2,ig); // 1 listener

  7. #7
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Je me rends compte que je n'ai pas très compris en fait.
    Dans la classe Gui qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Gui extends JFrame implements MyListener {
    // du code ...
    new Partie(1,4,this);
    }
    ce n'est pas "this" que je suis supposé passer, si ? Sachant que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Partie(int a, int b, MyListener listen){


    Nas'

  8. #8
    Membre éclairé Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Par défaut
    Si, mais quel est le type de la variable surlaquel tu affectes listen? Son type doit être MyListener pas GUI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Partie(int a, int b, MyListener listen){

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Dans ton cas, si, mais il est plutôt conseiller de faire un listener autre que ta classe graphique...

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Gui extends JFrame {
        class Controller implements MyListener {
             ...
        }
     
        private final Controller controller = new Controller();
     
        public void uneMethode() {
            new Partie(1,2,controller);
        }
    }

  10. #10
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    D'accord, merci pour les précisions

    Nas'

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

Discussions similaires

  1. Créer ses propres Listener Java
    Par bind ways dans le forum Débuter avec Java
    Réponses: 13
    Dernier message: 03/08/2011, 19h45
  2. Créer ses propres exceptions
    Par Neilos dans le forum C++Builder
    Réponses: 10
    Dernier message: 13/06/2006, 18h44
  3. [Struts][Validator] : créer ses propre validator
    Par anaon dans le forum Struts 1
    Réponses: 3
    Dernier message: 10/05/2006, 07h19
  4. [Struts]créer ses propres tag struts
    Par jeb001 dans le forum Struts 1
    Réponses: 3
    Dernier message: 08/09/2005, 19h56
  5. Programme permettant de créer ses propres paquets TCP/UDP
    Par mat087 dans le forum Développement
    Réponses: 6
    Dernier message: 21/05/2004, 21h42

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