2013-02-27 12 views
13

Ich habe versucht, Tutorials zu diesem Thema, aber ich verstehe es immer noch nicht ganz. Grundsätzlich ist meine Frage, welche Methode besser ist und warum? Sollte ich paint oder paintComponent verwenden?Unterschied zwischen paint() und paintcomponent()?

Bitte versuchen Sie, die Antwort einfach zu halten, danke.

+6

Siehe auch [* Malerei in AWT und Swing *] (http://www.oracle.com/ technetwork/java/painting-140037.html). – trashgod

Antwort

13

aus Dokumentation von paint() Methode Zitiert

Diese Methode tatsächlich delegiert die Arbeit der Malerei zu drei geschützten Methoden: paintcomponent, paintBorder und paintChildren. ... Eine Unterklasse, die nur die UI (look and feel) -Delay-Methode paint-Methode spezialisieren möchte, sollte paintComponent einfach überschreiben.

Es sieht so aus, als ob die Methode paint() die Komponente zeichnet, einschließlich der Umrandung und der untergeordneten Elemente. Wenn Sie nur das Erscheinungsbild der Komponente ohne den Rahmen und die untergeordneten Elemente anpassen möchten, verwenden Sie .

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

+0

Während es richtig ist, wäre es ratsam, eine Verbindung zu einer mehr zu aktualisieren Version der JavaDocs, nur um Entwickler zu potenziellen Änderungen an der API zu markieren – MadProgrammer

+0

Ich bearbeitete den Link. Danke @MadProgrammer für die Erinnerung an diese – christianhs

+0

Immer noch ein +1 für die Antwort unabhängig;) – MadProgrammer

7

Im Allgemeinen, wenn in Swing Malerei, empfiehlt es sich paintComponent außer Kraft zu setzen.

Es gibt eine Reihe von Gründen, warum man paintComponent auf der untersten Ebene malt, was bedeutet, dass Sie nicht versehentlich Komponenten ausradieren, die während des Malvorgangs gerendert wurden - dies passiert vielen Menschen, die hier posten.

Es gibt ein, sehr, einige Male, die Sie möglicherweise paint überschreiben müssen, aber ich würde Sie immer ermutigen zu versuchen, es mit paintComponent zuerst arbeiten zu lassen.

Check out

+2

Ich glaube nicht, dass es wichtig ist, wenn Sie Paint() oder PaintComponent() aus einer doppelten Pufferung Sicht überschreiben. Siehe den Double-Buffering-Bereich aus dem Artikel "Malen in AWT und Swing". Jetzt, wenn Sie Paint() auf Frame-Ebene überschreiben (was ich nie empfehle) und vergessen Sie den Aufruf von super.paint(), dann können Sie in Schwierigkeiten geraten. – camickr

+1

@camickr Ach ja, du hast Recht, das ist das Argument dafür, die Container der obersten Ebene nicht zu überschreiben: P – MadProgrammer