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 :

Les bonnes pratiques pour des méthodes compliquées d'acitonListeners


Sujet :

Langage Java

  1. #1
    Membre régulier Avatar de Iori Yagami
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 107
    Points : 88
    Points
    88
    Par défaut Les bonnes pratiques pour des méthodes compliquées d'acitonListeners
    Bonsoir,

    Je developpe un jeu de carte en ligne, où les actions sont un peu divers. Je suis donc dans l'obligation de leurs associer chacun un type d'évenement souris (drag&drop, double clique, clique droit)
    Mon application est bien organisée, j'essai de respecter le module MVC le plus possible. Donc les différents événements je les gère dans une classe Control. (classe imposée par l'API que j'utilise).
    Le problème est que la gestion des différents événements est trop compliquée. la méthode mouseReleased me prend environ 300 ligne de code.

    Je voulais savoir s'il y a de bonnes pratiques permettant d'améliorer mon code, ou des design patterns particuliers à ce genre de problèmes.

    Merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    pour les listeners, comme tu peux en mettre plusieurs par objet graphique, pourquoi ne pas séparer en plusieurs listener plutot que d'avoir un gros listener qui essaie de gérer toutes les conditions?

  3. #3
    Membre régulier Avatar de Iori Yagami
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 107
    Points : 88
    Points
    88
    Par défaut
    La partie graphique est un composant ou il y a plusieurs dedans c'est vrai, mais les événements surviennent sur la totalité du composant.
    C'est à dire, j'ai un composant de type HandView par exemple (où il y a des carte de jeu), et un autre de type ThrownView, les deux font partie du composant majeur contrôlé par la classe Control.

    Si je fait un double clique sur une des cartes, la carte devrai se retrouver dans le composant ThrownView, bien évidemment après avoir rempli quelques conditions nécessaires :s

    Si je drag une carte, je peux changer l'ordre des cartes dans le composant HandView.

    Si je fait un clique droit, c'est toute une autre opération qui a ses conditions et ses conséquences.

    le problème est que toutes ses opérations doivent être faites dans la méthode mouseReleased. (la méthode actionPerformed ne marche qu'avec des boutons je crois et déjà elle quoi à faire).

    J'ai essayé de rendre le code plus lisible en créant des méthodes privés qui chacune regroupe un ensemble d'instruction.
    Mais je me sens encore dans le chaos, déjà j'ai un blocage (sans aucune exception générée), mais je peux pas en déterminer la cause. Parce que c'est compliqué à suivre.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    pourquoi ne pas créer une classe séparé par action possible?

  5. #5
    Membre régulier Avatar de Iori Yagami
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 107
    Points : 88
    Points
    88
    Par défaut
    Oui, j'aime bien cette idée, mais je vois pas comment?

    Je veux dire, les paramètres de cette classe? ou encore les classes dont elle peut hériter..

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ben c'est un actionlistener, il a pas besoin d'hérite de quoi que ce soit, il implémente acitonlistener et c'est tout. Qaudn au paramètre, tu dois lui passer dans le constructeur ou autre, tout ce dont il aura besoin pour faire son travail.

  7. #7
    Membre régulier Avatar de Iori Yagami
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 107
    Points : 88
    Points
    88
    Par défaut
    comment ça un actionListener?
    Tu veux dire créer une classe qui détécte automatiquement un clique droit avec toutes les autres conditions qui vont avec pour effectuer un traitement donné?


    c'est possible ça ?

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Oui, c'est possible. Je te conseille vivement de lire http://java.sun.com/javase/6/docs/ap...ng/Action.html

    Un exemple d'utilisation se trouve ici : http://www.java2s.com/Code/Java/Even...ctionclass.htm

    Ces deux pages te permettront sans doute de gérer le clic-gauche sur un bouton de manière bien plus efficace

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Iori Yagami Voir le message
    comment ça un actionListener?
    Tu veux dire créer une classe qui détécte automatiquement un clique droit avec toutes les autres conditions qui vont avec pour effectuer un traitement donné?


    c'est possible ça ?
    ACtionListener ou MouseListener, le principe est le même. Tu prend un de tes composant et tu fais, grosso merdo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MouseListener dragAndDropListener = new GameDragAndDropListener(control);
    MouseListener clickDroitListener = new GameRightclickListener(control);
    MouseListener listenerMagique= new CheatCodeListener(control); // détecte par exemple le triple click droit suivi d'un clic gauche et deux clics milieux ;)
    composant1.addMouseListener(dragAndDropListener);
    composant1.addMouseListener(clickDroitListener);
    composant1.addMouseListener(listenerMagique);
    composant2.addMouseListener(dragAndDropListener);
    composant2.addMouseListener(clickDroitListener);
    composant2.addMouseListener(listenerMagique);
    Tous les listeners sont notifiés à chaque fois que des évènements se produisent, à eux de ne regarder que les évènements qui les intéressent. Et ainsi tu sépare facilement chaque type d'opération de l'interface dans un mouselsitener différent.

  10. #10
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ACtionListener ou MouseListener, le principe est le même. Tu prend un de tes composant et tu fais, grosso merdo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MouseListener dragAndDropListener = new GameDragAndDropListener(control);
    MouseListener clickDroitListener = new GameRightclickListener(control);
    MouseListener listenerMagique= new CheatCodeListener(control); // détecte par exemple le triple click droit suivi d'un clic gauche et deux clics milieux ;)
    composant1.addMouseListener(dragAndDropListener);
    composant1.addMouseListener(clickDroitListener);
    composant1.addMouseListener(listenerMagique);
    composant2.addMouseListener(dragAndDropListener);
    composant2.addMouseListener(clickDroitListener);
    composant2.addMouseListener(listenerMagique);
    Tous les listeners sont notifiés à chaque fois que des évènements se produisent, à eux de ne regarder que les évènements qui les intéressent. Et ainsi tu sépare facilement chaque type d'opération de l'interface dans un mouselsitener différent.
    Tu peux aussi utiliser des adapters pour economiser quelque ligne si tu n'utilise pas toute les methodes de tes listener.
    exemple:
    L'interface MonMouseListener:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public interface MonMouseListener extends MouseListener{
     public void mouseClicked(MouseEvent e);
     public void mousePressed(MouseEvent e);
     public void mouseEntered(MouseEvent e);
     public void mouseExited(MouseEvent e);
    }
    L'adapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class MonMouseListenerAdapter implements MonMouseListener{
    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent arg0) {}
    }
    L'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MonMouseListener listenerMouseClicked= new MonMouseListenerAdapter(){
    @Override
    public void mouseClicked(MouseEvent e) {
     //code pour gerer les click
    }
    };
    Bonne chance

  11. #11
    Membre régulier Avatar de Iori Yagami
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 107
    Points : 88
    Points
    88
    Par défaut
    Oui, je vais essayer ça. Merci à tous!

Discussions similaires

  1. Les Bonnes pratiques pour Outlook 2007
    Par gnaoui_9999 dans le forum Outlook
    Réponses: 1
    Dernier message: 12/07/2010, 19h40
  2. Réponses: 33
    Dernier message: 18/04/2009, 13h36
  3. Réponses: 7
    Dernier message: 23/03/2009, 23h38
  4. Réponses: 4
    Dernier message: 01/10/2008, 09h59

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