我想制作秒表(小时:分钟:秒),我想我应该按照以下方式进行。变量结果将传递到我的TextField
,startTime
将是我们启动秒表的时间,传递的时间将是当前时间(常量)。
result=startTime-elapsedTime;
但我不知道要使用哪个日期类,而且我不知道如何重复这个。
每秒 result=startTime-elapsedTime;
以更新TextField。
欢迎所有建议。
答案 0 :(得分:1)
您可以使用TimeLine
动画来更新TextField
:
public void startTimer() {
timeline = new Timeline(
new KeyFrame(Duration.seconds(0),
e ->advanceDuration()),
new KeyFrame(Duration.seconds(1)));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}
private void advanceDuration() {
if (seconds < 59) {
seconds++;
} else {
seconds = 0;
if (minutes < 59) {
minutes++;
}else{
minutes = 0;
hours++;
}
}
updateDisplay();
}
修改强>
根据评论,这是使用AnimationTimer
:
public class Timer extends Application {
private AnimationTimer timer;
private Label lblTime = new Label("0 .s");
private int seconds;
@Override
public void start(Stage primaryStage) {
timer = new AnimationTimer() {
private long lastTime = 0;
@Override
public void handle(long now) {
if (lastTime != 0) {
if (now > lastTime + 1_000_000_000) {
seconds++;
lblTime.setText(Integer.toString(seconds) + " .s");
lastTime = now;
}
} else {
lastTime = now;
}
}
@Override
public void stop() {
super.stop();
lastTime = 0;
seconds = 0;
}
};
Button btnStart = new Button("START");
btnStart.setOnAction(e ->
{
lblTime.setText("0 .s");
timer.start();
});
Button btnStop = new Button("STOP");
btnStop.setOnAction(e -> timer.stop());
VBox box = new VBox(16, lblTime, btnStart, btnPause);
box.setAlignment(Pos.CENTER);
primaryStage.setScene(new Scene(new StackPane(box)));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 1 :(得分:0)
看一下AnimationTimer类。您必须提供一种方法,然后以大约60 Hz的频率自动调用。在那里,您可以进行GUI的计算和更新。