2016-08-02 34 views
0

Ich möchte eine Stoppuhr (Stunden: Minuten: Sekunden) machen, und ich dachte, ich sollte es auf die folgende Weise tun. Variable Ergebnis wird in meine TextField weitergegeben wird, wird startTime Zeit sein, an den wir die Stoppuhr gestartet und verstrichene Zeit wird die aktuelle Zeit (konst.)Stoppuhr. Sekunden zählen. javafx

result=startTime-elapsedTime; 

Aber ich weiß nicht, welches Datum Klasse zu verwenden und Ich weiß auch nicht, wie ich das wiederholen soll.

result=startTime-elapsedTime; jede Sekunde, um TextField zu aktualisieren.

alle Vorschläge sind willkommen.

+1

Seit Du fragst nur nach Vorschlägen, die mir zu breit erscheinen. Sie sollten Ihre Frage mit einem bestimmten Problem bearbeiten und an dieser Stelle können wir Ihnen helfen. – Andrej

Antwort

0

Werfen Sie einen Blick auf die AnimationTimer-Klasse. Sie müssen eine Methode angeben, die dann automatisch bei ca. 60 Hz aufgerufen wird. Dort können Sie die GUI berechnen und aktualisieren.

1

Sie können eine TimeLine Animation verwenden, um Ihre TextField zu aktualisieren:

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:

Nach den Kommentaren, hier ist eine Lösung unter Verwendung eines 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

Ich frage mich, wie genau das wäre. – mipa

+0

@mipa Mein Verständnis, obwohl ich zugeben muss, dass ich das nicht überprüft habe, ist, dass dies unter der Haube im Wesentlichen genauso funktioniert wie der 'AnimationTimer'; bei jedem Impuls wird für jede laufende Animation die aktuelle Rahmenzeit in der Animation berechnet und der Zustand der Animation aktualisiert. Somit würden sich keine kleinen Fehler ansammeln. Auch hier habe ich nicht nachgesehen und stimme zu, dass ein 'AnimationTimer' hier besser passt. –

+0

Ich dachte nur, dass es keine gute Idee ist, sich auf unbewiesene Annahmen über die Stabilität und Korrektheit einer Timeline zu verlassen, die nicht wirklich für diesen Zweck gemacht wurde, wenn das auf eine viel geradlinigere und vorhersehbare Art und Weise erreicht werden kann ein AnimationTimer. – mipa