Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JAVA SWING] paintComponent

methode Paint Component jamais appelé

Sujet résolu
    26 juin 2015 à 11:03:41

    Salut à tous,

    Voila mon probléme,je code un FishEye menu,et pour ce faire chaque "icon" est un jpanel que j'ajoute les un apres les autres.

    Bref,tout ceci marche à merveille,sauf que je souhaiterait que mon dernier icon soit un peu différent.J'ai donc créée une nouvelle class qui extend JPanel.dans cette class j'ai une méthode paintComponent qui ne passe jamais!!why?

    voici le code de mes 2 méthodes (celle qui appel paintComponent et l'autre)

        public void redraw(int size) {
         //   System.out.println("redraw arrow");
            this.setPreferredSize(new Dimension(size,size)); //default cube
            this.revalidate();
            this.repaint();
            this.paint(getGraphics());
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            System.out.println("dans paintComponent");
            super.paintComponent(g);
            System.err.println("last");
            this.setBackground(new Color(0, 0, 0, 0));
            this.setBorder(null);
            int xPoints[]={0,10,10,50,10,40,5};
            int yPoints[]={10,10,40,5,0,10,0};
            g.drawPolygon(xPoints, yPoints,7);
        }

     le truc c'est que ma méthode paintComponent n'est jamais appelé!pourtant j'ai tout  essayé paint,repaint,paintComponent,paintball et pentakill ,mais rien ne marche...


    ps:si j'appel ma méthode paintComponent via :

    this.paintComponent(getGraphics());

     j'ai un beau nullPointerException... lors de l'appel de super.paintComthis(g);



    -
    Edité par taloche65 26 juin 2015 à 11:09:28

    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2015 à 7:05:47

      Salut,

      à mon avis ton problème ne se trouve pas dans ces deux méthodes.

      Si tu veux bien afficher la classe qui contient ces deux méthodes 

      notamment son/ses constructeur(s).

      • Partager sur Facebook
      • Partager sur Twitter
        27 juin 2015 à 9:09:56

        Bonjour #taloche65

        Comme l'a dit #yabolankkoande tu n'aurais pas oublié d’appeler le constructeur de base ?

        class MyCustomPanel extends JPanel{ 
         public MyCustomPanel() { 
              super();  .... 
         } 
        } 

        -
        Edité par alandrieu 27 juin 2015 à 9:11:03

        • Partager sur Facebook
        • Partager sur Twitter
        Knowledge speaks, but wisdom listens. J.Hendrix
          27 juin 2015 à 16:43:59

          Bonjour,

          On n'appelle jamais la méthode paintComponent directement, ni paint d'ailleurs. On utilise uniquement repaint. Donc, tu peux virer ta ligne 6.

          Et sinon, paintComponent est une méthode public, pas protected.

          • Partager sur Facebook
          • Partager sur Twitter
            28 juin 2015 à 12:18:58

            brubru777 a écrit:

            • Et sinon, paintComponent est une méthode public, pas protected.


            Faux paintComponent (Graphic g) est bien protected (justement pour ne pas avoir la possibilité de l'appeler depuis l'extérieur) voir la class JComponent.

            protected void paintComponent(Graphics g)

            Pour compléter la réponse de #brubru777 tu peux utiliser les méthodes :

            La méthode update(...) qui appelle paint() :

            public void update(Graphics g);

            Le méthode repaint() qui appelle paint() et update() : 

            public void repaint();

            Pour plus d'information je te conseil de lire la JavaDoc sur JComponent et Component.

            -
            Edité par alandrieu 28 juin 2015 à 12:19:59

            • Partager sur Facebook
            • Partager sur Twitter
            Knowledge speaks, but wisdom listens. J.Hendrix
              28 juin 2015 à 13:38:43

              Effectivement, j'ai mal regardé. La méthode est bien protected.
              • Partager sur Facebook
              • Partager sur Twitter
                28 juin 2015 à 14:06:46

                @Girakith_ pas besoin de faire super() de toute façon le constructeur de base est toujours appelé implicitement, donc je pense que le problème vient d'ailleurs. Exemple pour voir l'ordre d'appel:

                public static void main(String[] args) {
                		new A();
                		new B();
                		new B(5);
                	}
                	
                	static class A{
                		public A(){
                			System.out.println("passage par A()");
                		}
                	}
                	static class B extends A{
                		public B(){
                			System.out.println("passage par B()");
                		}
                		public B(int i){
                			System.out.println("passage par B(int)");
                		}
                	}

                On obtient:

                passage par A()

                passage par A()

                passage par B()

                passage par A()

                passage par B(int)

                • Partager sur Facebook
                • Partager sur Twitter

                Ctrl+space

                  29 juin 2015 à 13:15:04

                  Merci de vos réponse.

                  l'ajout de super(); a mon constructeur ne change effectivement rien.

                  Normalement je n'utilise pas directement l'appel à paintComponent ,mais je passe bien par repaint() comme vous me le conseiller.

                  le problème est justement que si je n'appel pas explicitement paintComponent,mais que j'utilise uniquemenent repaint(),

                  la méthode paintComponent dans mon  cas n'est jamais appelé ^^.

                  Je ne comprend absolument pas pourquoi

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 juin 2015 à 15:08:30

                    Il faudrait que tu nous montre le reste du code (ajout de ton panel dans l'UI, appel de repaint/redraw) sinon rien dans la console? Essaye aussi de ne pas appeler setPreferedSize c'est peut être ça qui fait bugger.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Ctrl+space

                      29 juin 2015 à 15:43:42

                      Voici le reste du code de ma classe mais je ne suis pas sur que cela va vous aider,il s'agit d'un code genére par l'IDE netbeans  (quand je lui ai dit de me créée une nouvelle class qui extends JPanel).

                          private void initComponents() {
                      
                              setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
                              setMaximumSize(new java.awt.Dimension(20, 20));
                              setPreferredSize(new java.awt.Dimension(40, 40));
                      
                              javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
                              this.setLayout(layout);
                              layout.setHorizontalGroup(
                                  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                  .addGap(0, 60, Short.MAX_VALUE)
                              );
                              layout.setVerticalGroup(
                                  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                  .addGap(0, 55, Short.MAX_VALUE)
                              );



                      l'idée de mon programme est que j'ai une arrayList de Jpanel ,et je souhaiterait ajouté à la fin de cette arrayList une instanciation de ma classe Arrow (qui extends Jpanel et dont je vous ai donnée le code).

                      l'ajout s'effectue nikel mais quand je parcours ma liste de JPanel en appelant la méthode redraw() (pour chaque element de ma liste),cela me dessine bien tout les Jpanel de ma classe standard sauf le dernier qui correspond à mon Arrow.et quand j'essaye de debuger je m'apperçois que effectivement la méthode de dessin PaintComponent de Arrow n'est jamais appeler...(alors que la méthode redraw elle est bien executer)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 juin 2015 à 16:09:25

                        Et comment est ce que tu fait pour ajouter ton Arrow ? Il faut peut être que tu appelle la méthode JPanel.validate() après avoir ajouté ton Arrow.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Ctrl+space

                          30 juin 2015 à 17:32:30

                          Bingo!

                          Merci beaucoup pour ton aide.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          [JAVA SWING] 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