Differenza tra validate (), revalidate () e invalidate () in Swing GUI


111

I componenti Swing hanno più metodi relativi agli aggiornamenti del layout dello schermo, in particolare:

La documentazione Java le definisce in qualche modo da una prospettiva tecnica, ma non è particolarmente chiaro come debbano essere utilizzate.

Qual è la differenza tra questi e in quali circostanze dovresti usarne uno piuttosto che gli altri?

Risposte:


67

invalidate()contrassegna il contenitore come non valido. Significa che il contenuto è in qualche modo sbagliato e deve essere riordinato. Ma è solo una specie di marchio / bandiera. È possibile che più contenitori non validi debbano essere aggiornati in un secondo momento.

validate()esegue il relayout. Significa che viene richiesto contenuto non valido per tutte le dimensioni e tutte le dimensioni dei sottocomponenti vengono impostate sui valori corretti da LayoutManager.

revalidate()è solo la somma di entrambi. Contrassegna il contenitore come non valido ed esegue il layout del contenitore.

AGGIORNARE:

Un po 'di codice da 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();
        }
    }
}

3
revalidate()non chiama doLayout(), che validate()fa. Quindi non è realmente una somma di entrambi - revalidatenon è sempre un valido sostituto di validate.
Meo

Questo è per AWT, ecco come appare il revalidate
Meo

In questo caso immagino (mai provato) RepaintManager chiamerà validate
StanislavL

Avevo a che fare con un brutto bug e la sostituzione di revalidate con validate (che chiama doLayout) lo ha risolto ...
Meo

Come possiamo chiamare validate () da un metodo statico?
Kunal Tyagi

69

validate(): In Swing, quando crei un componente, non lo è, validovvero la sua proprietà valida lo è false. Si dice che un componente sia valido, quando la sua larghezza, altezza, posizione e cose sono state determinate. Questo di solito viene fatto chiamando il loro validate()metodo, direttamente o indirettamente. Quando chiamiamo validate()contenitori, convaliderà il contenitore (se non è valido) chiamando il suo doLayout()metodo, che in genere richiamerà il LayoutManager. Ora ogni bambino posizionato su questo contenitore verrà convalidato in modo ricorsivo, in modo che l'intero albero sarà disposto e diventerà valido.

revalidate(): revalidate()deve essere chiamato quando si modifica un attributo che influenzerebbe la loro larghezza / altezza e si chiama repaint () quando si modifica un attributo che ne influenzerebbe l'aspetto. Ad esempio, se il tuo JFramecontiene un JPanel, ora ad un certo punto del tempo lo hai rimosso JPanele ne hai inserito uno nuovo al suo posto, a seconda del contenuto del nuovo posto JPanel, delle dimensioni dei componenti all'interno del JPanelcosì come The CONTAINERse stesso (in virtù del layout manager da esso utilizzato), modifiche. Il che lo spinge allo stato non valido. Quindi, per convalidare questa modifica, devi chiamare esplicitamente revalidate().

invalidate(): Questo è qualcosa che non ho mai usato, quindi potrebbero non esserci molte informazioni che posso fornire al riguardo. Ma sembra che gli scenari presentati sopra possano dare un piccolo suggerimento su cosa succede durante l'utilizzo invalidate().


1
Credo invalidate()sia utile quando aggiorni diversi componenti e desideri contrassegnarli come non validi prima di ricalcolare definitivamente il layout con revalidate()o validate().
Qix - MONICA ERA MALTRATTATA

1
@ Qix: IMHO, non è necessario chiamare invalidate () poiché viene chiamato automaticamente. Inoltre, revalidate () stesso eseguirà questo compito (come indicato nei documenti Java, funge da metodo conveniente per chiamare sia invalidate ()e validate ()).
nIcE cOw
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.