无法在JavaFx中实现倒数计时器

时间:2019-01-05 07:28:46

标签: java javafx

我正在使用JavaFx的动画框架来构建一个计时器,该计时器将从25分钟开始倒计时。

现在,我的代码从25分钟开始倒计时,但没有每秒更新或设置Label动画。到目前为止,这是我尝试过的:

这是事件处理程序,它在单击按钮时开始倒计时

public class CountdownActionEvent implements EventHandler<ActionEvent> {

private Timer defaultTime;
private Label timer;
private Timeline animation;
private int minutes;
private int seconds;

public CountdownActionEvent(Timer timer, Label label) {
    this.defaultTime = timer;
    this.timer = label;
}

private void CountDown() {

    for (this.minutes = 25; minutes >= 0; minutes--) {
        for (this.seconds = 59; seconds >= 0; seconds--) {
            this.defaultTime.setMinutes(minutes);
            this.defaultTime.setSeconds(seconds);
            timer.setText(defaultTime.toString());
        }
    }

}

@Override
public void handle(ActionEvent event) {
    // TODO Auto-generated method stub

    animation = new Timeline(new KeyFrame(Duration.seconds(1), e -> CountDown()));
    animation.setCycleCount(Timeline.INDEFINITE);
    animation.play();

}
}

这也是分配给“ defaultTime”对象的Timer类:

public class Timer {

private String minutes;
private String seconds;

public Timer() {
    this.minutes = "25";
    this.seconds = "00";
}

public String getMinutes() {
    return this.minutes;
}

public String getSeconds() {
    return this.seconds;
}

public void setMinutes(int min) {
    if (min < 10) {
        this.minutes = "0" + min;
    } else {
        this.minutes = min + "";
    }
}

public void setSeconds(int sec) {
    if (sec < 10) {
        this.seconds = "0" + sec;
    } else {
        this.seconds = sec + "";
    }
}

public String toString() {
    return this.minutes + ":" + this.seconds;
}

}

当我运行此程序时,标签“计时器”在按下按钮时立即更新为0。我试图寻找可能的解决方案,但似乎无法解决此问题。任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

此代码:

animation = new Timeline(new KeyFrame(Duration.seconds(1), e -> CountDown()));
animation.setCycleCount(Timeline.INDEFINITE);
animation.play();

调用此方法 1

private void CountDown() {

    for (this.minutes = 25; minutes >= 0; minutes--) {
        for (this.seconds = 59; seconds >= 0; seconds--) {
            this.defaultTime.setMinutes(minutes);
            this.defaultTime.setSeconds(seconds);
            timer.setText(defaultTime.toString());
        }
    }

}

每秒一次。

但是,for循环将时间重置为25分钟,并在每次调用0 时递减到CountDown()分钟。倒计时没有延迟。计时器每隔一秒钟就会从25变为0,这与计算机执行代码所需的时间一样快。由于这种情况发生的速度以及JavaFX延迟渲染的使用,您只会看到Label文本从25:000:00

您要做的是每次调用1时,将秒数减少CountDown()。如果秒数为0,则将分钟数减少1,并将秒数重置为59。类似于以下内容:

private void countDown() {
    if (seconds == 0) {
        minutes--;
        seconds = 59;
    } else {
        seconds--;
    }
    defaultTime.setMinutes(minutes);
    defaultTime.setSeconds(seconds);
    timer.setText(defaultTime.toString());
}

倒计时完成后,别忘了停止动画。


1。遵循正确的Java命名约定,该方法应命名为countDown()