JavaFX Heure et Date en direct


Je construis actuellement une application utilisant JavaFX avec une fonctionnalité supplémentaire qui affiche la date et l'heure actuelles dans le coin supérieur de la scène. Comme je suis nouveau sur JavaFX, je ne sais pas comment implémenter celui-ci.

J'ai essayé d'utiliser un ancien code dans swing mais j'ai eu une erreur IllegalStateException.

Voici mon code.

MainMenuController.java

@FXML private Label time;

private int minute;
private int hour;
private int second;

@FXML
public void initialize() {

    Thread clock = new Thread() {
        public void run() {
            for (;;) {
                DateFormat dateFormat = new SimpleDateFormat("hh:mm a");
                Calendar cal = Calendar.getInstance();

                second = cal.get(Calendar.SECOND);
                minute = cal.get(Calendar.MINUTE);
                hour = cal.get(Calendar.HOUR);
                //System.out.println(hour + ":" + (minute) + ":" + second);
                time.setText(hour + ":" + (minute) + ":" + second);

                try {
                    sleep(1000);
                } catch (InterruptedException ex) {
                     //...
                }
            }
        }
    };
    clock.start();
}

MainMenu.fxml

 <children>
   <Label fx:id="time" textFill="WHITE">
     <font>
       <Font name="Segoe UI Black" size="27.0" />
     </font>
   </Label>
   <Label fx:id="date" textFill="WHITE">
     <font>
       <Font name="Segoe UI Semibold" size="19.0" />
     </font>
   </Label>
 </children>

Principal.java

public class Main extends Application {

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

   @Override
   public void start(Stage primaryStage) throws Exception {
       Parent root = FXMLLoader.load(getClass().getResource("view/MainMenu.fxml"));
       primaryStage.setScene(new Scene(root,1366, 768));
       primaryStage.show();
   }
}

Comme vous remarquez, je l'ai testé en imprimant le temps en direct dans la console. Oui, ça a marché, mais l'étiquette est toujours statique.

Author: Shekhar Rai, 2017-02-22

2 answers

Je pense que vous avez besoin du thread FX UI Platform.runLater(...) pour cela, mais vous pouvez faire quelque chose comme ça en utilisant Timeline dans votre classe de contrôleur,

@FXML
public void initialize() {

    Timeline clock = new Timeline(new KeyFrame(Duration.ZERO, e -> {        
        second = LocalDateTime.now().getSecond();
        minute = LocalDateTime.now().getMinute();
        hour = LocalDateTime.now().getHour();
        time.setText(hour + ":" + (minute) + ":" + second);
    }),
         new KeyFrame(Duration.seconds(1))
    );
    clock.setCycleCount(Animation.INDEFINITE);
    clock.play();
}
 7
Author: Shekhar Rai, 2018-07-18 19:17:42

J'ai une méthode simple, cela peut vous aider

private JFXDatePicker txtDateVenteAV;
txtDateVenteAV.setValue(LocalDate.now());
 -1
Author: Samer, 2018-07-27 17:52:18