我正在使用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。我试图寻找可能的解决方案,但似乎无法解决此问题。任何帮助表示赞赏。谢谢!
答案 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:00
到0: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()
。