invalidate()marca o recipiente como inválido. Significa que o conteúdo está de alguma forma errado e deve ser redefinido. Mas é apenas uma espécie de marca / bandeira. É possível que vários contêineres inválidos devam ser atualizados posteriormente.
validate()executa relayout. Isso significa que conteúdo inválido é solicitado para todos os tamanhos e os tamanhos de todos os subcomponentes são definidos com os valores apropriados pelo LayoutManager.
revalidate()é apenas a soma de ambos. Ele marca o contêiner como inválido e executa o layout do contêiner.
ATUALIZAR:
Algum código de 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()não chama doLayout(), o que validate()faz. Portanto, não é realmente uma soma de ambos - revalidatenem sempre é um substituto válido para validate.
Neste caso, eu acho (nunca tentei) RepaintManager chamará validate
StanislavL
Eu estava lidando com um bug feio e substituindo revalidate por validate (que chama doLayout) resolveu ...
Meo
Como podemos chamar validate () de um método estático?
Kunal Tyagi
69
validate(): No Swing, ao criar um componente, ele não é, validou seja, sua propriedade válida é false. Um componente é considerado válido quando sua largura, altura, localização e material foram determinados. Isso geralmente é feito chamando seu validate()método, direta ou indiretamente. Quando chamamos validate()contêineres, ele validará o contêiner (se for inválido) chamando seu doLayout()método, que normalmente invocará o LayoutManager. Agora, cada filho colocado neste contêiner será validado recursivamente, de forma que toda a árvore seja disposta e se torne válida.
revalidate(): revalidate()deve ser chamado quando você altera um atributo que afetaria sua largura / altura e repaint () quando você altera um atributo que afetaria sua aparência. Por exemplo, se o seu JFramecontém um JPanel, agora em um determinado momento você o removeu JPanele inseriu um novo em seu lugar, dependendo do conteúdo do recém-colocado JPanel, do tamanho dos componentes dentro do JPanele dele The CONTAINERpróprio (em virtude do gerenciador de layout usado por ele), alterações. O que o leva ao estado inválido. Portanto, para validar essa mudança, você deve chamar explicitamente revalidate().
invalidate(): Isso é algo que eu nunca usei, então pode não haver muitas informações que eu possa fornecer sobre isso. Mas parece que os cenários apresentados acima podem dar uma pequena dica sobre o que acontece ao usar invalidate().
Acredito que invalidate()seja útil quando você estiver atualizando vários componentes e quiser marcá-los como inválidos antes de finalmente recalcular o layout com revalidate()ou validate().
Qix - MONICA ERA MISTURADA
1
@Qix: IMHO, não há necessidade de chamar invalidate () , pois ele está sendo chamado automaticamente. Além disso, o próprio revalidate () fará essa tarefa (conforme declarado no Java Docs, ele atua como o método conveniente para chamar invalidate ()e validate ()).
revalidate()
não chamadoLayout()
, o quevalidate()
faz. Portanto, não é realmente uma soma de ambos -revalidate
nem sempre é um substituto válido paravalidate
.validate()
: No Swing, ao criar um componente, ele não é,valid
ou seja, sua propriedade válida éfalse
. Um componente é considerado válido quando sua largura, altura, localização e material foram determinados. Isso geralmente é feito chamando seuvalidate()
método, direta ou indiretamente. Quando chamamosvalidate()
contêineres, ele validará o contêiner (se for inválido) chamando seudoLayout()
método, que normalmente invocará oLayoutManager
. Agora, cada filho colocado neste contêiner será validado recursivamente, de forma que toda a árvore seja disposta e se torne válida.revalidate()
:revalidate()
deve ser chamado quando você altera um atributo que afetaria sua largura / altura e repaint () quando você altera um atributo que afetaria sua aparência. Por exemplo, se o seuJFrame
contém umJPanel
, agora em um determinado momento você o removeuJPanel
e inseriu um novo em seu lugar, dependendo do conteúdo do recém-colocadoJPanel
, do tamanho dos componentes dentro doJPanel
e deleThe CONTAINER
próprio (em virtude do gerenciador de layout usado por ele), alterações. O que o leva ao estado inválido. Portanto, para validar essa mudança, você deve chamar explicitamenterevalidate()
.invalidate()
: Isso é algo que eu nunca usei, então pode não haver muitas informações que eu possa fornecer sobre isso. Mas parece que os cenários apresentados acima podem dar uma pequena dica sobre o que acontece ao usarinvalidate()
.fonte
invalidate()
seja útil quando você estiver atualizando vários componentes e quiser marcá-los como inválidos antes de finalmente recalcular o layout comrevalidate()
ouvalidate()
.invalidate ()
evalidate ()
).