2016-08-02 3 views
0

Я хочу сделать секундомер (часы: минуты: секунды), и я думал, что должен сделать это следующим образом. Переменный результат будет принят в мой TextField, startTime будет время, в которое мы начали секундомер, и прошел время будет текущее время (Уста.)Секундомер. Подсчет секунд. javafx

result=startTime-elapsedTime; 

Но я не знаю, какой класс даты использовать и также я не знаю, как это повторить.

result=startTime-elapsedTime; каждую секунду, чтобы обновить TextField.

все предложения приветствуются.

+1

Так как вы просто просите предложения, которые мне кажутся слишком широкими. Вы должны отредактировать свой вопрос с конкретной проблемой, и в этот момент мы можем помочь. – Andrej

ответ

0

Посмотрите на класс AnimationTimer. Вы должны предоставить метод, который затем автоматически вызывается примерно на 60 Гц. Там вы можете сделать свой расчет и обновить графический интерфейс.

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(); 
    } 

EDIT:

Согласно комментариям, здесь есть решение с использованием 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); 
    } 
} 
+0

Мне интересно, насколько это точно. – mipa

+0

@mipa Мое понимание, хотя я признаю, что не проверял это, заключается в том, что под капотом это работает по существу так же, как и «AnimationTimer»; то есть для каждого импульса для каждой запущенной анимации вычисляется текущее время кадра в анимации и обновляется состояние анимации. Таким образом, любые небольшие ошибки не накапливаются. Опять же, я не проверил, и я согласен с тем, что «AnimationTimer» лучше подходит. –

+0

Я просто подумал, что не стоит полагаться на недоказанные предположения относительно стабильности и правильности временной шкалы, которая на самом деле не сделана для этой цели, если то же самое можно достичь гораздо более прямым и предсказуемым способом с AnimationTimer. – mipa

Смежные вопросы