Diferença entre validate (), revalidate () e invalidate () no Swing GUI

111

Os componentes do Swing têm vários métodos relacionados às atualizações do layout da tela, em particular:

A documentação Java os define um pouco de uma perspectiva técnica, mas não está particularmente claro como eles devem ser usados.

Qual é a diferença entre eles e em que circunstâncias você deve usar um em vez dos outros?

Mikera
fonte

Respostas:

67

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

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
fonte
3
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.
Meo
Isso é para AWT, é assim que revalidate se parece para Swing: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
Meo
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().

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