Forum Programmation.java J'arrive pas à récupérer un évenement clavier dans une fenêtre

Posté par  (site web personnel) .
Étiquettes : aucune
0
28
mai
2005
Je suis en train d'écrire un petit jeu, et j'ai besoin d'une bête classe qui me crée une fenêtre toute simple dans laquelle je vais pouvoir afficher des rectangles et qui me récupère les évenements clavier, à moins que ce soit carrément la classe Main qui les récupère (ça m'arrangerait d'ailleurs).

Ces évènements sont très simple, je veux simplement récupérer le code caractère de la touche frappée, cela suffit à mes besoins.

J'ai pas mal cherché et j'ai utilisé un tutoriel expliquant comment gérer des rectangles vectoriellement (je les déplace librement). Ca marche bien.

Le problème est que je n'arrive pas à récupérer les évenements clavier de ma fenêtre

J'ai le code suivant (de main.java)

package testuih2;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import testuih2.GUIHelper;
import testuih2.IDrawable;
import testuih2.JCanvas;
import testuih2.RectangleDrawable;


public class Main implements KeyListener{

static JCanvas jc = new JCanvas();
IDrawable rect2;

public Main () { }

public static void main (String[] args) {
jc.setBackground(Color.WHITE);
jc.setPreferredSize(new Dimension(400,200));
Dimension dim =new Dimension(40,60);
IDrawable rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);

jc.addDrawable(rect);

GUIHelper.showOnFrame(jc,"test JCanvas");
}

public void keyTyped(KeyEvent e) {

System.out.print ("Event clavier trouvé");
System.out.print (e.getKeyChar ());
Dimension dim2 =new Dimension(40,60);
rect2 = new RectangleDrawable(Color.RED,new Point(25,30),dim2);
}

public void keyPressed(KeyEvent e) {
System.out.print ("KEY PRESSED: ");
System.out.print (e.getKeyChar ());
}


public void keyReleased(KeyEvent e) {
System.out.print ("KEY RELEASED: ");
System.out.print (e.getKeyChar ());
}
}


J'ai pensé que implémenter KeyListener directement dans main, me permettrait d'attraper ces foutus évenements clavier.

J'ai essayé la même chose dans Canvas, ça ne donne rien.

J'ai aussi essayé de créer une classe EcouteurClavier l'implémentant, avec les
mêmes méthodes KeyPressed, etc...

Franchement je suis bloqué, Pourriez vous SVP m'expliquer la logique, parce que je comprend pas trop là...

