Unterschied zwischen validate (), revalidate () und invalidate () in der Swing-GUI

111

Swing-Komponenten verfügen über mehrere Methoden zur Aktualisierung des Bildschirmlayouts, insbesondere:

Die Java-Dokumentation definiert diese aus technischer Sicht etwas, aber es ist nicht besonders klar, wie sie verwendet werden sollen.

Was ist der Unterschied zwischen diesen und unter welchen Umständen sollten Sie eine anstelle der anderen verwenden?

mikera
quelle

Antworten:

67

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

public void revalidate() {
    revalidateSynchronously();
}

/**
 * Revalidates the component synchronously.
 */
final void 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 container
                    break;
                }

                root = root.getContainer();
            }

            root.validate();
        }
    }
}
StanislavL
quelle
3
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.
Meo
Das ist für AWT, so sieht die erneute Validierung
Meo
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().

nIcE cOw
quelle
1
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 ()).
Eis