Partage
  • Partager sur Facebook
  • Partager sur Twitter

JPanel et PaintComponent

Sujet résolu
    7 février 2016 à 16:49:32

    Bonjour à tous !
    Dans le cadre de la réalisation d'un jeu Pong en Java, j'ai écrit le code suivant qui devrait afficher les objets que je souhaite et permettre d'utiliser certains touches du clavier pour bouger les rectangles. Il se trouve cependant que j'ai droit à une fenêtre magnifiquement blanche comme si le paintComponent était ignoré ... J'utilise NetBeans 8.1 qui ne m'indique aucune erreur dans le code (d'ailleurs le programme se lance bien sans aucune erreur et le JFrame s'ouvre à la taille souhaitée). Quelqu'un aurait-il des idées ?
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    public class PongEvolution extends JPanel implements ActionListener, KeyListener {
    
        Timer tm = new Timer(5, this);
        
        // Déclaration des largeurs
        int x = getWidth();
        int x2 = getWidth() / 2;
        int x8 = getWidth() / 8;
        int x15 = getWidth() / 15;
        int x25 = getWidth() / 25;
            
        // Déclaration des hauteurs
        int y2 = getHeight() / 2;
        int y3 = getHeight() / 3;
        int y4 = getHeight() / 4;
        int y8 = getHeight() / 8;
        int y15 = getHeight() / 15;
        
        // Déclaration position et vitesse initiale
        int rectangle1 = (y2 + y3) / 2, rectangle2 = (y2 + y3) / 2, velY1 = 0, velY2 = 0;
        
        // Déclaration dimensions rectangle
        int rectangleWidth = x25;
        int rectangleHeight = y4;
        
        public PongEvolution() {
            tm.start();
            addKeyListener(this);
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
        }
        
        @Override
        public void paintComponent(Graphics g) {
           
            super.paintComponent(g);
            
            // Affichage du texte
            String text1 = "Pong Evolution";
            Font currentFont = g.getFont();
            Font newFont = currentFont.deriveFont(currentFont.getSize() * 2F);
            g.setFont(newFont);
            g.drawString(text1, x2 - ((g.getFontMetrics().stringWidth(text1)) / 2), y8);
            
            // Affichage boule
            int pixelsBall = (x15 + y15) / 2;
            g.fillOval((x2 - (pixelsBall / 2)), (y2 + y3) / 2 + pixelsBall, pixelsBall, pixelsBall);
            
            // Affichage rectangles
            g.fillRect(x8, rectangle1, rectangleWidth, rectangleHeight);
            g.fillRect((x - x8 - rectangleWidth), rectangle2, rectangleWidth, rectangleHeight);
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            
            if (rectangle1 < y4 || rectangle1 > 3 * y4 || rectangle2 < y4 || rectangle2 > 3 * y4) { }
            else {
                rectangle1 += velY1;
                rectangle2 += velY2;
                repaint();
            }
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
            int c = e.getKeyCode();
            
            if (c == KeyEvent.VK_UP) {
                velY2 = -1;
            }
            if (c == KeyEvent.VK_DOWN) {
                velY2 = 1;
            }
            if (c == KeyEvent.VK_Z) {
                velY1 = -1;
            }
            if (c == KeyEvent.VK_S) {
                velY1 = 1;
            } 
        }
    
        @Override
        public void keyTyped(KeyEvent e) { }
        
        @Override
        public void keyReleased(KeyEvent e) { 
            velY1 = 0;
            velY2 = 0;
        }   
        
        public static void main(String[] args) {
            
            JFrame window = new JFrame("Pong Evolution");
            window.setSize(800, 600);
            window.setLocationRelativeTo(null);
            window.add(new PongEvolution());
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setVisible(true);
        }  
    }
    Merci d'avance !

    -
    Edité par bigbosspc 7 février 2016 à 16:50:26

    • Partager sur Facebook
    • Partager sur Twitter
    J'excelle dans l'excellence la plus excellente !
      7 février 2016 à 17:08:55

      Bonjour,

      Essaie de remplacer :

      window.add(new PongEvolution());

      par:

      window.setContentPane(new PongEvolution());



      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2016 à 17:27:46

        Merci pour ta réponse rapide Nox mais malheureusement ça ne change rien (pourtant je suis sur que c'est un petit truc comme ça qui n'est pas bien defini) ...

        -
        Edité par bigbosspc 7 février 2016 à 17:29:06

        • Partager sur Facebook
        • Partager sur Twitter
        J'excelle dans l'excellence la plus excellente !
          7 février 2016 à 17:48:37

          Tu as appellé les méthodes getWidth() et getHeight() lors de l'initialisation de tes variables.

          Or ta fenêtre n'est pas encore initialisé. Il faut donc que tu les mettent à jours dans une méthode qui sera appellé après que tes composants aient été dessinés. Par exemple tu peut appeller une méthode:


          Init_var();

          à la fin de la méthode paintComponent (ligne 60-61)

          qui sera déclarée comme ceci:

          public void Init_var()
               {
              	// Réinitialisation des largeurs
                   x = getWidth();
                   x2 = getWidth() / 2;
                   x8 =getWidth() / 8;
                   x15 = getWidth() / 15;
                   x25 = getWidth() / 25;
                        
                   // Réinitialisation des hauteurs
                   y2 = getHeight() / 2;
                   y3 = getHeight() / 3;
                   y4 = getHeight() / 4;
                   y8 = getHeight() / 8;
                   y15 = getHeight() / 15;
                   // Réinitialisation position et vitesse initiale
                   rectangle1 = (y2 + y3) / 2;
                   rectangle2 = (y2 + y3) / 2;
                   velY1 = 0; velY2 = 0;
                    
                   // Réinitialisation dimensions rectangle
                   rectangleWidth = x25;
                   rectangleHeight = y4;
               }

          En espérant avoir été compréhensible. ^^ .

          -
          Edité par -Nox 7 février 2016 à 17:57:02

          • Partager sur Facebook
          • Partager sur Twitter
            7 février 2016 à 18:12:04

            Excellente idée (comment je n'ai pas pu y penser :o) ! Merci Nox (tu as été parfaitement compréhensible) et tout s'affiche comme il faut à présent.

            Mais tout aurait été trop beau s'il n'y avait pas un bémol là aussi ... Maintenant les rectangles ne veulent pas bouger (en fait je vois que quand j'appuie sur les touches correspondantes, le rectangle bouge légèrement mais c'est comme s'il était empêché ou que les positions étaient réinitialisées juste derrière). Est-ce que le fait d'appeler cette méthode Init_var() à chaque fois dans le PaintComponent ne bloque-t-elle justement pas le mouvement ?

            Je remet le code avec les mises à jour :

            import java.awt.*;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import java.awt.event.KeyEvent;
            import java.awt.event.KeyListener;
            import javax.swing.JFrame;
            import javax.swing.JPanel;
            import javax.swing.Timer;
            
            public class PongEvolution extends JPanel implements ActionListener, KeyListener {
            
                Timer tm = new Timer(5, this);
                
                public void Init_var()
                {
                   // Réinitialisation des largeurs
                    x = getWidth();
                    x2 = getWidth() / 2;
                    x8 =getWidth() / 8;
                    x15 = getWidth() / 15;
                    x25 = getWidth() / 25;
                          
                    // Réinitialisation des hauteurs
                    y2 = getHeight() / 2;
                    y3 = getHeight() / 3;
                    y4 = getHeight() / 4;
                    y8 = getHeight() / 8;
                    y15 = getHeight() / 15;
                    
                    // Réinitialisation position et vitesse initiale
                    rectangle1 = (y2 + y3) / 2;
                    rectangle2 = (y2 + y3) / 2;
                    velY1 = 0; velY2 = 0;  
                    
                    // Réinitialisation dimensions rectangle
                    rectangleWidth = x25;
                    rectangleHeight = y4;
                 }
            
            // Déclaration des largeurs
                int x = getWidth();
                int x2 = getWidth() / 2;
                int x8 = getWidth() / 8;
                int x15 = getWidth() / 15;
                int x25 = getWidth() / 25;
                    
                // Déclaration des hauteurs
                int y2 = getHeight() / 2;
                int y3 = getHeight() / 3;
                int y4 = getHeight() / 4;
                int y8 = getHeight() / 8;
                int y15 = getHeight() / 15;
                
                // Déclaration position et vitesse initiale
                int rectangle1 = (y2 + y3) / 2, rectangle2 = (y2 + y3) / 2, velY1 = 0, velY2 = 0;
                
                // Déclaration dimensions rectangle
                int rectangleWidth = x25;
                int rectangleHeight = y4;
                
                public PongEvolution() {
                    tm.start();
                    addKeyListener(this);
                    setFocusable(true);
                    setFocusTraversalKeysEnabled(false);
                }
                
                @Override
                public void paintComponent(Graphics g) {
                   
                    super.paintComponent(g);
                    
                    // Affichage du texte
                    String text1 = "Pong Evolution";
                    Font currentFont = g.getFont();
                    Font newFont = currentFont.deriveFont(currentFont.getSize() * 2F);
                    g.setFont(newFont);
                    g.drawString(text1, x2 - ((g.getFontMetrics().stringWidth(text1)) / 2), y8);
                    
                    // Affichage boule
                    int pixelsBall = (x15 + y15) / 2;
                    g.fillOval((x2 - (pixelsBall / 2)), (y2 + y3) / 2 + pixelsBall, pixelsBall, pixelsBall);
                    
                    // Affichage rectangles
                    g.fillRect(x8, rectangle1, rectangleWidth, rectangleHeight);
                    g.fillRect((x - x8 - rectangleWidth), rectangle2, rectangleWidth, rectangleHeight);
                    Init_var();
                }
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    
                    if (rectangle1 < y4 || rectangle1 > 3 * y4 || rectangle2 < y4 || rectangle2 > 3 * y4) { }
                    else {
                        rectangle1 += velY1;
                        rectangle2 += velY2;
                        repaint();
                    }
                }
            
                @Override
                public void keyPressed(KeyEvent e) {
                    int c = e.getKeyCode();
                    
                    if (c == KeyEvent.VK_UP) {
                        velY2 = -1;
                    }
                    if (c == KeyEvent.VK_DOWN) {
                        velY2 = 1;
                    }
                    if (c == KeyEvent.VK_Z) {
                        velY1 = -1;
                    }
                    if (c == KeyEvent.VK_S) {
                        velY1 = 1;
                    } 
                }
            
                @Override
                public void keyTyped(KeyEvent e) { }
                
                @Override
                public void keyReleased(KeyEvent e) { 
                    velY1 = 0;
                    velY2 = 0;
                }   
                
                public static void main(String[] args) {
                    
                    JFrame window = new JFrame("Pong Evolution");
                    window.setSize(800, 600);
                    window.setLocationRelativeTo(null);
                    window.setContentPane(new PongEvolution());
                    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    window.setVisible(true);
                }  
            }



            • Partager sur Facebook
            • Partager sur Twitter
            J'excelle dans l'excellence la plus excellente !
              7 février 2016 à 18:32:17

              Tu peut rajouter un boolean que tu initialise sur true avec tes variables (ligne 60).

              boolean init = true;

              Et tu le mets sur false après l'appel à ta méthode (à la place de la ligne 87):

              if(init == true)
              {
                 Init_var();
                 init = false;
              }

              Il doit y avoir plus propre mais c'est fonctionnel :) .

              • Partager sur Facebook
              • Partager sur Twitter
                7 février 2016 à 18:53:53

                Parfait et simple ! Encore merci Nox
                • Partager sur Facebook
                • Partager sur Twitter
                J'excelle dans l'excellence la plus excellente !
                  7 février 2016 à 19:07:49

                  Bonjour,

                  La méthode qui sert à initialiser les objets, c'est le constructeur. Donc la logique, ce serait plutôt d'appeler initVar (merci de respecter les conventions de nommage) à partir du constructeur. Du coup, plus besoin de booléen init.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  JPanel et PaintComponent

                  × 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