Java Swing revalidate () vs repaint ()

Je mets en place une application Swing où je souhaite souvent remplacer le contenu d’un JPanel. Pour ce faire, j’appelle removeAll() , puis ajoute mon nouveau contenu, puis appelle revalidate() .

Cependant, je trouve que l’ancien contenu est toujours visible (bien que masqué par le nouveau contenu). Si j’ajoute un appel à repaint() en plus de revalidate() , cela fonctionne comme prévu.

Je suis sûr qu’à d’autres occasions, il m’a suffi d’appeler revalidate() .

Donc, fondamentalement, ma question est la suivante: devrais-je appeler les deux fonctions et sinon, quand dois-je appeler chacune d’elles?

Vous devez appeler repaint() et revalidate() . Le premier indique à Swing qu’une zone de la fenêtre est sale (ce qui est nécessaire pour effacer l’image des anciens enfants supprimés par removeAll() ); ce dernier indique au gestionnaire de disposition de recalculer la mise en page (nécessaire lors de l’ajout de composants). Cela devrait entraîner la repeinte des enfants du panneau, mais cela ne le fera pas (voir la liste des déclencheurs de repeindre).

Sur une note plus générale: plutôt que de réutiliser le panneau d’origine, je vous recommande de créer un nouveau panneau et de le remplacer par le parent.

Chaque fois que vous faites un remove () ou un removeAll (), vous devez appeler

  validate(); repaint(); 

une fois que vous avez terminé, ajoutez () les nouveaux composants.

L’appel de validate () ou revalidate () est obligatoire lorsque vous faites un remove () – voir les javadocs pertinents.

Mes propres tests indiquent que repaint () est également nécessaire. Je ne sais pas exactement pourquoi.

revalidate est appelée sur un conteneur une fois que de nouveaux composants sont ajoutés ou anciens supprimés. Cet appel est une instruction pour indiquer au gestionnaire de disposition de réinitialiser en fonction de la nouvelle liste de composants. revalidate déclenchera un appel pour repeindre ce que le composant pense être des «régions sales». De toute évidence, toutes les régions de votre JPanel sont pas considérées comme sales par le RepaintManager .

repaint est utilisé pour dire à un composant de se repeindre. C’est souvent le cas que vous devez appeler cela pour nettoyer des conditions telles que la vôtre.

revalidate() demande juste à mettre en page le conteneur, quand vous avez simplement connu les travaux de revalidate() , cela pourrait être dû à la mise à jour des composants enfants. Dans le cas que vous avez mentionné, seuls les composants supprimés et aucune limite de composant ne sont modifiés, ce cas sans repaint() est déclenché “accidentellement” .

oui vous devez appeler repaint (); revalider (); lorsque vous appelez removeAll (), vous devez appeler repaint () et revalider ()