Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion des ActionListener de différents Panel

Et ce dans une même JFrame

    28 février 2015 à 23:40:17

    Bonjour,

    Débutant en java, je cherche, dans le cadre de la création de mon premier jeu (ma première "vraie" application) à faire interagir entre eux différents JPanel que j'ai codés indépendamment : un JPanel Menu, un JPanel Options, un JPanel Jeu et un JPanel Regles. À l'heure de réunir les JPanel dans un CardLayout appliqué à ma JFrame, j'ai cependant un probème : dans le cas de mon JPanel Jeu par exemple, les touches directionnelles sont utilisées pour certaines actions. Or si je veux appliquer un CardLayout, il faut que ce soit ma fenêtre qui écoute le clavier et non mon JPanel Jeu.

    Dès lors, la solution que j'ai imaginé serait lors de l'appui sur une touche de simuler cet appui à partir de la JFrame dans le JPanel concerné. En gros, si ma fenêtre m'écoute taper la toucheFlèche du bas je voudrais qu'elle fasse en sorte que l'écouteur de mon JPanel recoive l'informationFlèche du bas. 

    L'idée à laquelle j'ai abouti serait  de faire quelque chose comme ça :

    - le focus est sur ma JFrame

    - lorsqu'on appuie sur une touche comme la flèche du bas le focus passe sur le JPanel jeu

    - l'ordinateur simule alors l'appui sur la touche du bas dans le JPanel jeu

    - je remet le focus sur la JFrame

    Cependant, je ne sais pas comment réaliser la troisième étape de ma méthode : comment simuler automatiquement l'action d'appuyer sur une touche ?

    Si vous avez d'autres solutions plus propres quant à la résolution de mon problème, je suis preneur aussi.

    Merci d'avance pour vos éventuelles réponses !

    -
    Edité par pauljennepin 28 février 2015 à 23:40:46

    • Partager sur Facebook
    • Partager sur Twitter
      1 mars 2015 à 0:04:44

      Dans ton KeyListener, tu peux simplement appeler une méthode de ton JPanel.
      monPanneau.allerAGauche();
      • Partager sur Facebook
      • Partager sur Twitter
        1 mars 2015 à 0:30:56

        Merci pour ta réponse brubru.

        Néanmoins je ne peux pas vraiment appeler une méthode de mon JPanel, car les appuis sur les touches sont utilisés dans des conditions d'une méthode de mon JPanel, méthode qui est réutilisée dans d'autres classes de mon projet. Il faudrait donc que je revois toute la structure de mon projet. Par exemple, dans mon JPanel jeu j'ai la méthode suivante :

        private synchronized void startMovement(KeyListener keyListener, KeyEvent ke) {
          boolean movementStarted = false;
          
            this.initMovementTasks();
          
            if(this.getGame().getState() == Game.GAME_RUNNING && ((!(this.getGame().isTourJ2()) && (this.utiliserFlechesJ1 && ke.getKeyCode() == KeyEvent.VK_LEFT) || !this.utiliserFlechesJ1 && ke.getKeyChar() == gaucheJ1)) || (this.getGame().isTourJ2() && (this.utiliserFlechesJ2 && ke.getKeyCode() == KeyEvent.VK_LEFT || !this.utiliserFlechesJ2 && ke.getKeyChar() == this.gaucheJ2)))  {
              this.getGame().moveLeft();
                this.getGame().getTimer().scheduleAtFixedRate(GameFrame.this.moveLeftMovementTask, 150, 50);
                movementStarted = true;
            }
            else if(this.getGame().getState() == Game.GAME_RUNNING && ((!(this.getGame().isTourJ2()) && (this.utiliserFlechesJ1 && ke.getKeyCode() == KeyEvent.VK_RIGHT) || !this.utiliserFlechesJ1 && ke.getKeyChar() == droiteJ1)) || (this.getGame().isTourJ2() && (this.utiliserFlechesJ2 && ke.getKeyCode() == KeyEvent.VK_RIGHT || !this.utiliserFlechesJ2 && ke.getKeyChar() == this.droiteJ2)))  {
              this.getGame().moveRight();
              this.getGame().getTimer().scheduleAtFixedRate(GameFrame.this.moveRightMovementTask, 150, 50);
                movementStarted = true;
            }
            else if(this.getGame().getState() == Game.GAME_RUNNING && ((!(this.getGame().isTourJ2()) && (this.utiliserFlechesJ1 && ke.getKeyCode() == KeyEvent.VK_UP) || !this.utiliserFlechesJ1 && ke.getKeyChar() == tourneJ1)) || (this.getGame().isTourJ2() && (this.utiliserFlechesJ2 && ke.getKeyCode() == KeyEvent.VK_UP || !this.utiliserFlechesJ2 && ke.getKeyChar() == this.tourneJ2)))  {
                if(! ((ke.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) == InputEvent.SHIFT_DOWN_MASK)) {
                  this.getGame().turnLeft();
                  this.getGame().getTimer().scheduleAtFixedRate(this.turnLeftMovementTask, 200, 150);
                    movementStarted = true;
                }
                else {
                  this.getGame().turnRight();
                  this.getGame().getTimer().scheduleAtFixedRate(this.turnRightMovementTask, 200, 150);
                    movementStarted = true;
                }
            }
            
            if(movementStarted) {
              this.removeKeyListener(keyListener);
              this.addKeyListener(GameFrame.this.stopMovementKeyAdapter);
            }
        }

        L'intérêt de simuler l'appui sur une touche, c'est que je n'ai pas à changer la structure de ce que j'ai pour l'instant codé.

        • Partager sur Facebook
        • Partager sur Twitter

        Gestion des ActionListener de différents Panel

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown