web-dev-qa-db-fra.com

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

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

La documentation de Java) les définit un peu d'un point de vue technique, mais la manière dont ils sont censés être utilisés n'est pas claire.

Quelle est la différence entre ceux-ci et dans quelles circonstances devriez-vous utiliser l'un plutôt que les autres?

105
mikera

invalidate() marque le conteneur comme invalide. Signifie que le contenu est en quelque sorte faux et doit être redéfini. 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 le 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 simplement la somme des deux. Il marque le conteneur comme non valide et effectue la mise en page du conteneur.

MISE À JOUR:

Certains codes 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();
        }
    }
}
63
StanislavL

validate(): dans Swing lorsque vous créez un composant, ce 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 valide le conteneur (s'il est invalide) en appelant sa méthode doLayout(), qui appelle généralement le LayoutManager. Désormais, chaque enfant placé sur ce conteneur sera validé de manière récursive, de sorte que l’arborescence entière sera aménagée et deviendra valide.

revalidate(): revalidate() doit être appelée lorsque vous modifiez un attribut affectant leur largeur/hauteur et appelez repaint () lorsque vous modifiez un attribut affectant leur apparence. Par exemple, si votre JFrame contient un JPanel, à un moment donné, vous avez supprimé ce JPanel et en avez inséré un nouveau à sa place, en fonction du contenu de le JPanel nouvellement placé, la taille des composants à l'intérieur de JPanel ainsi que The CONTAINER lui-même (en raison du gestionnaire de disposition utilisé par celui-ci), 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 qu'il n'y ait pas beaucoup d'informations que je puisse fournir à ce sujet. Mais il semble que les scénarios présentés ci-dessus peuvent donner un indice quant à ce qui se passe lors de l'utilisation de invalidate().

65
nIcE cOw