2010-12-09 6 views
13

Mögliche Duplizieren ungültig:
Java Swing revalidate() vs repaint()Java Swing: repaint() vs

Hallo alle

ich mit meinem Programm bin kämpfen, um es zur richtigen Zeit zu machen auffrischen .

Und nicht viel Erfolg lol

Ich habe 2 Fragen

Q1 mit: was soll ich verwenden, wenn meine Schnittstelle geändert hat: neu lackieren oder ungültig?

Q2: Wann sollten sie aufgerufen werden? Ich weiß, dass es sich dumm anhört, aber ich habe tatsächlich Probleme wegen SwingWorker und anderer Threading-Operationen.

+0

Ich würde nicht sagen, "ungültig" und "revalidate" sind das gleiche. –

Antwort

25

Q1: was sollte ich, wenn meine Schnittstelle geändert hat: neu lackieren oder Invalidier?

Wenn das Layout aufgrund von Größenänderung, Schriftartenänderung usw. nicht auf dem neuesten Stand ist, sollten Sie invalidate aufrufen. Das Invalidieren einer Komponente macht die Komponente ungültig, und alle Eltern darüber werden als ausgelegt markiert. Vor dem Lackieren wird im Validierungsschritt, wenn keine Änderung gefunden wird, der Farbschritt weggelassen.

Wenn ein Teil der Komponente aktualisiert wird (definiert durch das Clip-Rechteck der Grafik, "beschädigt" Region), dann sollten Sie erwägen, Repaint aufzurufen. Einer der Gründe dafür, dass beschädigte Bereiche auftreten können, liegt in der Überschneidung eines Teils Ihrer Komponente aufgrund einer anderen Komponente oder Anwendung. Meiner Erfahrung nach ist das repaint() effektiver, wenn Sie es auf der innersten umschließenden Komponente aufrufen (d. H. Mit public void repaint(int x, int y, int width, int height) anstelle der öffentlichen void repaint()).

Q2: wann sollen sie aufgerufen werden?

Invalidate(): markiert eine Komponente als nicht gültig - das heißt, es ist das Layout ist oder nicht sein „up to date“ mehr: dh die Komponente der Größe verändert wird, wird eine Grenze hinzugefügt, es ist Schriftwechsel usw. Sie sollte niemals invalidate() manuell aufrufen, da swing das für Sie ziemlich genau für jede Änderung der Eigenschaft tut.

Wenn mehr als eine Region innerhalb des Steuerelements neu gezeichnet werden muss, führt Invalidate dazu, dass das gesamte Fenster in einem einzigen Durchgang neu gezeichnet wird, um Flimmern durch redundante Repaints zu vermeiden. Es gibt keine Leistungseinbußen für das mehrfache Aufrufen von Invalidate, bevor das Steuerelement tatsächlich neu gezeichnet wird.

Repaint() : Wenn es sich bei der Komponente um eine Lightweight-Komponente handelt, ruft diese Methode so schnell wie möglich einen Aufruf der Malmethode dieser Komponente hervor. Andernfalls ruft diese Methode so bald wie möglich einen Aufruf der Aktualisierungsmethode dieser Komponente auf.

Schauen Sie sich auch Update Methode.

HINWEIS: Swing-Prozesse "repraint" Anforderungen auf eine etwas andere Weise als die AWT, obwohl das Endergebnis für den Anwendungsprogrammierer im Wesentlichen das gleiche ist - paint() aufgerufen wird.

unten auf den Link finden Sie eine hervorragende Verbindung, wie Malerei in AWT und Swing getan wird:

http://www.oracle.com/technetwork/java/painting-140037.html

Hope this helfen.

+0

Wenn Sie mit JComponents arbeiten, verwenden Sie 'revalidate()' anstelle von 'invalidate() ', um sicherzustellen, dass die gesamte Komponentenhierarchie gegebenenfalls ungültig wird (siehe auch http://stackoverflow.com/questions/859493/remove-swing-component) -use-validate-or-revalidate) –