web-dev-qa-db-fra.com

Java Swing revalidate () vs repaint ()

Je suis en train de créer une application Swing dans laquelle 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 constate 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'en d'autres occasions, j'ai eu l'impression qu'il suffisait d'appeler revalidate().

Ma question est donc la suivante: devrais-je appeler les deux fonctions et sinon, quand devrais-je appeler chacune d’elles?

205
William

Vous devez appeler repaint() et revalidate(). Le premier indique à Swing qu’une partie de la fenêtre est sale (ce qui est nécessaire pour effacer l’image des vieux enfants supprimés par removeAll()); ce dernier demande au gestionnaire de disposition de recalculer la disposition (ce qui est nécessaire lors de l'ajout de composants). Cela devrait causer les enfants du panneau à repeindre, mais ne peut pas amener le panneau à le faire (voir this pour le liste des déclencheurs de repeinte).

Sur une note plus générale: plutôt que de réutiliser le panneau d'origine, je vous recommande de construire un nouveau panneau et de l'échanger avec le parent.

153
kdgregory

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

  validate();
  repaint();

après avoir ajouté add () 'les nouveaux composants.

L'appel de validate () ou de revalidate () est obligatoire lorsque vous effectuez une suppression () - voir les javadocs appropriés.

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

83
Noel Grandin

revalidate est appelé sur un conteneur une fois les nouveaux composants ajoutés ou les anciens supprimés. Cet appel est une instruction pour indiquer au gestionnaire de disposition de se réinitialiser en fonction de la nouvelle liste de composants. revalidate déclenchera un appel à repeindre ce que le composant considère comme 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 demander à un composant de se repeindre. Il est souvent nécessaire d'appeler cette personne pour résoudre des conditions telles que la vôtre.

58
akf

revalidate() il vous suffit de demander de mettre en forme le conteneur. Lorsque vous savez qu'il suffit d'appeler revalidate(), cela peut être dû à la mise à jour des limites des composants enfants qui déclenche la repaint() lorsque leurs limites sont modifiées pendant la lecture. -disposition. Dans le cas que vous avez mentionné, seuls les composants supprimés et aucune limite de composant ne sont modifiés. Dans ce cas, aucun repaint() n'est "accidentellement" déclenché.

3
Antony Ng