2017-09-24 10 views
0

Je veux que mon JLabel changer après 1 seconde, mais il semble que Java affiche uniquement le dernier texte.Comment puis-je changer JLabel après un certain temps?

Voici mon code:

btnGuess.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     try { 
      double num = Double.parseDouble(textField.getText()); 
      if (num == answer) { 
       lblResult.setText("CORRECT!"); 
      } else if (num > answer) { 
       lblResult.setText("WAITING"); 
       Thread.sleep(1000); 
       lblResult.setText("TOO LARGE"); 
       lblResult.setText("WAITING"); 
      } else { 
       lblResult.setText("WAITING"); 
       Thread.sleep(1000); 
       lblResult.setText("TOO SMALL"); 
      } 
     } catch (Exception e) { 
      lblResult.setText("Error"); 
     } 
    } 
}); 

Ce que je veux: affichage "WAITING" -> 1s -> Affichage "trop ​​grand"

Ce qu'il fait: test.gif

Comment pourrais-je répare ça?

Merci.

Langue: Java
JRE: jre1.8.0_144
IDE: Eclipse Oxygen Release (4.7.0)
USING: Designer Swing -> Fenêtre d'application

Répondre

1

Ne pas appeler Thread.sleep sur l'événement Swing thread car cela mettra l'ensemble de l'application GUI en veille rendant inutile. Au lieu de cela, recherchez le Swing Timer tutorial (vérifier le lien) et utiliser une minuterie Swing. La minuterie utilise une boucle et de continuer à courir, ce qui lui permet de remplir ses fonctions importantes d'un appel à dormir dans un fil d'arrière-plan et dans les coulisses, ce qui permet le fil d'événements de Swing (connu sous le nom thread de répartition des événements ou EDT), y compris celui de dessiner les changements à votre interface graphique.

Autres problèmes: vous semblent essayer d'analyser le texte de doubler, puis comparer avec une autre valeur double en utilisant ==. Soyez prudent lorsque vous faites cela depuis doubles ne sont pas comme ints et == peut échouer en raison de la manière que les ordinateurs numériques inexacte détiennent valeurs en virgule flottante. Utilisez plutôt un test différent d'égalité "presque" ou "proche-suffisante".

S'il vous plaît voir: Why can't we use '==' to compare two float or double numbers

Quelque chose comme:

btnGuess.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     try { 
      double num = Double.parseDouble(textField.getText()); 
      // EPSILON is a constant in the class, declared as 
      // public static final double EPSILON = 0.00001; 
      if (Math.abs(num - answer) < EPSILON) { 
       lblResult.setText("CORRECT!"); 
      } else { 
       lblResult.setText("WAITING"); 
       final String comment = num > answer ? "TOO LARGE" : "TOO SMALL"; 
       int delay = 1000; 
       Timer timer = new Timer(delay, new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         lblResult.setText(comment); 
        }; 
       }); 
       timer.setRepeats(false); 
       timer.start(); 
      } 
     } catch (Exception e1) { 
      lblResult.setText("Error"); 
     } 
    } 
}); 
+0

Je pense qu'il devrait être: 'si (Math.abs (num - réponse)> EPSILON)' –

-2

Immédiatement après l'affichage "trop ​​grand", vous changez de nouveau à "WAITING".

  lblResult.setText("WAITING"); 
      Thread.sleep(1000); 
      lblResult.setText("TOO LARGE"); 
      lblResult.setText("WAITING"); 

Supprimer cette dernière ligne et vous êtes bon.

  lblResult.setText("WAITING"); 
      Thread.sleep(1000); 
      lblResult.setText("TOO LARGE"); 
+0

Votre réponse ne tient pas toujours le principal problème - celui de marcher sur le fil de l'événement Swing, rendant inutile. –

+0

@DontKnowMuchButGettingBetter vrai, mais l'OP ne précisaient pas que dormir sur le fil des événements posait un problème, donc je viens de répondre à la question qui a été posée. De plus, vous l'avez déjà signalé. –

+0

1) le sommeil est appelé à partir d'un ActionListener, il est garanti qu'il est appelé à l'EDT, 2) si vous connaissez votre swing, vous savez déjà que cela pose de graves problèmes pour l'OP et verrouiller complètement son interface graphique. Il est un fait que c'est un problème sérieux et ne devrait donc pas se propager dans les réponses, puisque le PO ne sait pas mieux - mais ** vous ** faites. Veuillez corriger cela afin que je puisse supprimer mon vote négatif. –