Différence entre validate (), revalidate () et invalidate () dans l'interface graphique Swing

111

Les composants Swing ont plusieurs méthodes liées aux mises à jour de la disposition de l'écran, en particulier:

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?

Mikera
la source

Réponses:

67

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

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();
        }
    }
}
StanislavL
la source
3
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.
Meo
C'est pour AWT, voici à
Meo
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().

COUPE NICE
la source
1
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 ()).
nIcE cOw