2013-08-18 3 views
4

J'ai récemment commencé à utiliser JavaFx 2.0 et peut-être mon problème est très basique, mais actuellement je n'ai aucune idée de la façon de le résoudre. Par exemple, disons que j'ai cette petite application de démonstration appelée Clock:Timeline JavaFx - régler le délai initial

import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.HBoxBuilder; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 
import javafx.stage.WindowEvent; 
import javafx.util.Duration; 

import java.util.Date; 

public class ClockDemo extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     final Label label = new Label(new Date().toString()); 
     label.setFont(new Font("Arial", 18)); 
     final Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(5), new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent actionEvent) { 
       label.setText(new Date().toString()); 
      } 
     })); 
     timeline.setCycleCount(Timeline.INDEFINITE); 

     Button button = new Button("Start"); 
     button.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent actionEvent) { 
       timeline.play(); 
      } 
     }); 

     stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
      @Override 
      public void handle(WindowEvent windowEvent) { 
       timeline.stop(); 
      } 
     }); 
     HBox hBox = HBoxBuilder.create() 
       .spacing(5.0) 
       .padding(new Insets(5, 5, 5, 5)) 
       .children(label, button) 
       .build(); 

     Scene scene = new Scene(hBox, 330, 30); 
     stage.setScene(scene); 
     stage.setTitle("Clock demo"); 
     stage.show(); 
    } 
} 

Fondamentalement, si vous cliquez sur le bouton de démarrage, Timeline mettra à jour en temps Label toutes les 5 secondes. Mais le problème auquel je suis confronté est que lorsque je clique sur le bouton de démarrage, je dois attendre 5 secondes jusqu'à ce que Timeline commence à courir et mette à jour l'heure en Label. Donc, y a-t-il un moyen d'éliminer ce délai initial? Merci d'avance.

Répondre

8

J'ai eu un même problème et je l'ai résolu en ajoutant un KeyFrame avec le Duration.ZERO au début de timeline et ajouter mon action à elle et la deuxième KeyFrame est responsable du retard.

final Timeline timeline = new Timeline(new KeyFrame(Duration.ZERO, new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent actionEvent) { 
        label.setText(new Date().toString()); 
       } 
      }) , new KeyFrame(Duration.seconds(5))); 
+0

Yep, qui résout le problème. Merci beaucoup. –

0

Vous pouvez transférer la ligne de temps en sautant à seulement (1 ms, si la précision est pas si important) avant de keyframe connexes:

timeline.playFrom(Duration.millis(4999)); 
Questions connexes