2017-09-24 2 views
0

Ich möchte mein JLabel nach 1 Sekunde ändern, aber es scheint, dass Java nur den neuesten Text anzeigt.Wie kann ich JLabel nach einer gewissen Zeit ändern?

Hier ist mein 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"); 
     } 
    } 
}); 

Was ich will: Anzeige "WAITING" -> 1s -> Anzeige "zu groß"

Was es tut: test.gif

Wie könnte ich repariere das?

Vielen Dank.

Sprache: Java
JRE: jre1.8.0_144
IDE Eclipse Oxygen Mitteilung (4.7.0)
weiter verwenden: Schaukel Designer -> Anwendungsfenster

Antwort

1

Rufen Sie nicht Thread.sleep auf der Schaukel Veranstaltung Thread, da dies die gesamte GUI-Anwendung in den Ruhezustand versetzt, was sie nutzlos macht. Suchen Sie stattdessen nach Swing Timer tutorial (siehe Link) und verwenden Sie einen Swing Timer. Der Timer verwendet eine Schleife und einen Aufruf, um in einem Hintergrundthread und hinter den Kulissen zu schlafen, wodurch der Swing-Ereignisthread (bekannt als Event Dispatch Thread oder EDT) weiter ausgeführt werden kann und seine wichtigen Funktionen ausführen kann Zeichnen Sie die Änderungen an Ihrer GUI.

Andere Probleme: Sie scheinen zu versuchen, Text zu verdoppeln und dann mit einem anderen doppelten Wert zu vergleichen, indem Sie == verwenden. Seien Sie vorsichtig, wenn Sie dies tun, da Doppelpunkte nicht wie Intakte sind und == aufgrund der ungenauen Art, dass digitale Computer Fließkommawerte halten, ausfallen können. Verwenden Sie stattdessen einen anderen Test der Gleichheit "fast" oder "nahe genug".

Bitte sehen: Why can't we use '==' to compare two float or double numbers

Etwas wie:

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

denke ich, es sein sollte: 'if (Math.abs (num - Antwort)> EPSILON)' –

-2

Unmittelbar nach dem "zu groß" angezeigt wird, können Sie es zu "WAITING" ändern zurück.

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

die letzte Zeile löschen und du bist gut.

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

Ihre Antwort ignoriert nach wie vor das Hauptproblem - das auf dem Schwingen Ereignis Faden treten, es unbrauchbar wird. –

+0

@DontKnowMuchButGettingBetter ist wahr, aber das OP hat nicht angegeben, dass das Schlafen im Ereignis-Thread Probleme verursacht, also habe ich nur die Frage beantwortet, die gestellt wurde. Plus Sie haben es bereits darauf hingewiesen. –

+0

1) Der Sleep wird von einem ActionListener aufgerufen, so dass es garantiert auf dem EDT aufgerufen wird. 2) Wenn Sie Ihren Swing kennen, wissen Sie bereits, dass dies schwerwiegende Probleme für das OP verursacht und seine GUI komplett sperren wird. Es ist eine Tatsache, dass dies ein ernstes Problem ist und daher nicht in Antworten propagiert werden sollte, da das OP nicht besser weiß - aber ** Sie ** tun. Bitte korrigieren Sie dies, damit ich meine Down-Vote entfernen kann. –

Verwandte Themen