Diferencia entre validar (), revalidar () e invalidar () en la GUI de Swing

111

Los componentes de swing tienen varios métodos relacionados con las actualizaciones del diseño de la pantalla, en particular:

La documentación de Java los define de alguna manera desde una perspectiva técnica, pero no está particularmente claro cómo deben usarse.

¿Cuál es la diferencia entre estos y en qué circunstancias debería utilizar uno en lugar de los otros?

mikera
fuente

Respuestas:

67

invalidate()marca el contenedor como inválido. Significa que el contenido es incorrecto de alguna manera y debe ser reorganizado. Pero es solo una especie de marca / bandera. Es posible que más tarde se deban actualizar varios contenedores no válidos.

validate()realiza la retransmisión. Significa que se solicita contenido no válido para todos los tamaños y que LayoutManager establece los valores adecuados para todos los tamaños de los subcomponentes.

revalidate()es solo la suma de ambos. Marca el contenedor como no válido y realiza el diseño del contenedor.

ACTUALIZAR:

Algún 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
fuente
3
revalidate()no llama doLayout(), lo que validate()hace. Por lo tanto, no es realmente una suma de ambos, revalidateno siempre es un reemplazo válido para validate.
Meo
Eso es para AWT, así es como se ve la revalidación para Swing: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
Meo
En este caso, supongo (nunca lo intenté) RepaintManager llamará a validate
StanislavL
Estaba lidiando con un error feo y reemplazando revalidate con validate (que llama a doLayout) lo resolvió ...
Meo
¿Cómo podemos llamar a validate () desde un método estático?
Kunal Tyagi
69

validate(): En Swing, cuando crea un componente, no lo es, es validdecir, su propiedad válida es false. Se dice que un componente es válido cuando se ha determinado su ancho, alto, ubicación y cosas. Esto generalmente se hace llamando a su validate()método, directa o indirectamente. Cuando llamamos validate()a contenedores, validará el contenedor (si no es válido) llamando a su doLayout()método, que normalmente invocará el LayoutManager. Ahora, cada niño colocado en este contenedor se validará de forma recursiva, de modo que todo el árbol se distribuirá y será válido.

revalidate(): revalidate()se debe llamar cuando cambia un atributo que afectaría su ancho / alto y llamar a repaint () cuando cambia un atributo que afectaría su apariencia. Por ejemplo, si JFramecontiene un JPanel, ahora en un momento determinado lo eliminó JPanele insertó uno nuevo en su lugar, dependiendo del contenido del recién colocado JPanel, el tamaño de los componentes dentro del JPanely él The CONTAINERmismo (en virtud de del administrador de diseño utilizado por él), cambios. Lo que lo empuja al estado inválido. Entonces, para validar este cambio, debe llamar explícitamente revalidate().

invalidate(): Esto es algo que nunca he usado, por lo que puede que no haya mucha información que pueda proporcionar al respecto. Pero parece que los escenarios presentados anteriormente pueden dar una pista de lo que sucede al usar invalidate().

cOw nIcE
fuente
1
Creo que invalidate()es útil cuando está actualizando varios componentes y desea marcarlos como no válidos antes de volver a calcular finalmente el diseño con revalidate()o validate().
Qix - MONICA FUE MALTRATADA
1
@Qix: En mi humilde opinión, no es necesario llamar a invalidate () ya que se llama automáticamente. Además, revalidate () en sí mismo hará esa tarea (como se indica en Java Docs, actúa como el método conveniente para llamar a ambos invalidate ()y validate ()).
nIcE cOw