2016-08-02 5 views
0

私はストップウォッチ(時間:分:秒)を作りたいと思っていました。変数の結果は、我々はストップウォッチを開始した私のTextFieldstartTimeがされる時に渡され、渡された時刻が現在時刻になります(のconst。)ストップウォッチ。秒を数える。 javafx

result=startTime-elapsedTime; 

しかし、私が使用する日付クラス分からないと私はこれを繰り返す方法も知らない。

result=startTime-elapsedTime; TextFieldを更新するために毎秒

すべての提案を歓迎します。

+1

ので、あまりにも広いと私に見える提案を求めているだけです。あなたは特定の問題で質問を編集し、その時点で私たちが助けることができます。 – Andrej

答えて

0

AnimationTimerクラスをご覧ください。あなたは約60 Hzで自動的に呼び出されるメソッドを提供する必要があります。そこで、GUIの計算と更新を行うことができます。

あなたの TextFieldを更新する TimeLineアニメーションを使用することができます
1

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

タイムラインの安定性と修正についての未確認の仮定に頼るのは良い考えではないと思っていました。これは実際にこの目的のために作られたものではありません。アニメーションタイマー。 – mipa

関連する問題