La documentation Java les définit quelque peu d'un point de vue technique, mais il n'est pas particulièrement clair comment ils sont censés être utilisés.
Quelle est la différence entre ceux-ci et dans quelles circonstances devriez-vous utiliser l'un plutôt que les autres?
invalidate()marque le conteneur comme invalide. Signifie que le contenu est en quelque sorte erroné et doit être réorganisé. Mais c'est juste une sorte de marque / drapeau. Il est possible que plusieurs conteneurs non valides doivent être 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 les valeurs appropriées par LayoutManager.
revalidate()est juste la somme des deux. Il marque le conteneur comme non valide et effectue la mise en page du conteneur.
METTRE À JOUR:
Un peu de code de Component.java
publicvoid revalidate(){
revalidateSynchronously();}/**
* Revalidates the component synchronously.
*/finalvoid 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 containerbreak;}
root = root.getContainer();}
root.validate();}}}
revalidate()n'appelle pas doLayout(), qui validate()fait. Ce n'est donc pas vraiment une somme des deux - ce revalidaten'est pas toujours un remplacement valable pour validate.
Dans ce cas, je suppose (jamais essayé) RepaintManager appellera validate
StanislavL
J'avais affaire à un vilain bogue et le remplacement de revalidate par validate (qui appelle doLayout) l'a résolu ...
Meo
Comment appeler validate () à partir d'une méthode statique?
Kunal Tyagi le
69
validate(): Dans Swing, lorsque vous créez un composant, ce n'est pas validsa propriété valide 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 validate()méthode, directement ou indirectement. Lorsque nous appelons des validate()conteneurs, il validera le conteneur (s'il n'est pas valide) en appelant sa doLayout()méthode, qui appellera généralement le LayoutManager. Désormais, chaque enfant placé sur ce conteneur sera validé de manière récursive, de sorte que l'arbre entier sera disposé et deviendra valide.
revalidate(): revalidate()doit être appelé lorsque vous modifiez un attribut qui affecterait sa largeur / hauteur et appelez repaint () lorsque vous modifiez un attribut qui affecterait son apparence. Par exemple, si votre JFramecontient un JPanel, maintenant à un certain moment vous l'avez supprimé JPanelet en avez inséré un nouveau à sa place, en fonction du contenu du nouvellement placé JPanel, de la taille des composants à l'intérieur du JPanelainsi que The CONTAINERlui-même (en vertu du gestionnaire de mise en page 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 se peut que je ne puisse pas fournir beaucoup d'informations à ce sujet. Mais il semble que les scénarios présentés ci-dessus peuvent donner un petit indice sur ce qui se passe lors de l'utilisation invalidate().
Je pense que invalidate()c'est utile lorsque vous mettez à jour plusieurs composants et que vous souhaitez les marquer comme non valides avant de recalculer finalement la mise en page avec revalidate()ou validate().
Qix - MONICA a été égaré
1
@Qix: à mon humble avis, il n'est pas nécessaire d'appeler invalidate () car il est automatiquement appelé. De plus, revalidate () lui-même fera cette tâche (comme indiqué dans la documentation Java, il agit comme la méthode pratique pour appeler à la fois invalidate ()et validate ()).
revalidate()
n'appelle pasdoLayout()
, quivalidate()
fait. Ce n'est donc pas vraiment une somme des deux - cerevalidate
n'est pas toujours un remplacement valable pourvalidate
.validate()
: Dans Swing, lorsque vous créez un composant, ce n'est pasvalid
sa propriété validefalse
. 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 leurvalidate()
méthode, directement ou indirectement. Lorsque nous appelons desvalidate()
conteneurs, il validera le conteneur (s'il n'est pas valide) en appelant sadoLayout()
méthode, qui appellera généralement leLayoutManager
. Désormais, chaque enfant placé sur ce conteneur sera validé de manière récursive, de sorte que l'arbre entier sera disposé et deviendra valide.revalidate()
:revalidate()
doit être appelé lorsque vous modifiez un attribut qui affecterait sa largeur / hauteur et appelez repaint () lorsque vous modifiez un attribut qui affecterait son apparence. Par exemple, si votreJFrame
contient unJPanel
, maintenant à un certain moment vous l'avez suppriméJPanel
et en avez inséré un nouveau à sa place, en fonction du contenu du nouvellement placéJPanel
, de la taille des composants à l'intérieur duJPanel
ainsi queThe CONTAINER
lui-même (en vertu du gestionnaire de mise en page utilisé), change. Ce qui le pousse à l'état invalide. Donc, pour valider ce changement, vous devez appeler explicitementrevalidate()
.invalidate()
: C'est quelque chose que je n'ai jamais utilisé, donc il se peut que je ne puisse pas fournir beaucoup d'informations à ce sujet. Mais il semble que les scénarios présentés ci-dessus peuvent donner un petit indice sur ce qui se passe lors de l'utilisationinvalidate()
.la source
invalidate()
c'est utile lorsque vous mettez à jour plusieurs composants et que vous souhaitez les marquer comme non valides avant de recalculer finalement la mise en page avecrevalidate()
ouvalidate()
.invalidate ()
etvalidate ()
).