Różnica między validate (), revalidate () i invalidate () w Swing GUI

111

Komponenty Swing mają wiele metod związanych z aktualizacją układu ekranu, w szczególności:

Dokumentacja Java definiuje je nieco z technicznego punktu widzenia, ale nie jest szczególnie jasne, w jaki sposób mają być używane.

Jaka jest różnica między nimi i w jakich okolicznościach należy używać jednego, a nie innych?

mikera
źródło

Odpowiedzi:

67

invalidate()oznacza kontener jako nieważny. Oznacza, że ​​treść jest w jakiś sposób błędna i musi zostać ponownie ułożona. Ale to tylko rodzaj znaku / flagi. Możliwe, że później trzeba będzie odświeżyć wiele nieprawidłowych kontenerów.

validate()wykonuje przekazywanie. Oznacza to, że wymagana jest nieprawidłowa treść dla wszystkich rozmiarów, a wszystkie rozmiary podskładników są ustawiane na odpowiednie wartości przez LayoutManager.

revalidate()jest po prostu sumą obu. Oznacza kontener jako nieważny i wykonuje układ kontenera.

AKTUALIZACJA:

Trochę kodu z 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
źródło
3
revalidate()nie dzwoni doLayout(), co validate()robi. Więc tak naprawdę nie jest sumą obu - revalidatenie zawsze jest prawidłowym zamiennikiem validate.
Meo
To jest dla AWT, tak wygląda rewalidacja dla Swinga: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/ ...
Meo
W tym przypadku chyba (nigdy nie próbowałem) RepaintManager zadzwoni do validate
StanislavL
Miałem do czynienia z brzydkim błędem i zastąpienie revalidate walidacją (która wywołuje doLayout) rozwiązało to ...
Meo
Jak możemy wywołać validate () z metody statycznej?
Kunal Tyagi
69

validate(): W Swingu, kiedy tworzysz komponent, to nie jest, validtj. Jego prawidłowa właściwość jest false. Mówi się, że komponent jest ważny, gdy jego szerokość, wysokość, położenie i inne rzeczy zostały określone. Odbywa się to zwykle przez wywołanie ich validate()metody, bezpośrednio lub pośrednio. Kiedy wywołujemy validate()kontenery, zweryfikuje kontener (jeśli jest nieprawidłowy), wywołując jego doLayout()metodę, która zwykle wywoła LayoutManager. Teraz każde dziecko umieszczone w tym kontenerze będzie walidowane rekurencyjnie, tak że całe drzewo zostanie ułożone i stanie się ważne.

revalidate(): revalidate()ma zostać wywołane, gdy zmienisz atrybut, który wpłynąłby na ich szerokość / wysokość, i wywołaj repaint (), gdy zmienisz atrybut, który wpłynie na ich wygląd. Na przykład, jeśli twój JFramezawiera a JPanel, teraz w pewnym momencie usunąłeś go JPaneli wstawiłeś nowy w jego miejsce, w zależności od zawartości nowo umieszczonego JPanel, rozmiaru komponentów wewnątrz, JPaneljak również The CONTAINERsamego (na mocy używanego przez niego menedżera układu), zmiany. Co popycha go do nieprawidłowego stanu. Aby więc zweryfikować tę zmianę, musisz jawnie wywołać revalidate().

invalidate(): To jest coś, czego nigdy nie używałem, więc może nie być wiele informacji na ten temat. Wygląda jednak na to, że przedstawione powyżej scenariusze mogą dać wskazówkę, co się dzieje podczas używania invalidate().

nIcE cOw
źródło
1
Uważam, że invalidate()jest to przydatne, gdy aktualizujesz kilka komponentów i chcesz oznaczyć je jako nieprawidłowe przed ostatecznym przeliczeniem układu za pomocą revalidate()lub validate().
Qix - MONICA została źle potraktowana
1
@Qix: IMHO, nie ma potrzeby wywoływania invalidate () , ponieważ jest ono wywoływane automatycznie. Co więcej, samo revalidate () wykona to zadanie (jak stwierdzono w dokumentacji Java, działa jako wygodna metoda wywoływania obu invalidate ()i validate ()).
nIcE cOw