Java Swing revalidate () vs repaint ()


211

Sto mettendo insieme un'applicazione Swing in cui spesso desidero sostituire i contenuti di un JPanel. Per fare questo, sto chiamando removeAll(), quindi aggiungendo il mio nuovo contenuto, quindi chiamando revalidate().

Tuttavia sto scoprendo che il vecchio contenuto è ancora effettivamente visibile (sebbene oscurato dal nuovo contenuto). Se aggiungo una chiamata repaint()in aggiunta a revalidate(), funziona come previsto.

Sono sicuro che in altre occasioni ho sperimentato che basta chiamare revalidate().

Quindi in sostanza la mia domanda è: dovrei chiamare entrambe le funzioni e, in caso contrario, quando dovrei chiamare ciascuna di esse?


6
Questo tutorial di Oracle afferma: "Richiama sempre la riverniciatura dopo la riconvalida". Non viene fornita alcuna spiegazione.
minuti

Risposte:


154

Devi chiamare repaint()e revalidate(). Il primo dice a Swing che un'area della finestra è sporca (che è necessario per cancellare l'immagine dei bambini rimossi da removeAll()); quest'ultimo dice al gestore del layout di ricalcolare il layout (che è necessario quando si aggiungono componenti). Ciò dovrebbe far ridipingere i figli del pannello, ma non far sì che il pannello stesso lo faccia (vedere questo per l'elenco dei trigger di ridisegno).

Su una nota più generale: piuttosto che riutilizzare il pannello originale, consiglierei di creare un nuovo pannello e scambiarlo con il genitore.


1
Potresti razionalizzare perché costruire un nuovo pannello sia una soluzione migliore rispetto all'utilizzo di quello vecchio? :)
Arttu,

3
@Arttu: è meno lavoro e quindi meno soggetto a errori.
kdgregory,

86

Ogni volta che si esegue un remove () o un removeAll (), è necessario chiamare

  validate();
  repaint();

dopo aver completato aggiungere () 'i nuovi componenti.

Chiamare validate () o revalidate () è obbligatorio quando si esegue un remove () - consultare i javadocs pertinenti.

I miei test indicano che è necessario anche ridipingere (). Non sono sicuro del perché.


59

revalidateviene chiamato su un contenitore una volta aggiunti nuovi componenti o rimossi quelli vecchi. questa chiamata è un'istruzione per dire al gestore del layout di ripristinare in base al nuovo elenco dei componenti. revalidateattiverà una chiamata per ridipingere ciò che il componente ritiene siano "regioni sporche". Ovviamente non tutte le regioni sul tuo JPanelsono considerate sporche dal RepaintManager.

repaintviene utilizzato per indicare a un componente di ridipingere se stesso. È spesso necessario chiamare questo per ripulire le condizioni come la tua.


5

revalidate()basta richiedere di impaginare il contenitore, quando si è verificato semplicemente il richiamo di revalidate()lavori, potrebbe essere causato dall'aggiornamento dei limiti dei componenti figlio che fa scattare repaint()quando i loro limiti vengono cambiati durante il ridimensionamento. Nel caso in cui hai citato, solo il componente è stato rimosso e nessun limite di componente viene modificato, questo caso non repaint()viene attivato "accidentalmente" .


-4

sì, devi chiamare repaint (); revalidate (); quando chiami removeAll () allora devi chiamare repaint () e revalidate ()

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.