2013-02-27 15 views
13

J'ai essayé des tutoriels à ce sujet mais je ne comprends toujours pas. Fondamentalement ma question est quelle méthode est meilleure et pourquoi? Dois-je utiliser paint ou paintComponent?Différence entre paint() et paintcomponent()?

S'il vous plaît essayer de garder la réponse simple, merci.

+6

Voir aussi [* Peinture en AWT et Swing *] (http://www.oracle.com/ technetwork/java/painting-140037.html). – trashgod

Répondre

13

Je cite la documentation de paint() méthode

Cette méthode en fait le travail des délégués de la peinture à trois méthodes protégées: paintComponent, paintBorder et paintChildren. ... Une sous-classe qui souhaite simplement se spécialiser dans la méthode de peinture de l'interface utilisateur (look and feel) devrait simplement remplacer paintComponent.

Il semble que la méthode paint() dessine réellement le composant, y compris la bordure et les enfants. Si vous souhaitez uniquement personnaliser l'apparence du composant en excluant la bordure et les enfants, utilisez paintComponent().

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paint(java.awt.Graphics)

+0

Bien que correct, il serait prudent de se lier à un plus de mettre à jour la version de JavaDocs, juste pour mettre en évidence aux développeurs les changements potentiels à l'API – MadProgrammer

+0

J'ai modifié le lien. merci @MadProgrammer pour me rappeler à ce sujet – christianhs

+0

Encore un +1 pour la réponse malgré tout;) – MadProgrammer

7

D'une manière générale, lorsque la peinture dans Swing, il est recommandé de remplacer paintComponent.

Il y a un certain nombre de raisons pour lesquelles l'une paintComponent est peinte sur la couche inférieure, ce qui signifie que vous n'effacez pas accidentellement les composants qui ont été rendus pendant le processus de peinture - cela arrive beaucoup aux gens qui publient ici.

Il y a, très, peu de fois vous devrez peut-être remplacer paint, mais je vous encouragerais toujours à essayer de le faire d'abord avec paintComponent.

Découvrez

+2

Je ne pense pas que cela soit important si vous surchargez paint() ou paintComponent() d'un double point de vue de mise en mémoire tampon. Voir la section double buffering de l'article "Painting in AWT and Swing". Maintenant, si vous remplacez paint() à un niveau d'image (ce que je ne recommande jamais) et oubliez d'appeler super.paint() alors vous pouvez avoir des problèmes. – camickr

+1

@camickr Ah oui, vous avez raison, c'est l'argument pour ne pas surcharger les conteneurs de niveau supérieur: P – MadProgrammer