Différence entre validate (), revalidate () et invalidate () dans Swing GUI

Les composants Swing ont plusieurs méthodes liées aux mises à jour de la disposition des écrans, notamment:

  • validate()
  • invalidate()
  • revalidate()

La documentation Java les définit un peu d’un sharepoint vue technique, mais la manière dont ils sont destinés à être utilisés n’est pas très claire.

Quelle est la différence entre celles-ci et dans quelles circonstances devriez-vous en utiliser une plutôt que les autres?

invalidate() marque le conteneur comme non valide. Signifie que le contenu est en quelque sorte erroné et doit être redéfini. Mais c’est juste une sorte de marque / drapeau. Il est possible que plusieurs conteneurs non valides soient actualisés ultérieurement.

validate() effectue un relais. Cela signifie qu’un contenu non valide est demandé pour toutes les tailles et que toutes les tailles des sous-composants sont définies sur des valeurs correctes par LayoutManager.

revalidate() est juste la sum des deux. Il marque le conteneur comme non valide et exécute la disposition du conteneur.

METTRE À JOUR:

Du code de Component.java

 public void revalidate() { revalidateSynchronously(); } /** * Revalidates the component synchronously. */ final void revalidateSynchronously() { synchronized (getTreeLock()) { invalidate(); Container root = getContainer(); if (root == null) { // There's no parents. Just validate itself. validate(); } else { while (!root.isValidateRoot()) { if (root.getContainer() == null) { // If there's no validate roots, we'll validate the // topmost container break; } root = root.getContainer(); } root.validate(); } } } 

validate() : Dans Swing, lorsque vous créez un composant, celui-ci n’est pas valid c’est-à-dire que sa propriété valide est false . Un composant est dit valide lorsque sa largeur, sa hauteur, son emplacement et son contenu ont été déterminés. Cela se fait généralement en appelant leur méthode validate() , directement ou indirectement. Lorsque nous appelons validate() sur des conteneurs, il validera le conteneur (s’il n’est pas valide) en appelant sa méthode doLayout() , qui invoquera généralement le LayoutManager . Maintenant, chaque enfant placé sur ce conteneur sera validé de manière récursive, de sorte que l’arbre entier sera mis en forme et deviendra valide.

revalidate() : revalidate() doit être appelé lorsque vous modifiez un atsortingbut qui affecterait leur largeur / hauteur et appelez repaint () lorsque vous modifiez un atsortingbut qui affecterait leur apparence. Par exemple, si votre JFrame contient un JPanel , maintenant, à un moment donné, vous avez supprimé ce JPanel et en JPanel inséré un nouveau à sa place, en fonction du contenu du JPanel nouvellement placé, ainsi que la taille des composants du JPanel comme The CONTAINER lui-même (en vertu du gestionnaire de disposition utilisé), change. Ce qui le pousse à l’état invalide. Donc, pour valider ce changement, vous devez appeler explicitement revalidate() .

invalidate() : C’est quelque chose que je n’ai jamais utilisé, donc il pourrait ne pas y avoir beaucoup d’informations à ce sujet. Mais il semble que les scénarios présentés ci-dessus puissent donner une idée de ce qui se passe lors de l’utilisation de invalidate() .