Partage
  • Partager sur Facebook
  • Partager sur Twitter

keyListener n'écoute rien...

    9 janvier 2009 à 23:31:52

    Salut les zéros, c'est encore moi ^^
    Entre deux sockets, je suis en train de faire un petit tétris. J'ai un problème dans le code suivant :
    package GUI;
    
    import java.util.*;
    import javax.swing.JPanel;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Color;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import tetris.*;
    import exceptions.*;
    
    public class VueJeu extends JPanel implements Observer {
    
        /**
          définitions des variables et du modele ICI...
        */
    
        public VueJeu(Modele m) {
            super();
            L_BRIQUE = 20;
            H_BRIQUE = 20;
            L_PANN = L_BRIQUE*m.NB_COL;
            H_PANN = H_BRIQUE*m.NB_LIG;
            super.setPreferredSize(new Dimension(L_PANN, H_PANN));
            modele = m;
            modele.addObserver(this);
            addMouseListener(new MouseAdapter() {
               public void mouseClicked(MouseEvent ev) {
                   System.out.println("action");
               }
            });
            addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode()==KeyEvent.VK_B) {
                        modele.deplacerDroite();
                    }
                    System.out.println("droite");
                }
            });
        }
    ...
    }
    

    Quand je clique sur le JPanel, il m'affiche "action" dans la console mais quand je presse une touche, il réagit pas... Il m'affiche même pas "droite". A votre avis d'où vient le problème ? Moi je sèche...

    Merci d'avance pour votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
    "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
      10 janvier 2009 à 0:11:21

      Salut !
      As-tu essayé de remplacer KeyPressed() par KeyTyped() ou KeyReleased() pour voir ce que ça fait ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 janvier 2009 à 1:16:35

        oui j'ai essayé et rien non plus. ^^ T'as une idée du problème ?
        • Partager sur Facebook
        • Partager sur Twitter
        "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
          10 janvier 2009 à 2:14:43

          Non je ne vois vraiment pas ton code m'a l'air bon ^^ Mais peut-être que quelque-chose fait conflit dans une autre classe. Peut-être que l'ajout d'un KeyListener directement dans le constructeur fait buger? A vrai dire je n'ai jamais procédé comme ça ^^ As-tu essayé d'inverser l'ajout des listeners pour voir ? Ou voir-même de rajouter un simple "this." devant ? On ne sait jamais. Sinon au pire va dans ta classe Main (ou quel que soit son nom) et essaye au pas par pas avec le débugger

          [Edit] Ah oui aussi lors de l'appui sur une touche, le bon panel n'est peut-être pas "sélectionné" si il y'en a plusieurs (je ne sais pas vraiment si ça fonctionne comme ça). Ah oui, as-tu essayé d'exporter ton programme en JAR pour le tester? Des fois que le problême vienne d'Eclipse (ou peu importe l'IDE que tu utilises)
          • Partager sur Facebook
          • Partager sur Twitter
            10 janvier 2009 à 8:58:23

            Les simple panels ne sont pas focusables. Ils ne peuvent donc pas réceptionner le moindre évènement relatife au clavier.

            Essaie de rendre ton panel focusable au moyen de setFocusable(true)
            • Partager sur Facebook
            • Partager sur Twitter
              10 janvier 2009 à 10:43:48

              Citation : QuentinC 2

              Les simple panels ne sont pas focusables. Ils ne peuvent donc pas réceptionner le moindre évènement relatife au clavier.

              Essaie de rendre ton panel focusable au moyen de setFocusable(true)



              et en plus tu dois mettre le Focus sur ton panel ...
              panel.setFocus();

              a partir de ce moment là, ça marche :)
              • Partager sur Facebook
              • Partager sur Twitter
                10 janvier 2009 à 11:35:28

                Si je ne m'abuse, c'est requestFocus et non setFocus
                • Partager sur Facebook
                • Partager sur Twitter
                  10 janvier 2009 à 12:14:20

                  heuuu god damn XD
                  j'ai encore dit une bêtise XD
                  en plus je l'ai déjà dites dans un autre topic =/ je les confond toujours =/
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 janvier 2009 à 15:13:33

                    Merci bien, j'aurais jamais trouvé ça tout seul ^^ Par contre, j'ai un autre petit problème maintenant (même si c'est pas vital). Je suis sous Ubuntu Intrepid et quand j'appuie sur des touches du clavier comme a,b etc... ça marche mais les flèches, il n'en tient pas compte. Quand j'appuie sur les flèches rien ne se passe. C'est un problème classique ça ou pas ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
                      10 janvier 2009 à 23:22:43

                      Si tu réagis à keyTyped, c'est normal : il ne prend que ce qui correspond à des caractères. Non seulement il ne prendra pas les flèches, mais il ne t'enverra qu'un seul évènement contenant le caractère "û" si tu appuies sur "^" puis sur "u" par exemple.

                      Pour les deux autres, keyPressed et keyReleased, non, c'est pas normal. Tu devrais tout recevoir, y compris les touches comme ctrl shift ou alt tout seul, sauf peut-être la touche windows, tab, etc. (qui sont interceptés en amont)

                      Au pire si tu ne peux pas jouer avec les flèches, tu prévois un pavé fléché alternatif, avec par exemple les touches S (gauche), D (bas), F (droite) et E (haut), ou encore le pavé numérique (4, 6, 2, 8)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 janvier 2009 à 0:51:40

                        Donc je viens de regarder et même keyPressed ne prend pas les flèche. Par contre il reconnait ma touche espace. Pourtant c'est bien : KeyEvent.VK_RIGHT non ? C'est bizarre parce que j'ai trouvé un tetris en applet sur le net et lui il reconnait mes touches fléchées... Voilà mon code, il me parait pourtant pas incorrect...
                        vueJeu.addKeyListener(new KeyAdapter() {
                                    public void keyPressed(KeyEvent e) {
                                        try {
                                            if (!estEnPause()) {
                        
                                                if (modele.estDeplacableGauche() && e.getKeyChar()== KeyEvent.VK_LEFT )
                                                    modele.deplacerGauche();
                                                else if (modele.estDeplacableDroite() && e.getKeyChar()== KeyEvent.VK_RIGHT )
                                                    modele.deplacerDroite();
                                                else if (modele.rotationPossible() && e.getKeyChar()== KeyEvent.VK_SPACE )
                                                    modele.rotation();
                                                modele.notifyObservers();
                                            }
                                        }
                                        catch (BriqueIncorrecte err) {
                                            System.err.println(err.getMessage());
                                        }
                                    }
                                });
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                        "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
                          11 janvier 2009 à 1:38:40

                          mhhhh
                          essaye de regarder si un evenement est déclanché quand tu pousses sur la fleches :o
                          un System.out.println(); hors du if :)
                          voir si au moins il voit qu'une touche à été enfoncée :o
                          public void keyPressed(KeyEvent e) {
                          System.out.println("Detectée");
                          try{
                          ...
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 janvier 2009 à 11:25:59

                            Au fait es-tu vraiment obligé d'utiliser un panel ?
                            Parce que tu peux également dessiner et intercepter les évènements directement sur la fenêtre ell-même. Ca pourrait peut-être simplifier les choses, à condition bien sûr que tu n'utilises aucun autre composant JButton, JTextField, etc. au quel cas ça deviendrait très compliqué au contraire.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 janvier 2009 à 19:53:40

                              Donc voilà, je travaillais avec netbeans et ça m'a gonflé tellement il est lent... Pire qu'un vieux word avec un document de 25 pages... Alors je suis revenu à eclipse et à la différence de netbeans (qui me disait que les keycode valait toujours 0), ma touche flèche gauche marche à condition d'utiliser getKeyCode() et non getKeyChar().
                              Ceci dit, c'est vous qui m'avez mis sur la voix en me disant de vérifier ^^

                              Donc désolé de vous avoir monopoliser pour si peu... (je hais NetBeans maintenant... lol)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              "Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
                                11 janvier 2009 à 22:04:54

                                Ah forcément, si tu utilisais getKeyChar, tu ne pouvais pas savoir s'il s'agissait des flèches ou d'autre chose vu que ce type de touche ne désigne aucun caractère affichable.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                keyListener n'écoute rien...

                                × 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