Merci !
  • # Manque le addKeyListener ?

    Posté par  (site web personnel) . Évalué à 1.

    Il faut spécifier quel objet traite les évènements clavier pour ton widget.

    Donc si j'ai bien suivi, il faut ajouter dans ton main :

    jc.addKeyListener(this);
    • [^] # Re: Manque le addKeyListener ?

      Posté par  (site web personnel) . Évalué à 1.

      J'ai une erreur :

      /home/montaigne/Developpement/Java/TestUIH2/src/testuih2/Main.java:47: non-static variable this cannot be referenced from a static context
      jc.addKeyListener(this);
      1 error

      Là je vois pas, faut que je fasse une classe à part ?

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: Manque le addKeyListener ?

        Posté par  (site web personnel) . Évalué à 2.

        Désolé je me suis mal exprimé.

        Essaye de mettre la ligne dans la méthode Main(), c'est-à-dire dans le constructeur. Le mot-clé "this" n'a aucun sens dans une méthode déclarée statique !
        • [^] # Re: Manque le addKeyListener ?

          Posté par  (site web personnel) . Évalué à 2.

          Bon je m'auto-répond... J'aurais du lire le code source en entier, en fait tu fais tout dans la méthode main(), à aucun moment tu ne crée d'objet Main (quelle idée de l'appeler comme ça aussi ! ;-)

          Donc il faut d'abord créer un objet Main puis ratacher les évènements clavier à celui-ci.
          Ce devrait donner quelque chose comme ça :

          public static void main (String[] args) {
          jc.setBackground(Color.WHITE);
          jc.setPreferredSize(new Dimension(400,200));
          Dimension dim =new Dimension(40,60);
          IDrawable rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);

          jc.addDrawable(rect);
          ///
          Main m = new Main();
          jc.addKeyListener(m);
          ///
          GUIHelper.showOnFrame(jc,"test JCanvas");
          }
          • [^] # Re: Manque le addKeyListener ?

            Posté par  (site web personnel) . Évalué à 1.

            Marche pas :(

            Je suis allé voir la doc sur le addKeyListener, et je me suis rendu compte qu'il prenait un KeyListener l en argument.

            J'ai donc repris mon objet ecouteurclavier


            public class EcouteurClavier implements KeyListener{

            /** Creates a new instance of EcouteurClavier */
            public EcouteurClavier () {
            }

            public void keyTyped(KeyEvent e) {

            System.out.print ("Event clavier trouvé");
            System.out.print (e.getKeyChar ());

            }

            public void keyPressed(KeyEvent e) {
            System.out.print ("KEY PRESSED: ");
            System.out.print (e.getKeyChar ());
            }

            /** Handle the key released event from the text field. */
            public void keyReleased(KeyEvent e) {
            System.out.print ("KEY RELEASED: ");
            System.out.print (e.getKeyChar ());
            }
            }


            Je l'ai ensuite déclaré dans main

            EcouteurClavier clav = new EcouteurClavier();
            et mis jc.addKeyListener(clav);

            Bam, même erreur :
            Compiling 1 source file to
            /home/montaigne/Developpement/Java/TestUIH2/src/testuih2/Main.java:52: non-static variable clav cannot be referenced from a static context
            jc.addKeyListener(clav);
            1 error

            je remet donc static devant
            static EcouteurClavier clav = new EcouteurClavier();

            Ca compile mais ça donne rien.

            Et moi qui doit présenter àça à un oral dans deux jours...

            Merci pour tout quand même :) !

            « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

          • [^] # Re: Manque le addKeyListener ?

            Posté par  (site web personnel) . Évalué à 1.

            Je viens aussi d'essayer de modifier

            public EcouteurClavier () {

            }

            en

            public EcouteurClavier (JCanvas j) {
            j.addKeyListener (this);
            }

            Ca compile mais ça donne rien.

            « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

  • # modifie completement ton code

    Posté par  (site web personnel) . Évalué à 3.

    Salut, Bon en fait t'a codé ça n'ayons pas peur des mots un peu à l'arrache, le truc de tout foutre en static n'est vraiment pas terrible et tu voit ça fout plein de merde quand on s'en sert pas correctement, je te conseille donc le code suivant,

    tout d'abord utilise ta classe Main (c'est vrai que c'est vraiment mal choisi comme nom) donc je dit bien la classe et pas la méthode, donc le code de la classe :
    package testuih2;


    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;
    import testuih2.GUIHelper;
    import testuih2.IDrawable;
    import testuih2.JCanvas;
    import testuih2.RectangleDrawable;

    public class Main implements KeyListener{

    private staticJCanvas jc = new JCanvas();
    private IDrawable rect2;//Pense bien à définir la portée des objets que tu utilise (public/private/protected);

    public Main () {

    jc = new JCanvas();
    jc.setBackground(Color.WHITE);
    jc.setPreferredSize(new Dimension(400,200));
    Dimension dim =new Dimension(40,60);
    IDrawable rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);
    jc.addDrawable(rect);

    this.addKeyListener(this);//à ajouter

    GUIHelper.showOnFrame(jc,"test JCanvas");
    }



    public static void main (String[] args) {

    Main main = new Main(); //à ajouter

    }



    public void keyTyped(KeyEvent e) {



    System.out.print ("Event clavier trouvé");

    System.out.print (e.getKeyChar ());

    Dimension dim2 =new Dimension(40,60);

    rect2 = new RectangleDrawable(Color.RED,new Point(25,30),dim2);

    }



    public void keyPressed(KeyEvent e) {

    System.out.print ("KEY PRESSED: ");

    System.out.print (e.getKeyChar ());

    }





    public void keyReleased(KeyEvent e) {

    System.out.print ("KEY RELEASED: ");

    System.out.print (e.getKeyChar ());

    }

    }


    avec ça ça devrait marcher normalement
    • [^] # Re: modifie completement ton code

      Posté par  (site web personnel) . Évalué à 1.

      C'est codé à l'arache, c'est la première fois que je fais du java...

      Merci :)

      Petit problème, il me dit que this ne connait pas addKeyListener( ds la doc, il est dit que AddKeyListener est une méthode de JComponent), donc j'ai fait descendre Main de JPanel

      Ce qui me donne le code suivant :

      package testuih2;

      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.Point;
      import java.awt.event.KeyListener;
      import java.awt.event.KeyEvent;
      import javax.swing.JPanel;

      import testuih2.GUIHelper;
      import testuih2.IDrawable;
      import testuih2.JCanvas;
      import testuih2.RectangleDrawable;

      import testuih2.IMovableDrawable;
      import testuih2.FormDrawable;
      /**
      *
      * @author montaigne
      */
      public class Main extends JPanel implements KeyListener {
      //private EcouteurClavier machin = new EcouteurClavier();
      /** Creates a new instance of Main */

      private JCanvas jc;

      private FormDrawable rect,rect2;
      //EcouteurClavier clav = new EcouteurClavier(jc);

      public Main () {
      //String[] truc = new String[2];
      //m.main(truc);
      jc = new JCanvas();
      System.out.print ("Test Sortie out");

      jc.setBackground(Color.WHITE);
      jc.setPreferredSize(new Dimension(400,200));
      Dimension dim =new Dimension(40,60);
      rect = new RectangleDrawable(Color.RED,new Point(10,10),dim);

      //jc.addKeyListener(clav);
      jc.addDrawable(rect);

      this.addKeyListener(this);
      GUIHelper.showOnFrame(jc,"test JCanvas");

      for (int i = 1 ; i<35 ; i += 5)
      {
      int b;
      rect.setPosition (new Point(rect.getPosition ().x+i,rect.getPosition ().y+i));

      jc.repaint ();
      }

      }

      /**
      * @param args the command line arguments
      */
      public static void main (String[] args) {
      // TODO code application logic here


      Main main = new Main();



      }//main

      public void keyTyped(KeyEvent e) {

      System.out.print ("Event clavier trouvé");
      System.out.print (e.getKeyChar ());

      }

      public void keyPressed(KeyEvent e) {
      System.out.print ("KEY PRESSED: ");
      System.out.print (e.getKeyChar ());
      }

      /** Handle the key released event from the text field. */
      public void keyReleased(KeyEvent e) {
      System.out.print ("KEY RELEASED: ");
      System.out.print (e.getKeyChar ());
      }
      }


      Qui ne marche pas :(

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: modifie completement ton code

        Posté par  (site web personnel) . Évalué à 1.

        Souvent pour les Listener le plus simple est de faire des trucs du genre :
        jc.addKeyListener(new KeyAdapter(){
                 public void keyPressed(KeyEvent e) {
                       System.out.print ("Event clavier trouvé");
                       System.out.print (e.getKeyChar ());
                 }
                 ...
        });
        
        Le principe étant :
        • J'ajouter à mon composant l'écouter correspondant aux évenements que je veux écouter (addKeyListener, addMouseListener, addWindowListener...)
        • Je définis les methodes (ici dans une classe anonyme (new KeyAdapter(){...}) correspondants aux actions que je souhaite réaliser pour chaque évenement

        Souvent on préfere utiliser les nAdapter aux nListener (KeyAdapter, MouseAdapter...) parcequ'il sont une implémentation des premiers (class KeyAdapter implements KeyListener) et qu'ils ne nécessitent donc pas de réecrire l'ensemble des methodes mais juste celles dont on a besoin.

        Une fois que tu auras piger le principe, c'est valable pour tout les évenements.

        Autre chose pour enfoncer le clou. Java est un language Objet. D'une maniere generale (on deviens plus subtil par la suite) l'attirbut static ne dois être utilisé que pour le main. Cela veux dire que tout le reste doit être objet (C'est évidament faux, mais ça aide à piger)

        Ne pas écrire :
        class HelloWord{
           //args[0] est le nom de la personne
           public static void main(String[] args){
              try{
                 System.out.println("Salut " +args[0]);
              }
              catch(ArrayIndexOutOfBoundsException e){
                 System.out.println("Salut Anonyme");
            }
        }
        
        Mais plustôt:
        class HelloWord{
           private String nom
           public HelloWord(String nom){
                 this.nom = nom;
                 saluer();
           void saluer(){
              //this est optionnel
              System.out.println("Salut " +this.nom);
           }
           public static void main(String[] args){
               try{
                 new HelloWord(args[0]);
              }
              catch(ArrayIndexOutOfBoundsException e){
                 new HelloWord("Anonyme");
            }
        }
        

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.