invalidate()markiert den Container als ungültig. Bedeutet, dass der Inhalt irgendwie falsch ist und neu angelegt werden muss. Aber es ist nur eine Art Zeichen / Flagge. Es ist möglich, dass mehrere ungültige Container später aktualisiert werden müssen.
validate()führt Relayout durch. Dies bedeutet, dass für alle Größen ungültiger Inhalt abgefragt wird und alle Größen der Unterkomponenten von LayoutManager auf die richtigen Werte eingestellt werden.
revalidate()ist nur die Summe von beiden. Es markiert den Container als ungültig und führt das Layout des Containers durch.
AKTUALISIEREN:
Code aus Component.java
publicvoid revalidate(){
revalidateSynchronously();}/**
* Revalidates the component synchronously.
*/finalvoid revalidateSynchronously(){synchronized(getTreeLock()){
invalidate();Container root = getContainer();if(root ==null){// There's no parents. Just validate itself.
validate();}else{while(!root.isValidateRoot()){if(root.getContainer()==null){// If there's no validate roots, we'll validate the// topmost containerbreak;}
root = root.getContainer();}
root.validate();}}}
revalidate()ruft nicht an doLayout(), was validate()tut. Es ist also nicht wirklich eine Summe von beidem - es revalidateist nicht immer ein gültiger Ersatz für validate.
In diesem Fall wird RepaintManager vermutlich (nie ausprobiert) validate aufrufen
StanislavL
Ich hatte es mit einem hässlichen Fehler zu tun und das Ersetzen von revalidate durch validate (was doLayout aufruft) hat es gelöst ...
Meo
Wie können wir validate () von einer statischen Methode aus aufrufen?
Kunal Tyagi
69
validate(): Wenn Sie in Swing eine Komponente erstellen, ist dies nicht validdie gültige Eigenschaft false. Eine Komponente gilt als gültig, wenn ihre Breite, Höhe, Position und ihr Material bestimmt wurden. Dies erfolgt normalerweise durch validate()direkten oder indirekten Aufruf ihrer Methode. Wenn wir validate()Container aufrufen , validiert es den Container (falls er ungültig ist), indem es seine doLayout()Methode aufruft , die normalerweise die aufruft LayoutManager. Jetzt wird jedes Kind, das auf diesen Container gelegt wird, rekursiv validiert, so dass der gesamte Baum angelegt wird und gültig wird.
revalidate(): revalidate()soll aufgerufen werden, wenn Sie ein Attribut ändern, das sich auf deren Breite / Höhe auswirkt, und repaint () aufrufen, wenn Sie ein Attribut ändern, das sich auf deren Erscheinungsbild auswirkt. Wenn Ihr Beispiel beispielsweise ein JFrameenthält JPanel, haben Sie dieses zu einem bestimmten Zeitpunkt entfernt JPanelund an seiner Stelle ein neues eingefügt, abhängig vom Inhalt des neu platzierten JPanel, der Größe der Komponenten im Inneren JPanelsowie von sich The CONTAINERselbst (aufgrund dessen) des von ihm verwendeten Layout-Managers), Änderungen. Was es in den ungültigen Zustand versetzt. Um diese Änderung zu validieren, müssen Sie explizit aufrufen revalidate().
invalidate(): Dies ist etwas, das ich noch nie benutzt habe, daher kann ich möglicherweise nicht viele Informationen darüber bereitstellen. Es scheint jedoch, dass die oben dargestellten Szenarien einen kleinen Hinweis darauf geben können, was bei der Verwendung passiert invalidate().
Ich glaube, dies invalidate()ist nützlich, wenn Sie mehrere Komponenten aktualisieren und sie als ungültig markieren möchten, bevor Sie das Layout endgültig mit revalidate()oder neu berechnen validate().
Qix - MONICA wurde
1
@Qix: IMHO muss invalidate () nicht aufgerufen werden , da es automatisch aufgerufen wird. Darüber hinaus erledigt revalidate () selbst diese Aufgabe (wie in den Java-Dokumenten angegeben, fungiert es als bequeme Methode zum Aufrufen von invalidate ()und validate ()).
revalidate()
ruft nicht andoLayout()
, wasvalidate()
tut. Es ist also nicht wirklich eine Summe von beidem - esrevalidate
ist nicht immer ein gültiger Ersatz fürvalidate
.validate()
: Wenn Sie in Swing eine Komponente erstellen, ist dies nichtvalid
die gültige Eigenschaftfalse
. Eine Komponente gilt als gültig, wenn ihre Breite, Höhe, Position und ihr Material bestimmt wurden. Dies erfolgt normalerweise durchvalidate()
direkten oder indirekten Aufruf ihrer Methode. Wenn wirvalidate()
Container aufrufen , validiert es den Container (falls er ungültig ist), indem es seinedoLayout()
Methode aufruft , die normalerweise die aufruftLayoutManager
. Jetzt wird jedes Kind, das auf diesen Container gelegt wird, rekursiv validiert, so dass der gesamte Baum angelegt wird und gültig wird.revalidate()
:revalidate()
soll aufgerufen werden, wenn Sie ein Attribut ändern, das sich auf deren Breite / Höhe auswirkt, und repaint () aufrufen, wenn Sie ein Attribut ändern, das sich auf deren Erscheinungsbild auswirkt. Wenn Ihr Beispiel beispielsweise einJFrame
enthältJPanel
, haben Sie dieses zu einem bestimmten Zeitpunkt entferntJPanel
und an seiner Stelle ein neues eingefügt, abhängig vom Inhalt des neu platziertenJPanel
, der Größe der Komponenten im InnerenJPanel
sowie von sichThe CONTAINER
selbst (aufgrund dessen) des von ihm verwendeten Layout-Managers), Änderungen. Was es in den ungültigen Zustand versetzt. Um diese Änderung zu validieren, müssen Sie explizit aufrufenrevalidate()
.invalidate()
: Dies ist etwas, das ich noch nie benutzt habe, daher kann ich möglicherweise nicht viele Informationen darüber bereitstellen. Es scheint jedoch, dass die oben dargestellten Szenarien einen kleinen Hinweis darauf geben können, was bei der Verwendung passiertinvalidate()
.quelle
invalidate()
ist nützlich, wenn Sie mehrere Komponenten aktualisieren und sie als ungültig markieren möchten, bevor Sie das Layout endgültig mitrevalidate()
oder neu berechnenvalidate()
.invalidate ()
undvalidate ()
).