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

Interfaces Graphiques en Java Discussion :

Attendre un évènement pour continuer l'exécution


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Attendre un évènement pour continuer l'exécution
    Hello,
    J'ai à programmer un jeux de dame avec swing, mais je me heurte a un petit problème:
    Lorsque c'est au tour d'un joueur humain de jouer, je souhaiterai que dans la méthode correspondante (player.play() qui renvoie un coup joué), on attende que la personne clique sur le pion a jouer (clique ds le panel qui représente l'échiquier...) pour pouvoir ensuite traiter cet évènement, créer le coup qui correspond et renvoyer ce coup.

    Pour le moment dans mon programme, le jeux trourne de la manière suivante:
    une boucle tant que qui s'arrète lorsqu'il n'y a plus possibilité de jouer, et qui fait appele a chaque tour a la méthode jouer() du joueur courant..
    Seulement j'arrive pas a trouver le moyen de faire en sorte que la méthode play() attende un évènement de souris...

    Si quelqu'un a une piste elle sera la bienvenue...
    Merci d'avance

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu prends le problème à l'envers. Il ne faut pas faire une boucle et attendre un événement dans ladite boucle. Il faut simplement traiter les événements pour connaître la sélection (i.e. la pièce à déplacer) et la cible (i.e. la case où déplacer le pion). Ça se fait bêtement avec des MouseListener par exemple.
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    Swing possède un gestionnaire d'événements continu qui est accessible par différents Listeners implémentés dans les package javax.swing.event et awt.event. Autrement tu disposes des classes anonymes pour charger des écouteurs et de Collections d'écouteurs (Listeners) pour avertir ceux-ci. C'est con comme mécanisme... Les classes anonymes sont celles que tu surcharges d'opérations au moment même de leur instanciation: ici on a des écouteurs chargés anonymement tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // la classe anonyme
     // les opérations à effectuer à l'appel de l'évènement
     doOperation();
    // (...)
    }});
    ActionPerformed sera appelé à chaque appel des écouteurs de l'objet "t".

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par Gfx
    Tu prends le problème à l'envers. Il ne faut pas faire une boucle et attendre un événement dans ladite boucle. Il faut simplement traiter les événements pour connaître la sélection (i.e. la pièce à déplacer) et la cible (i.e. la case où déplacer le pion). Ça se fait bêtement avec des MouseListener par exemple.
    Oui c'est ce que je me suis dit au départ, mais j'essayais de garder une structure la plus "objet" possible, ie. le joueur devrait posséder une méthode play qui attend qu'il agisse sur la vue.
    C'est le cas pour le joueur artificiel et je voulais essayer de garder la même manière de faire (ie. l'appel de la méthode pla()) pour le joueur non artificiel mais ca sembe pas possible en mode graphique.

    Merci de vos réponses en tout cas.

  5. #5
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par vinzzzz
    Oui c'est ce que je me suis dit au départ, mais j'essayais de garder une structure la plus "objet" possible, ie. le joueur devrait posséder une méthode play qui attend qu'il agisse sur la vue.
    C'est on ne peut plus "objet" ce qu'a dit gfx. C'est là tout l'intéret des listeners...

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    vinzzzz : Ce n'est pas un problème de programmation objet ici. Tu essayes une approche active alors que la bonne manière de faire, dans une interface graphique de type Swing, est la programmation événementielle.
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Ok merci de vos conseil.

    En fait je me doute que la bonne manière de faire c'est avec les listener. Seulement, j'avais pas trouvé le moyen de faire comme je souhaitais, ca me semblais un peu moins objet de ne pas appeler de méthode play pour faire jouer un joueur, dans le sens ou je voyais ca de la manière suivante: "c'est au joueur de jouer, on appel donc sa méthode jouer, et on attend qu'il agisse pour renvoyer son choix".

    La solution suivante, donnée par herve91 semble beaucoup plus convenir a ce que je souhaite faire:
    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
    class Humain extends Joueur implements ActionListener {
      private Coup coupChoisi;
     
      public Coup jouer() {
        //On met en place les ActionListener
        ...
     
        // On pose un verrou sur this et on se met en attente
        coupChoisi = null;
        synchronized(this) {
          while (coupChoisi == null) {
            try {
              wait();
            } catch (InterruptedException ie) {}
          }
        }
     
        //On retire les ActionListener
        ...
     
        return coupChoisi;
      }
     
      public void ActionPerformed(ActionEvent e) {
        Coup coupChoisi = ...;
     
       // On réveille le thread chargé de renvoyer le coup choisi
       synchronized(this) {
          notify();
        }
      }
    }
    Je ne sais pas comment fonctionne synchronize, mais pouvez vous me confimer qu'ici le synchronize sert uniquement à faire attendre sans faire ramer le PC (puisqu'un simple while(coup == null) suffirait vu que lors d'un clic de l'utilisateur, coup deviendrait différent de null).

    Quoi qu'il en soit, ca ressemble beaucoup à l'approche que j'avais. Est-ce que cette approche est aussi valide que l'utilisation classique d'un lisener ?

Discussions similaires

  1. Attendre une touche pour continuer sur VBA
    Par Theo_david dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/02/2009, 16h15
  2. Réponses: 3
    Dernier message: 12/07/2007, 02h40
  3. attendre un evenement pour continuer une boucle
    Par dederfred dans le forum Flash
    Réponses: 2
    Dernier message: 20/01/2007, 20h01
  4. [VB6] attendre un événement pour continuer l'exécution
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 12/11/2002, 13h08

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