【问题标题】:Stopwatch. Counting seconds. javafx跑表。数秒。 javafx
【发布时间】:2016-08-02 10:16:42
【问题描述】:

我想做一个秒表(时:分:秒),我想我应该按以下方式来做。变量结果将传递给我的TextFieldstartTime 将是我们启动秒表的时间,传递的时间将是当前时间(常量)

result=startTime-elapsedTime;

但我不知道要使用哪个日期类,也不知道如何重复。

result=startTime-elapsedTime; 每秒更新一次 TextField。

欢迎所有建议。

【问题讨论】:

  • 既然你只是在征求建议,我觉得它太宽泛了。您应该针对特定问题编辑您的问题,届时我们可以提供帮助。

标签: java javafx stopwatch


【解决方案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();
    }

编辑:

根据 cmets,这是使用 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);
    }
}

【讨论】:

  • @mipa 我的理解是,虽然我承认我没有检查过这一点,但实际上它的工作方式与AnimationTimer 基本相同;即在每个脉冲上,对于每个正在运行的动画,都会计算动画中的当前帧时间并更新动画的状态。因此,任何小错误都不会累积。不过,我还没有检查过,我同意AnimationTimer 更适合这里。
  • 我只是认为依靠未经证实的关于时间线的稳定性和正确性的假设并不是一个好主意,如果可以在很长时间内实现同样的目的,这并不是真正为此目的而设计的。使用 AnimationTimer 更直接和可预测的方式。
【解决方案2】:

看看 AnimationTimer 类。您必须提供一种方法,然后以大约 60 Hz 的频率自动调用该方法。在那里您可以进行 GUI 的计算和更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2020-12-07
    • 2020-06-21
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多