Partage
  • Partager sur Facebook
  • Partager sur Twitter

Événements clavier

Euh... C'est moi ou java se transforme en chinois ?

Sujet résolu
    7 juillet 2008 à 17:28:12

    Bonjour !

    Bien que je ne sois pas débutant en programmation, c'est presque aussi simple que : J'ai rien compris...

    Bon j'explique ^^ :
    J'ai un menu. Je voudrais pouvoir déplacer un curseur dans ce menu à partir des touches directionnelles. Mais je ne sais pas du tout comment m'y prendre. J'ai des trucs, des bidules et des choses (trouvé sur mon ami google) comme KeyListener, KeyEvent etc... mais comment les utiliser...?

    Si quelqu'un pouvait m'expliquer les bases des événements clavier ça serait sympas :)

    Edit : J'ai réussi parfaitement à faire l'interface graphique de mon menu, et je sais comment faire pour que le curseur s'affiche. En gros il faut juste que j'arrive à capter l'appui de la touche haut ou bas du clavier.
    • Partager sur Facebook
    • Partager sur Twitter
      7 juillet 2008 à 17:48:27

      Question stupide : pourquoi tu n'utilises pas un JMenu ?

      Bon, sinon : il faut ajouter le listener au composant duquel tu aimerais récupérer les évènements clavier avec addKeyListener. A chaque appui keyPressed est appelé, à chaque relâchement c'est keyReleased. Pour keyTyped, j'ai jamais vraiment compris mais tu es obligé de l'implémenter puisque KeyListener est une interface.
      • Partager sur Facebook
      • Partager sur Twitter
        7 juillet 2008 à 18:24:08

        En fait je n'utilise pas JMenu pour deux raisons :
        - Je viens de la découvrir grâce à toi :o
        - Vu que j'aurai besoin de la class pour la suite autant la programmer tout de suite :p

        Voici mon code mais j'ai une erreur si vous pouviez m'aider à la trouver...

        import java.applet.*;
        import java.awt.event.* ;
        
        public class ClavierM
        {
                public ClavierM()
                {
                        addKeyListener(this);
                }
                public void keyPressed(KeyEvent e)
                {
                        if(e.getKeyCode() == KeyEvent.VK_DOWN)
                        {
                                Menu.downMouv();
                        }
                }
                public void keyTyped(KeyEvent e){}
                public void keyRealesed(KeyEvent e){}
        }
        


        il me dit :
        cannot find symbol "addKeyListener(this)" :(

        édit : j'ai remis le code en java (J'avais pas vu java en fait lol)
        • Partager sur Facebook
        • Partager sur Twitter
          7 juillet 2008 à 19:11:00

          Ben c'est simple : ta classe n'est pas définie comme étant un écouteur d'évènement clavier (elle n'implémente pas l'interface KeyListener) donc tu ne peux pas l'utiliser comme telle.

          Il te suffits d'écrire :

          public class ClavierM implements KeyListener
          


          P.S: Penses à colorier ton code en mettant bien code Java et non "Autre". ;)
          • Partager sur Facebook
          • Partager sur Twitter
            7 juillet 2008 à 21:55:08

            Nouveau code :

            import java.applet.*;
            import java.awt.event.*;
            
            public abstract class ClavierM extends Applet implements KeyListener
            {
            	public ClavierM()
            	{
            		this.requestFocus();
            		addKeyListener(this);
            	}
            	public void keyPressed(KeyEvent e)
            	{
            		if(e.getKeyCode() == KeyEvent.VK_DOWN)
            		{
            			Menu.downMouv();
            			System.out.println("ok");
            		}
            	}
            	public void keyTyped(KeyEvent e){}
            	public void keyRealesed(KeyEvent e){}
            }
            


            Il compile mais aucune réaction quand j'appuie sur la flèche du bas. J'ai ajouté la ligne où il affiche ok mais aucune réponse : ça vient bien de la class que vous voyez au dessus.

            Une idée s'il vous plait ? o_O
            • Partager sur Facebook
            • Partager sur Twitter
              8 juillet 2008 à 0:19:38

              Enlève le abstract qui n'a pas de raison d'être là et corrige : keyReleased. Je suis étonné que ton applet puisse démarrer quand même...
              • Partager sur Facebook
              • Partager sur Twitter
                8 juillet 2008 à 11:02:36

                J'ai corrigé tout ça mais ça ne fonctionne toujours pas :(

                import java.awt.*;
                import java.awt.event.*;
                
                public class ClavierM extends java.applet.Applet implements KeyListener
                {
                	public void init()
                	{
                		addKeyListener(this);
                	}
                	public void start()
                	{
                		requestFocus();
                	}
                	public void keyPressed(KeyEvent evt)
                	{
                		System.out.println("ok");
                	}
                	public void keyTyped(KeyEvent evt){}
                	public void keyReleased(KeyEvent evt){}
                }
                


                Une idée ?
                • Partager sur Facebook
                • Partager sur Twitter
                  8 juillet 2008 à 11:33:27

                  Qu'est ce qui ne fonctionne pas? ton code marche il affichera bien ok dans la console quand tu pressera une touche.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 juillet 2008 à 11:40:28

                    Essaye le code suivant

                    import java.awt.event.*;
                    
                    public class ClavierM extends java.applet.Applet implements KeyListener{
                    
                    public void init(){
                    addKeyListener(this);
                    }
                    
                    public void keyTyped(KeyEvent k){
                    }
                    public void keyPressed(KeyEvent k){
                    if(k.getKeyCode() == KeyEvent.VK_DOWN){
                    System.out.println("ok");
                    }
                    public void keyReleased(KeyEvent k){
                    }
                    }
                    


                    Normalement ce code affichera ok dans la console. Normalement le tien aussi.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 juillet 2008 à 12:39:53

                      C'est sûrement moi qui n'utilise pas bien ma class ClavierM je vais tenter dans un programme plus simple.
                      Mais comment je suis sensé l'utiliser ? En faisant une instance ?

                      ClavierM c = new ClavierM();
                      


                      non ? j'ai essayé avec et sans => aucune réponse. :(
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 juillet 2008 à 12:56:58

                        tu lance ton applet puisque que ta class en est un. Je vois pas ou est le problème.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 juillet 2008 à 16:33:17

                          Bon j'ai refais un code entier pour comprendre mais je ne parviens pas à trouver l'erreur. Voilà tout :

                          But du code :
                          - Ouvrir une fenêtre.
                          - Afficher "ok" si une touche est enfoncée (Dans la console).

                          Code entier :
                          Class test :
                          public class Test
                          {
                          	public static void main(String[] arg)
                          	{
                          		Fenetre f = new Fenetre();
                          /*Je ne sais pas si cette ligne doit être mise mais avec ou sans ça ne fonctionne pas*/
                          		Clavier c = new Clavier();
                          		
                          		while(true)
                          		{
                          			try
                          			{
                          				Thread.sleep(30);
                          			}
                          			catch(InterruptedException e)
                          			{
                          				e.printStackTrace();
                          			}
                          		}
                          	}
                          }
                          


                          Class Fenetre :
                          import javax.swing.JFrame;
                           
                          public class Fenetre extends JFrame
                          {
                          	public Fenetre()
                          	{
                          		this.setTitle("Test");
                          		this.setSize(200,200);
                          		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                          		this.setVisible(true);
                          	}
                          }
                          


                          Class Clavier :
                          import java.awt.event.*;
                          
                          public class Clavier extends java.applet.Applet implements KeyListener
                          {
                          	public void Clavier()
                          	{
                          		addKeyListener(this);
                          	}
                          	public void keyTyped(KeyEvent k)
                          	{
                          	}
                          	public void keyPressed(KeyEvent k)
                          	{
                          		System.out.println("ok");
                          	}
                          	public void keyReleased(KeyEvent k)
                          	{
                          	}
                          }
                          


                          Résultat :
                          Aucune erreur de compilation.
                          Erreur lors de l'exécution : Il n'affiche pas "ok".

                          Si quelqu'un pouvait, s'il vous plait, sauver mes nerfs avant qu'ils prennent dessus sur ma raison et lance cet ordinateur par la fenêtre... ^^

                          PS: Mon compilateur n'est pas eclipse. Serait-il possible s'il vous plait quelqu'un de gentil de compiler ce code avec Eclipse ? Si ça venait de là ça serait bête :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 juillet 2008 à 19:15:48

                            Pourquoi t'as classe Clavier hérite-t-elle de la classe Applet ? oO
                            Faudrait savoir, ton programme est soit sous forme de fenêtre classique, soit destiné à être exécuté par ton navigateur sous forme d'Applet.

                            Edit : Ton erreur vient du constructeur de Clavier ! Enlève le void dans son en-tête. ^^
                            Un constructeur est toujours sous cette forme
                            public class MaClasse {
                            
                              public MaClasse(){
                                  //Ton constructeur
                               }
                            }
                            


                            Edit²: Ceci dit ça marche pas plus, je vais regarder plus en profondeur ton code.

                            Edit number 3 >< : À quoi sert ta boucle infinie ?

                            Edit with the solution : Ce n'est pas ta classe Clavier qui doit écouter l'évènement, mais ta fenêtre. (soit la classe Fenêtre)
                            J'ai modifié son constructeur pour qu'il prenne en paramètre l'instance de Clavier qui écoute les évènements.
                            J'ai aussi transformé ta classe Clavier en un JPanel que j'intègre à la fenêtre. Tout bien réfléchi l'intégrer à la fenêtre est peut-être inutile.
                            Je ne sais pas si c'est la solution la plus "propre".
                            P.S: J'ai renommé les classes pour pas supprimer mes propres classes chez moi. ><
                            import java.awt.event.*;
                            import javax.swing.JPanel;
                            
                            public class ClavierJoe extends JPanel implements KeyListener
                            {
                            	public ClavierJoe()
                            	{
                            		super();
                            	}
                            	public void keyTyped(KeyEvent k)
                            	{
                            	
                            	}
                            	public void keyPressed(KeyEvent k)
                            	{
                            		System.out.println("ok");
                            	}
                            	public void keyReleased(KeyEvent k)
                            	{
                            	
                            	}
                            }
                            


                            import javax.swing.JFrame;
                            import java.awt.Container;
                            import java.awt.event.*;
                             
                            public class FenetreJoe extends JFrame
                            {
                            	public FenetreJoe(ClavierJoe clavier) //Pour avoir la référence de l'écouteur (donnée par le main)
                            	{
                            		this.setTitle("Test");
                            		this.setSize(200,200);
                            		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            		Container conteneur = getContentPane();
                            		conteneur.add(clavier);
                            		addKeyListener(clavier); //C'est la classe Fenetre qui a besoin d'un écouteur
                            		this.setVisible(true);
                            	}
                            	
                            	
                            }
                            


                            public class Joejoe
                            {
                            	public static void main(String[] arg)
                            	{
                            /*Je ne sais pas si cette ligne doit être mise mais avec ou sans ça ne fonctionne pas*/
                            		ClavierJoe c = new ClavierJoe();
                            		FenetreJoe f = new FenetreJoe(c);
                            		
                            		
                            	}
                            }
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 juillet 2008 à 23:40:34

                              Magnifique !

                              Merci tout plein grâce à toi j'ai enfin compris comment ça fonctionnait et donc résolu mon problème. J'ai réussi à faire mon programme à partir du petit programme que je t'avais donné et que tu as corrigé.

                              PS : Pour le constructeur honte à moi faute minable ^^
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Événements clavier

                              × 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