Maison >Java >javaDidacticiel >Pourquoi mon TextField ne clignote-t-il qu'une seule fois ? (Problème de Swing Timer et ActionListener)

Pourquoi mon TextField ne clignote-t-il qu'une seule fois ? (Problème de Swing Timer et ActionListener)

DDD
DDDoriginal
2024-10-29 08:43:30227parcourir

 Why Is My TextField Flashing Only Once? (Swing Timer and ActionListener Issue)

Gestion des problèmes : comportement du flash dans une minuterie Swing

Dans le code Java fourni, une minuterie est configurée avec un ActionListener pour mettre à jour l'arrière-plan couleur d'un champ de texte dans une séquence alternée. Bien que la minuterie déclenche l'ActionListener de manière appropriée, le changement de couleur n'est observé que lors de l'itération initiale.

Cause fondamentale

Votre erreur principale réside dans l'implémentation personnalisée de votre ActionListener . Plus précisément, les deux problèmes suivants entravent le bon fonctionnement :

  1. Affectation de la variable 'flasher' : Le code n'initialise pas la variable 'flasher', il fonctionne donc avec un value.
  2. Manque de mise à jour de l'interface graphique : Les composants Swing doivent être mis à jour dans le fil de répartition d'événement (EDT). Sans cela, les éléments de l'écran risquent de ne pas refléter les modifications souhaitées.

Résolution

Mettez en œuvre les modifications suivantes :

  1. Initialisation de 'flasher' : Inclure un flasher booléen privé = false ; en haut de la classe Flash pour initialiser la variable flasher.
  2. Mise à jour de l'interface graphique dans EDT : Dans la méthode actionPerformed, invoquez SwingUtilities.invokeLater() pour placer le changement de couleur dans l'EDT. Mettez à jour le code comme suit :
<code class="java">@Override
public void actionPerformed(ActionEvent evt)
{
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            if (flasher)
            {
                SpreademPanel.historyPnl.NameTxt.setBackground(Color.white);
            }
            else
            {
                SpreademPanel.historyPnl.NameTxt.setBackground(Color.pink);
            }
            flasher = !flasher;
        }
    });
} //actionPerformed</code>

En appliquant ces modifications, le minuteur mettra désormais à jour efficacement la couleur d'arrière-plan du champ de texte de manière continue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn