我正在创建20-minute countdown timer application。我为实现此目的而编写的逻辑在总体上应该是这样工作的:
1)按下按钮后,应用程序线程中的播放按钮ActionEvent将运行。
2)然后,计时器在CountdownTimer.java中的while循环中运行,直到达到00:00:00(分钟,秒,厘秒)为止。每个循环都应在适当的时间更新JavaFX计时器标签。
问题:
单击播放按钮时,应用程序UI冻结(Apple彩虹轮旋转直到计时器结束)。但是,当我单击“播放”按钮时,计时器的时间会在IDE控制台中打印出来。我只想用在控制台中成功打印的时间刷新JavaFX标签。
控制台中显示的内容:
我尝试过的事情:
我已经使用了Timer和TimerTask,Platform.runLater(Runnable runnable),Task和Thread类,以使我的timerLabel达到我希望的工作方式,但是由于以下原因,我的实现均未起作用这些课程是我的新手技能。
我应该如何实现当前代码,以便实际上更新JavaFX标签?
我的代码:
应用程序线程中的播放按钮代码:
// create twenty minute Countdown timer minutes:seconds:milliseconds
CountdownTimer timer = new CountdownTimer();
// create label for our countdown timer
timerLabel = new Label("20:00:00");
timerLabel.setFont(new Font(30));
timerLabel.setTextFill(Color.BLACK);
timerLabel.setMinSize(200, 35);
timerLabel.setMaxSize(200, 35);
playBtn.setOnAction(e -> {
timer.runTimer();
});
CountdownTimer.java中的计时器代码:
public class CountdownTimer {
private int minutes;
private int seconds;
private int milliseconds;
public CountdownTimer() {
this.minutes = 19;
this.seconds = 59;
this.milliseconds = 99;
}
public void runTimer() {
while (true) {
Application.timerLabel.setText(minutes + ":" + seconds + ":" + milliseconds);
if (minutes < 10) {
System.out.println("0" + minutes + ":" + seconds + ":" + milliseconds);
} if (seconds < 10) {
System.out.println(minutes + ":" + "0" + seconds + ":" + milliseconds);
} if (milliseconds < 10) {
System.out.println(minutes + ":" + seconds + ":" + "0" + milliseconds);
} else {
System.out.println(minutes + ":" + seconds + ":" + milliseconds);
}
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
Logger.getLogger(CountdownTimer.class.getName()).log(Level.SEVERE, null, ex);
}
if (seconds > 0 && milliseconds == 0) {
seconds--;
milliseconds = 100;
}
if (milliseconds > 0) {
milliseconds--;
} else {
milliseconds = 100;
milliseconds--;
seconds = 59;
minutes--;
}
if (minutes == 0 && seconds == 0 && milliseconds == 0) {
Application.timerLabel.setText("00:00:00");
System.out.println("00:00:00");
break;
}
}
}
}