Wie funktioniert paintComponent arbeiten?
Könnte dies ein sehr noob Frage. Ich bin gerade erst Java lernen
Ich nicht verstehen, den Betrieb der paintComponent-Methode. Ich will wissen ob ich etwas zu zeichnen, ich muss das überschreiben der paintComponent-Methode.
public void paintComponent(Graphics g)
{
...
}
Aber Wann wird es aufgerufen? Ich sehe nie so etwas wie "Objekt.paintComponent(g)" aber es ist immer noch gezeichnet, wenn das Programm ausgeführt wird.
Ist und was die Grafik-parameter? Wo ist es? Parameter müssen geliefert werden, wenn die Methode aufgerufen wird. Aber wie ich schon sagte, es scheint, wie diese Methode niemals explizit genannt. Also, wer stellt diese parameter? Und warum müssen wir es umwandeln zu Graphics2D?
public void paintComponent(Graphics g)
{
...
Graphics2D g2= (Graphics2D) g;
...
}
InformationsquelleAutor der Frage Hải Phong | 2013-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die (sehr) kurze Antwort auf deine Frage ist, dass
paintComponent
heißt "wenn es sein muss." Manchmal ist es einfacher, zu denken, der das Java-Swing-GUI-system als eine "black-box", wo viel von den Interna behandelt werden, ohne zu viel Transparenz.Gibt es eine Reihe von Faktoren, die bestimmen, Wann eine Komponente muss neu lackiert, angefangen vom Umzug, re-sizing, den Fokus ändern, versteckt von anderen frames, und so weiter und so Fort. Viele dieser Ereignisse, die erkannt werden auto-magisch, und
paintComponent
intern genannt wird, wenn es bestimmt wird, dass die operation notwendig ist.Ich habe mit Schaukel für viele Jahre, und ich glaube nicht, ich habe immer genannt
paintComponent
direkt, oder sogar gesehen, wie er direkt aus etwas anderes. Der nächste, den ich gekommen bin, ist mit derrepaint()
Methoden programmgesteuert auslösen, ein repaint von bestimmten Komponenten (die ich nehme an, ruft die korrektepaintComponent
Methoden downstream.Meiner Erfahrung
paintComponent
ist selten direkt überschrieben. Ich gebe zu, es sind benutzerdefinierte rendering-Aufgaben, die eine solche Granularität, aber Java Swing bietet eine (relativ) stabile JComponents und Layouts, die verwendet werden können, um nicht viel von der schwerarbeit, die zimmerreserviereung, ohne das direkt überschreibenpaintComponent
. Ich denke, mein Punkt hier ist, um sicherzustellen, dass Sie nicht tun können, etwas mit einheimischen JComponents und Layouts, bevor Sie Weg gehen, die versuchen zu Rollen Ihre eigenen custom-gerenderte Komponenten.InformationsquelleAutor der Antwort SeKa
Zwei Dinge, die Sie tun können hier:
Nur zur info, hier ist der stacktrace, habe ich aus dem Beispiel-code, den ich gepostet am Ende:
Den Graphics parameter kommt von hier:
Snippet eingebunden wird, ist die folgende:
Wenn du nimmst einen Blick auf es, Sie werden sehen, dass es abrufen, die Grafiken aus dem JComponent selbst (indirekt mit
javax.swing.JComponent.safelyGetGraphics(Component, Component)
), die sich nimmt, die er schließlich aus seiner ersten "Schwergewicht Eltern" (abgeschnitten, um die Komponente Grenzen), die es sich selbst nimmt Sie aus den entsprechenden einheitlichen Ressourcen.Hinsichtlich der Tatsache, dass Sie haben zu werfen
Graphics
zu einemGraphics2D
es gerade passiert, dass beim arbeiten mit dem Window Toolkit, dieGraphics
eigentlich reichtGraphics2D
noch könnten Sie andereGraphics
die tun was "nicht" gehtGraphics2D
(es passiert nicht sehr oft, aber mit AWT/Swing ermöglicht es Ihnen, das zu tun).InformationsquelleAutor der Antwort Guillaume Polet
Den Interna der GUI-system aufrufen dieser Methode, und übergeben Sie in die
Graphics
parameter ein graphics-context, auf das Sie zurückgreifen kann.InformationsquelleAutor der Antwort Gian
Aufrufen
object.paintComponent(g)
ist ein Fehler.Stattdessen diese Methode wird automatisch aufgerufen, wenn das panel wird erstellt. Die
paintComponent()
Methode kann auch aufgerufen werden, indem dierepaint()
definierte Methode inComponent
Klasse.Den Effekt aufrufen
repaint()
ist, dass Swing löscht automatisch die Grafik auf der Platte und führt diepaintComponent
Methode zum Neuzeichnen der Grafik, die auf diesem panel.InformationsquelleAutor der Antwort Saumya Sharma