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
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()nie dzwoni doLayout(), co validate()robi. Więc tak naprawdę nie jest sumą obu - revalidatenie zawsze jest prawidłowym zamiennikiem validate.
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().
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 ()).
revalidate()
nie dzwonidoLayout()
, covalidate()
robi. Więc tak naprawdę nie jest sumą obu -revalidate
nie zawsze jest prawidłowym zamiennikiemvalidate
.validate()
: W Swingu, kiedy tworzysz komponent, to nie jest,valid
tj. Jego prawidłowa właściwość jestfalse
. 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 ichvalidate()
metody, bezpośrednio lub pośrednio. Kiedy wywołujemyvalidate()
kontenery, zweryfikuje kontener (jeśli jest nieprawidłowy), wywołując jegodoLayout()
metodę, która zwykle wywołaLayoutManager
. 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ójJFrame
zawiera aJPanel
, teraz w pewnym momencie usunąłeś goJPanel
i wstawiłeś nowy w jego miejsce, w zależności od zawartości nowo umieszczonegoJPanel
, rozmiaru komponentów wewnątrz,JPanel
jak równieżThe CONTAINER
samego (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żywaniainvalidate()
.źródło
invalidate()
jest to przydatne, gdy aktualizujesz kilka komponentów i chcesz oznaczyć je jako nieprawidłowe przed ostatecznym przeliczeniem układu za pomocąrevalidate()
lubvalidate()
.invalidate ()
ivalidate ()
).