Java Swing revalidate () vs repeindre()
Je mets en place une application Swing où je veux souvent remplacer le contenu D'un JPanel. Pour ce faire, j'appelle removeAll()
, puis j'ajoute mon nouveau contenu, puis j'appelle revalidate()
.
Cependant, je trouve que l'ancien contenu est toujours visible (bien qu'obscurci par le nouveau contenu). Si j'ajoute un appel à repaint()
en plus de revalidate()
, il fonctionne comme prévu.
Je suis sûr qu'à d'autres occasions, j'ai fait l'expérience que le simple fait d'appeler revalidate()
suffit.
Donc fondamentalement mon la question est: dois - je besoin d'appeler les deux fonctions et si non, quand devrais-je appeler chacun d'entre eux?
5 réponses
, 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()
); le second indique au gestionnaire de mise en page de recalculer la mise en page (ce qui est nécessaire lors de l'ajout de composants). Cela devrait provoquerchildren du panneau à repeindre, mais peut ne pas provoquer le panneau lui-même de le faire (voir this pour la liste des déclencheurs de repeindre).
Sur une note plus générale: plutôt que en réutilisant le panneau d'origine, je recommande de construire un nouveau panneau et de les échanger au parent.
Chaque fois que vous faites un remove () ou un removeAll (), vous devez appeler
validate();
repaint();
Après avoir terminé add () ' ing les nouveaux composants.
L'appel de validate () ou revalidate () est obligatoire lorsque vous effectuez 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é sur un conteneur, une fois que les nouveaux composants sont ajoutés ou supprimés. cet appel est une instruction pour indiquer au gestionnaire de mise en page de réinitialiser en fonction de la liste des nouveaux composants. revalidate
déclenchera un appel pour repeindre ce que le composant pense être des "régions sales".'Évidemment, toutes les régions de votre JPanel
ne sont pas considérées comme sales par le RepaintManager
.
repaint
est utilisé pour dire à un composant de se repeindre. Il est souvent le cas que vous devez appeler ceci afin de conditions de nettoyage comme le vôtre.
revalidate()
Il suffit de demander à la mise en page du conteneur, lorsque vous avez simplement appelé revalidate()
fonctionne, cela pourrait être causé par la mise à jour des limites des composants enfants déclenche le repaint()
lorsque leurs limites sont modifiées lors de la re-mise en page. Dans le cas que vous avez mentionné, seul le composant supprimé et aucune limite de Composant n'est modifiée, ce cas no repaint()
est"accidentellement" déclenché.
Oui, vous devez appeler repeindre(); revalider(); lorsque vous appelez removeAll() ensuite, vous devez appeler repaint() et revalidate()