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?

195
demandé sur Ben 2009-07-08 14:58:31

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.

148
répondu kdgregory 2015-09-08 13:46:08

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.

81
répondu Noel Grandin 2010-02-10 12:46:27

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.

56
répondu akf 2009-07-08 11:44:51

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é.

2
répondu Antony Ng 2018-03-08 19:25:13

Oui, vous devez appeler repeindre(); revalider(); lorsque vous appelez removeAll() ensuite, vous devez appeler repaint() et revalidate()

-4
répondu Som Adhikari 2016-07-05 10:35:15