IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JPanel] paint, paintComponent et repaint ?


Sujet :

Composants Java

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [JPanel] paint, paintComponent et repaint ?
    Bjr à tous,

    cela fait un petit moment que je manipule des JPanel, et je l'ai toujours fait selon le schéma suivant:

    - surcharge de paintComponent(Graphics) pour dessiner dans le panel
    - appel a repaint() pour mettre à jour le panel

    Cependant, je vois que beaucoup de monde utilise aussi les méthodes paint() et update() pour réaliser le même travail que moi....

    Quelqu'un peut-il m'expliquer la différence entre les deux manières de procéder ?



    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    A l'époque , j'avais vu un petit schéma avec quelle méthode appelle quoi et dans quel ordre, quoi mettre où et quelle méthode appeler... Ca serait une super contribution si un volontaire...
    Glob
    What would you do if you were not afraid?

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 102
    Points
    102
    Par défaut [swing][JPanel]paint, paintComponent et repaint ?
    Bonjour à tous,

    Bon si je me rappelle bien, voilà comment tout ça fonctionne :
    la methode Paint d'un composant appelle les deux methodes suivantes :
    - paintComponent qui dessine le composant.
    - paintChildren qui appelle la methode paint de tous les composants contenus dans ce container (si c'en est un.)

    La methode repaint appelle simplement paint, la methode update est une alternative à cette methode pour certains composants genre les JFrame.

  4. #4
    Membre actif
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 229
    Points
    229
    Par défaut
    toujours surcharger la méthode paint() elle a l'avantage de marcher aussi bien sur les composants awt que swing c'est pour ca que beaucoup n'utilisent pas le paintComponent() de swing.

    architecture de l'affichage graphique:

    - paint() (invoqué implicitement par le constructeur d'une Frame, Canvas, ...)
    - update()
    - paint()
    - update()
    - paint()
    - update()
    - paint()


    update() n'est pas obligée d'etre surchargée (réécrite par le soin du programmeur) mais si c'est le cas elle permet quelques possibilités comme le nettoyage approprié d'une zone de clipping, etc...
    exemple d'une méthode pour limiter le clipping sur des applications peu gourmandes en process graphique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void update( Graphics g )
    {
         paint ( g );
    }
    cependant meme si l'architecture impose l'appel a la méthode update() on ne l'appelle jamais nous meme, elle est appelée directement par le process Java (sinon il peut y avoir des bugs! ou des plantages!)
    ce qui donne cette architecture de programmation :

    - affichage par le paint() invoqué implicitement par le constructeur (setVisible = true ) sur le composant
    - repaint()
    - repaint()
    - repaint()
    - repaint()
    (+mitch): nan mais nanar j'préfère mourir contre un platane apres un accident de voiture plutot que d'une rupture d'anévrisme devant mon ecran d'pc

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    donc finalement cela revient au même, de dessiner avec paint ou paintComponent et de mettre a jour avec repaint ou update? (bon a part le truc awt/swing, mais je fais que du swing donc voilà)

    maintenant tu me dis (narko) qu'il ne faut pas appeler soi-même la méthode update sous peine de plantage... est-ce la même chose avec repaint ? quoi appeler lorsque l'on a des mise a jour à faire ?

    Le prophete, tu as dis que repaint appelle paint ? peut-être, mais elle appelle aussi paintComponent, car cela marche très bien selon mon architecture... ou bien est-ce paint qui appelle paintComponent ?

    moi j'utilisais toujours paintComponent car c'est comme cela que c'est expliqué dans mon livre (Programmer en java 2ème edi.)... D'ailleurs il n'aborde nulle part l'utilisation de paint et update...

    en tout cas,

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 102
    Points
    102
    Par défaut
    Bon c'est vrai que j'ai pas été très clair , je vais essayer d'être un peu plus précis.

    La méthode paint d'un composant appelle dans l'ordre :
    - paintComponent qui dessine effectivement ce composant
    - paintBorder qui dessine les bordures
    - paintChildren qui dessine les composants contenus dans ce container (si c'en est un) en appelant leur méthode paint.

    Donc en gros, si tu as un composant c1 qui contient deux composants c2 et c3, c1.paint() donne :

    - c1.paintComponent(g);
    - c1.paintBorder(g);
    - c1.paintChildren(g)

    et c1.paintChildren(g) donne :
    - c2.paint(g) => c2.paintComponent(g) et c2.paintBorder(g);
    - c3.paint(g) => c3.paintComponent(g) et c3.paintBorder(g);

    La méthode repaint appelle la méthode paint, donc les trois methodes decrites ci-dessus. C'est donc normal que ton architecture marche tres bien.

    En ce qui concerne les mises a jour, le mieux est de toujours appeler la méthode repaint, de toute façon elle appelera paint (donc ça marchera aussi bien avec swing que avec awt), mais elle a l'avantage de passer par un RepaintManager qui se charge de "scheduler" (désolé pour ce barbarisme) l'affichage. Perso, je me suis jamais soucié de la méthode update() et j'ai jamais eu de problèmes.

    Maintenant, en ce qui concerne les méthodes que tu redéfinis pour dessiner, tu peux surcharger paintComponent (ça marchera que pour les composants swing, comme le disait narkotik) ou paint (qui marchera pour les deux), ça dépend des composants que tu utilises.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Toutes (ou presque ! ) les subtilités des paints et updates sont expliquées à Painting in AWT and Swing.

    Lorsque tu l'auras lu, s'il y a encore des points obscurs, à ta dispo

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    OK je cerne mieux les dépendances maintenant

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  9. #9
    Invité
    Invité(e)
    Par défaut
    Le Prophète a dit ceci:
    La méthode paint d'un composant appelle dans l'ordre :
    - paintComponent qui dessine effectivement ce composant
    - paintBorder qui dessine les bordures
    - paintChildren qui dessine les composants contenus dans ce container (si c'en est un) en appelant leur méthode paint.

    Donc en gros, si tu as un composant c1 qui contient deux composants c2 et c3, c1.paint() donne :

    - c1.paintComponent(g);
    - c1.paintBorder(g);
    - c1.paintChildren(g)

    et c1.paintChildren(g) donne :
    - c2.paint(g) => c2.paintComponent(g) et c2.paintBorder(g);
    - c3.paint(g) => c3.paintComponent(g) et c3.paintBorder(g);

    La méthode repaint appelle la méthode paint, donc les trois methodes decrites ci-dessus. C'est donc normal que ton architecture marche tres bien.
    Il a oublié d'ajouter qu'il est impératif de comprendre ça si on veut faire la 2D!
    Et Merci encore je crois que ce sujet a bien sa place ici... #generationForum
    Attention: Peut-être c'est faux!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. JPanel qui ne se repaint() pas
    Par TotorolePacha dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 29/01/2014, 19h44
  2. Réponses: 4
    Dernier message: 21/07/2008, 22h32
  3. Problème repaint JPanel
    Par anthony62 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 19/09/2006, 15h09
  4. JPanel et repaint()
    Par manouchka dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 14/07/2006, 10h15
  5. [JScrollPane][paint] pas de repaint
    Par wonderyan dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 17/01/2006, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo