2017-09-24 78 views
0

我想讓我的JLabel在1秒後更改,但似乎Java只顯示最新的文本。如何在一段時間後更改JLabel?

這裏是我的代碼:

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

我想要什麼:顯示 「等待」 - > 1秒 - >顯示 「過大」

作用:test.gif

我怎麼能解決這個問題?

謝謝。

語言:Java的
JRE:jre1.8.0_144
IDE:Eclipse的釋氧(4.7.0)
使用:搖擺設計師 - >應用程序窗口

回答

1

不要在Swing事件調用Thread.sleep因爲這會使整個GUI應用程序進入睡眠狀態,導致它無用。而是查看Swing Timer tutorial(檢查鏈接)並使用擺動計時器。定時器使用一個循環和一個調用來在後臺線程和幕後進入休眠狀態,允許Swing事件線程(稱爲Event Dispatch Thread或EDT)繼續運行,從而允許其執行其重要功能,包括將更改繪製到您的GUI。

其他問題:您似乎試圖解析文本以加倍,然後使用==與另一個double值進行比較。在做這件事時要小心,因爲雙打不像整數,並且==可能因數字計算機保持浮點值的不精確方式而失敗。改用「差不多」或「足夠接近」平等的不同測試。

請參閱:Why can't we use '==' to compare two float or double numbers

喜歡的東西:

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

我覺得應該是:'如果(Math.abs(NUM - 答案)> EPSILON)' –

-2

立即顯示 「過大」 後,將其改回爲 「WAITING」。

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

刪除最後一行,你是好。

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

你的回答仍然忽略了主要問題 - 即步進Swing事件線程上,使之無用的。 –

+0

@DontKnowMuchButGettingBetter true,但OP沒有聲明睡在事件線程上導致問題,所以我只回答了被問到的問題。另外你已經指出了。 –

+0

1)從ActionListener中調用睡眠,所以可以保證它在EDT上被調用,2)如果你知道你的Swing,你已經知道這會給OP帶來嚴重的問題,並且會完全鎖定他的GUI。這是一個給定的,這是一個嚴重的問題,所以不應該傳播的答案,因爲OP不知道更好 - 但你**做。請糾正這一點,以便我可以刪除我的倒票。 –