Partage
  • Partager sur Facebook
  • Partager sur Twitter

Répeter la détection de touche

    23 janvier 2020 à 10:19:15

    Bonjour,

    J'ai réussi a avoir le script pour détecter ma touche, mais quand j'appuie sur la touche ça ne change pas, pouvez vous m'aider ?

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    
    import javax.swing.JPanel;
    
    public class Panneau extends JPanel {
    
      private int posX = -50;
      private int posY = -50;
      private int pr1X = 20;
      private int pr1Y = 50;
    
      public void paintComponent(Graphics g) {
    
        g.setColor(Color.white);
    
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.black);
    
        g.fillOval(posX, posY, 20, 20);
        g.fillRect(pr1X, pr1Y, 40, 400);
      }
        public void keyTyped(KeyEvent evt) {
    	  if (evt.getKeyChar() == 'z')
    	 	pr1Y = pr1Y+10;
    	  else if (evt.getKeyChar() == 's')
    	 	pr1Y = pr1Y-10;}
    
      public int getPosX() {
        return posX;
      }
    
      public void setPosX(int posX) {
        this.posX = posX;
      }
    
      public int getPosY() {
        return posY;
      }
    
      public void setPosY(int posY) {
        this.posY = posY;
        System.out.println(pr1Y);
      }
    }



    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2020 à 10:27:08

      Salut, je suppose que par 'ca ne change pas', tu veux dire que ton rectangle ne bouge pas ?

      Simplement parce que tu le "peins" une fois au début. Et tu as beau changer la valeur de tes variables, la peinture reste la même. Il faut repeindre par dessus.

      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2020 à 10:29:47

        Ca oui je comprends, y a d'autres programmes a côté, mais la valeur, ne bouge pas, elle reste a 50
        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2020 à 11:15:38

          C'est parce que tu n'as pas déclaré ton KeyListener auprès d'un composant graphique, donc ta méthode keyPressed n'est jamais exécutée.

          Lorsqu'une touche est appuyée, Java va lancer tous les KeyListeners associés au composant en cours.

          Ici, le composant graphique qui t'intéresse est ton Panneau.
          Le KeyListener est aussi le Panneau (il gère à la fois l'affichage et la pression des touches).
          Donc tu vas dire au Panneau de se notifier lui-même lorsqu'une touche est pressée :

          this.addKeyListener(this);
          Cette instruction devra s'exécuter tout au début, et une seule fois. Il faut donc la mettre dans un constructeur de ta classe.

          Ensuite, tu auras une petite erreur de compilation à résoudre, mais tu devrais pouvoir trouver la solution tout seul.

          • Partager sur Facebook
          • Partager sur Twitter
            23 janvier 2020 à 11:24:36

            Tout au début du style avant les variables que je mets au au début de paintCompo?
            • Partager sur Facebook
            • Partager sur Twitter
              23 janvier 2020 à 14:11:39

              D'accord, j'ai réussi à le caser (après une petite pause) mais ça ne change toujours pas, je fais quoi ?

              • Partager sur Facebook
              • Partager sur Twitter
                23 janvier 2020 à 14:40:50

                Montre ton code (la classe Panneau et la méthode main, au moins).

                EDIT :

                Ah non, commence par tenir compte de ce que dit Tiffado :

                Pour que la fenêtre se redessine, il faut le demander explicitement après avoir fait les modifications.
                Voilà comment on fait :

                repaint();

                -
                Edité par Zachee54 23 janvier 2020 à 14:52:06

                • Partager sur Facebook
                • Partager sur Twitter
                  23 janvier 2020 à 15:10:58

                  Vu que je suis pas doué, il faudrait peut-être que j'envoie les deux programmes

                  Classe Fenetre :

                  import javax.swing.JFrame;
                  
                  public class Fenetre extends JFrame {
                  
                    public static void main(String[] args) {
                      new Fenetre();
                    }
                  
                    private Panneau pan = new Panneau();
                  
                    public Fenetre() {
                      this.setTitle("Animation");  
                      this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
                      this.setUndecorated(false);
                      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      this.setLocationRelativeTo(null);
                      this.setContentPane(pan);
                      this.setVisible(true);
                  
                      go();
                    }
                  
                    private void go() {
                  
                      int x = pan.getPosX(), y = pan.getPosY();
                  
                      boolean backX = false;
                  
                      boolean backY = false;
                  
                  
                      while (true) {
                  
                        if (x < 1)
                          backX = false;
                  
                        if (x > pan.getWidth() - 10)
                          backX = true;
                  
                        if (y < 1)
                          backY = false;
                        if (y > pan.getHeight() - 10)
                          backY = true;
                  
                  
                        if (!backX)
                          pan.setPosX(++x);
                  
                        else
                          pan.setPosX(--x);
                  
                        if (!backY)
                          pan.setPosY(++y);
                        else
                          pan.setPosY(--y);
                        
                  
                  
                        pan.repaint();
                  
                        try {
                          Thread.sleep(3);
                        } catch (InterruptedException e) {
                          e.printStackTrace();
                        }
                      }
                    }
                  }



                  Classe Panneau :

                  import java.awt.Color;
                  import java.awt.Graphics;
                  import java.awt.event.KeyEvent;
                  import java.awt.event.KeyListener;
                  import javax.swing.JPanel;
                  
                  public class Panneau extends JPanel implements KeyListener {{
                  	this.addKeyListener(this);}
                  
                    private int posX = -50;
                    private int posY = -50;
                    private int pr1X = 20;
                    private int pr1Y = 50;
                  
                    public void paintComponent(Graphics g) {
                  	  
                  
                      g.setColor(Color.white);
                  
                      g.fillRect(0, 0, getWidth(), getHeight());
                      g.setColor(Color.black);
                  
                      g.fillOval(posX, posY, 20, 20);
                      g.fillRect(pr1X, pr1Y, 40, 400);
                    }
                      public void keyPressed(KeyEvent evt) {
                  	  if (evt.getKeyChar() == 'z')
                  	 	pr1Y = pr1Y+10;
                  	  else if (evt.getKeyChar() == 's')
                  	 	pr1Y = pr1Y-10;}
                  
                    public int getPosX() {
                      return posX;
                    }
                  
                    public void setPosX(int posX) {
                      this.posX = posX;
                    }
                  
                    public int getPosY() {
                      return posY;
                    }
                  
                    public void setPosY(int posY) {
                      this.posY = posY;
                      System.out.println(pr1Y);
                    }
                  @Override
                  public void keyReleased(KeyEvent arg0) {
                  	// TODO Auto-generated method stub
                  	
                  }
                  @Override
                  public void keyTyped(KeyEvent arg0) {
                  	// TODO Auto-generated method stub
                  	
                  }
                  }



                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 janvier 2020 à 16:11:30

                    Regarde mon edit du post précédent.

                    Il n'y a pas de code dans ta méthode KeyTyped...

                    ...et je ne vois pas non plus la ligne addKeyListener ?

                    NB : je ne serai plus disponible pendant quelques jours

                    -
                    Edité par Zachee54 23 janvier 2020 à 16:15:58

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 janvier 2020 à 16:12:34

                      La ligne y est bien, dans le second programme, et je cherche a activer keyPressed, pas keyTyped
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 janvier 2020 à 16:17:20

                        Ah pardon!

                        Je ne l'ai pas vue parce que tu ne l'as pas mise dans un constructeur.
                        Je soupçonne que tu n'as pas lu le lien que je t'ai donné sur le sujet ? :-°

                        ...et il faut que tu tiennes compte de ce qu'a dit Tiffado en utilisant repaint()

                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 janvier 2020 à 16:23:02

                          Le repaint y est aussi .-.

                          Mais j'ai pas dû le faire correctement, mais les constructeurs il me les mettaient en rouge alors faut que je vois si c'est pas mon Eclipse qui déconne

                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 janvier 2020 à 9:13:34

                            Plasardoche a écrit:

                            Mais j'ai pas dû le faire correctement, mais les constructeurs il me les mettaient en rouge alors faut que je vois si c'est pas mon Eclipse qui déconne

                            Ne dis pas des choses stupides avant d'être allé au bout de nos explications :lol:
                            C'est plutôt parce que tu as mal codé le constructeur ; dans ce cas il vaut mieux nous montrer ce que tu as codé et on t'expliquera pourquoi Eclipse le met en rouge.

                            Plasardoche a écrit:

                            Le repaint y est aussi .-.

                             Oui, le repaint y est aussi mais lui non plus n'est pas au bon endroit.

                            Tu as posé la question de ce qu'il se passe quand on appuie sur une touche. On t'a expliqué que logiquement, il fallait repeindre le Panneau après les modifications qui effectuées par keyTyped().

                            Tiffado a écrit:

                            Simplement parce que tu le "peins" une fois au début. Et tu as beau changer la valeur de tes variables, la peinture reste la même. Il faut repeindre par dessus.

                            Zachee54 a écrit:

                            Pour que la fenêtre se redessine, il faut le demander explicitement après avoir fait les modifications.

                            Yep ?
                            Ca veut dire que le repaint() doit se trouver à la toute fin de la méthode keyTyped()... quand tu l'auras écrite. :magicien:

                            Alors c'est vrai, tu as écrit repaint() dans la boucle qui s'occupe de l'animation. (Je doute que ça marche, en passant,) mais ta question de départ ne portait pas sur cette partie.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Répeter la détection de touche

                            × 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