2016-08-02 64 views
0

我想製作一個秒錶(小時:分鐘:秒),並且我認爲我應該按照以下方式來做。變量的結果將被傳遞到我在我們開始秒錶TextFieldstartTime將是時間,時間的流逝將當前時間(常量)秒錶。數秒。 javafx

result=startTime-elapsedTime; 

但我不知道該用哪個日期類我也不知道如何重複這個。

result=startTime-elapsedTime;每秒鐘爲了更新TextField。

歡迎您提出任何建議。

+1

由於你只是在尋求對我而言過於寬泛的建議。您應該編輯具體問題的問題,那時我們可以提供幫助。 – Andrej

回答

0

看看AnimationTimer類。您必須提供一種方法,然後以大約60 Hz的頻率自動調用。在那裏你可以做你的計算和GUI的更新。

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); 
    } 
} 
+0

我想知道這將是多麼準確。 – mipa

+0

@mipa我的理解,雖然我承認我沒有檢查過這個,但是在底層,這和'AnimationTimer'基本上是一樣的。即在每個脈衝上,對於每個正在運行的動畫,計算動畫中的當前幀時間並且更新動畫的狀態。因此任何小錯誤都不會累積。再次,雖然,我沒有檢查,我同意'AnimationTimer'在這裏更合適。 –

+0

我只是認爲依賴未經證實的關於時間線的穩定性和正確性的假設並不是一個好主意,如果能夠以更直接和更可預測的方式實現同​​樣的效果,一個AnimationTimer。 – mipa