Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec paintComponent

Dessiner sur un composant via une autre classe.

Sujet résolu
    23 mai 2009 à 18:32:55

    Salut, j'essaye de dessiner sur ma fenêtre une image à l'aide avec une autre classe mais ça ne fonctionne pas, voici le code (donc dans ma classe héritant de JFrame je fais :
    public void drawImage (Image img) {			
    	bufferGraphique.drawImage(img, 0, 0, getWidth(), getHeight(), this);		
    	repaint ();
    }
    public void paintComponent (Graphics g) {		
    	g.drawImage(bufferImage, 0, 0, this);
    }
    


    Et dans mon autre classe je fais :
    public void drawLoginImage (Image img) {		
    	parent.drawImage(img);	
    }	
    public void paintComponent (Graphics g) {
    	parent.getGraphicsConfiguration();
    }
    


    Mais ça ne fonctionne pas, il ne m'affiche rien, alors j'aimerais savoir comment faire pour dessiner sur un composant à partir d'une autre classe.
    merci.


    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2009 à 18:53:23

      T'aurais pas forget le
      super.paintComponent(g);
      

      Et le
      validate();
      
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
        23 mai 2009 à 19:25:40

        Comme ça ?

        public void paintComponent (Graphics g) {		
        	g.drawImage(bufferImage, 0, 0, this);
        	super.paintComponents(g);
        	validate ();
        }
        


        Je l'ai rajouté mais ça ne change rien.

        PS : C'est super.paintComponents(g) le super.paintComponent(g) Eclipse me le souligne.
        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2009 à 20:22:17

          euh paintComponent() n'existe que dans les JComponent , hors JFrame hérite de Frame , puis de Window , Container puis Component ...

          Donc aucune chance que la méthode soit utilisée.

          Ne dessine pas directement dans la JFrame , plutôt dans un JComponent ajouté à ta frame
          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2009 à 20:35:20

            Oké je vais essayer ça mais c'pas ça le blème car si je dessine dans la classe même sur ma fenêtre ça marche, quand je dessine à partir d'une autre classe ça ne marche plus, pourtant avant ça marchait j'avais l'image qui s'affichait mais mtnt elle veut plus s'afficher. :colere:

            Sinon, paintComponent marche je t'assure que oui, il n'y a qu'avec Frame que ça ne marche pas, cysboy l'utilise bien, note que c'est vraiment un cisco lui en java pour ne pas dire zéro. :p

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2009 à 20:54:23

              cysboy overwrite la méthode paintComponent dans une classe qui hérite de JFrame ????

              http://java.sun.com/javase/6/docs/api/ [...] g/JFrame.html

              tu fais ctrl+F et tu cherche paintComponent, tu verras qu'elle n'existe pas

              alors je ne sais pas comment tu à fais, mais il n'y a aucune chance que ton JFrame ait pu dessiner quelque chose à partir de la méthode paintComponent.

              Et je ne pense pas la méthode de dessin que la JFrame soit prévue pour être modifiée, vu qu'elle ne dessine pas uniquement le contentPane, mais aussi... les autres
              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2009 à 21:30:56

                Ha euh non elle hérite de JButton pardon, enfin soit, mais la JFrame contient déjà un ContentPane je pense à partir de la version 5 de java, pour ça que j'ai pu dessiner dessus avec paintComponent, mais il est vrai que à la version 4 de java j'aurais du le faire comme tu as dis, ajouter le ContentPane sur ma fenêtre.
                Mais bon il est vrai que le point (0,0) se trouvait en dessous de la barre de titre dans mon cas, sans doute pour ça que j'ai des problèmes, je pensais dessiner sur le contentpane mais en fait je dessiner pas dessus erf!

                Bon bah je vais essayer de dessiner sur le contentPane alors.
                Bah quand je met mon Panel en ContentPane, là lorsque je fais un getGraphics, j'ai un NullPointerException, vu que ma classe getGraphics me renvoie null.
                Halala je n'arrive vraiment pas à comprendre comme fonctionne cette classe Graphics.

                • Partager sur Facebook
                • Partager sur Twitter
                  23 mai 2009 à 22:02:30

                  Citation : Lolilolight

                  ... mais la JFrame contient déjà un ContentPane je pense à partir de la version 5 de java, pour ça que j'ai pu dessiner dessus avec paintComponent, mais il est vrai que à la version 4 de java j'aurais du le faire comme tu as dis, ...



                  Bah ça c'est juste pour les méthodes add, mais le lien que je t'ai donné c'est la javadoc de la version 6, et il n'y a pas de paintComponent
                  Je vois vraiment pas comment c'est possible que tu dessine quelque chose (sauf si tu modifie paintComponents)...

                  sinon

                  Citation : Lolilolight

                  Bah quand je met mon Panel en ContentPane, là lorsque je fais un getGraphics, j'ai un NullPointerException, vu que ma classe getGraphics me renvoie null.
                  Halala je n'arrive vraiment pas à comprendre comme fonctionne cette classe Graphics.



                  là je vois pas trop... tu peux montrer tes sources


                  EDIT :
                  Je viens de me rappelé une erreur qui surviens assez souvent, c'est qu'on fais appel à getGrahics avant que le composant ne possède de Graphics

                  Citation : Javadoc

                  public Graphics getGraphics()
                  Creates a graphics context for this component. This method will return null if this component is currently not displayable.



                  Un composent n'est affichab:le que s'il est relié à une fenetre. Graphics est fournit par ta JFrame, et il faut donc que le composant ait été ajouté au composant parent, et que le ainsi de suite jusqu'à la JFrame. Elle transmettre un Graphics à tous ces enfants et eux vont faire de même aux leurs et tout et tout...

                  public class MaFrame extends JFrame
                    public MaFrame(){
                  
                      show();
                      JPanel panel = new JPanel();
                   
                      pan.getGraphics.drawString("hello world pour changer"); // NullPointerException
                   
                      this.add(panel);
                      pan.getGraphics.drawString("hello world pour changer"); // ok
                    }
                  


                  (en espérant avoir été clair, parce que là je dors déjà)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mai 2009 à 8:37:59

                    Ha c'est ça, oui en effet, je crée le Panel avant de le mettre en ContentPane à ma JFrame, Suffit donc juste que j'inverse, je dois mettre le panneau à ma JFrame et ensuite seulement dessiner dessus, erf je dois changer tout mon code, même en faisant addNotify() avant ça ne marche pas, donc je suppose qu'on est vraiment obligé de d'abord ajouter son composant à la fenêtre avant de pouvoir dessiner dessus.
                    Pourtant je me rappelle avoir pu dessiner sur des composants encore non ajouté grâce à la méthode addNotify(), j'ai lu un tuto qui disait qu'il fallait créer le paire d'un composant avant de pouvoir dessiner dessus, ce qui m'a permis de comprendre mieux comment fonctionne les interface graphique en Java.
                    Je vais essayer de faire comme tu dis mais je suis sûr que avec la méthode addNotify(), le composant est affichable.
                    Oui je confirme la méthode isDisplayable me renvoie true, le problème est donc que mon panneau ne possède pas encore le contexte graphique que la JFrame lui transmet, commentdire à mon panneau, "je veux récupérer le contexte graphique de la JFrame" ?

                    EDIT : sinon ça marche si je trace l'image après avoir ajouté le composant dessus, donc voilà j'ai enfin compris pourquoi ça ne marchait pas!







                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mai 2009 à 11:05:53

                      en effet addNotify() devrait fonctionner pour attacher un composant à un dessinateur natif
                      http://java.sun.com/javase/6/docs/api/java/awt/Container.html#addNotify()

                      quand tu dis ça ne marche pas, tu a une exception ou ça n'est tout simplement pas affiché ?

                      Je pense que cette méthode n'est utilisée que pour dessiner des composants offscreens. Sinon dans la javadoc il est dit

                      Citation


                      This method is called internally by the toolkit and should not be called directly by programs.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mai 2009 à 11:17:44

                        En fait j'ai un NullPointerException, hors que ça ne m'est jamais arriver avec createImage après avoir fait appel à addNotify() pour que mon JPanel soit affichable, mais on dirait que ce coup si c'est différent, même si je fais appel à addNotify () avant mon panneau réagis comme si je ne l'avais pas fait.

                        A mon avis le fait qu'il soit affichable ne suffit pas dans mon cas, je ne vois que ça comme explication.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 mai 2009 à 11:22:54

                          De toute façon addNotify() ne te fournira le même contexte graphique que celui de ta JFrame...

                          Une autre solution si tu veux pas changer trop de code, c'est tu crée une BufferedImage, tu dessine dedans, et tu l'ajoute dans un JLabel, ou tu la dessine dans paintComponent()
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 mai 2009 à 11:31:40

                            Non c'est bon j'ai trouver une astuce sans changer mon code, en fait comme tu dis addNotify() ça ne marche que pour la JFrame, car quand je fais un addNotify () sur la JFrame ça marche, mais ça ne marche plus quand je le fais sur le JPanel parce que comme tu dis ça renvoie le même contexte graphique que la JFrame, voici comment j'ai procédé :

                            La fenêtre :
                            public WotckFrame () {
                            	super ("War of the common strategy");
                            		
                            	setUndecorated(true);			
                            	ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                            	gd = ge.getDefaultScreenDevice();
                            	setConfiguration ();		
                            	inputListener = new WotckFrameListener (this);		
                            	showLoginPage ();		
                            	//showGLCanvas ();	
                            		
                            }
                            public void showLoginPage () {
                            	LoginPage lp = LoginPage.createConnexionPage(this);		
                            	setContentPane(lp);	
                            	setVisible (true);
                            	lp.drawLoginImage();
                            }
                            


                            Et le panneau sur lequel je trace l'image : (La classe LoginPage quie hérite de JPanel et qui constitue le contentpane)
                            public void drawLoginImage () {
                            	bufferImage = createImage (getWidth(), getHeight ());
                            	bufferGraphique = bufferImage.getGraphics();
                            	bufferGraphique.drawImage(loginbgimage, 0, 0,getWidth(), getHeight(), this);	
                            	repaint ();
                            }
                            	
                            public void paintComponent (Graphics g) {
                            	g.drawImage(bufferImage, 0, 0, this);
                            }
                            


                            Et depuis que je trace l'image depuis la classe héritant de JFrame et plus avec la classe héritant de JPanel ça marche.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 mai 2009 à 11:34:01

                              Citation


                              //showGLCanvas ();



                              tu utilise OpenGL ?
                              quelle bibli ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 mai 2009 à 11:38:34

                                Oui j'utilise JOGL pour afficher des personnages en 3D pour mon futur jeux, là c'est la gestion des login et inscriptions que je suis entrain de faire, et l'image de font s'affiche enfin sur la page de login!

                                Merci pour toutes vos rép., je mets le sujet réglo. :)



                                • Partager sur Facebook
                                • Partager sur Twitter

                                Problème avec 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