Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen

Java4win

Aktives Mitglied
Hey,
ich habe es bisher so versucht jedoch kommen sich die Threads anscheinend in die Quere.
Oder kann mir jemand erklären, warum dies nicht funktioniert?
Besten dank im Voraus.

Java:
    Label menuTimer = new Label();
        AnchorPane.setTopAnchor(menuTimer, 10.0);
        AnchorPane.setRightAnchor(menuTimer, 10.0);
        topAnchorPane.getChildren().add(menuTimer);
        DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                menuTimer.setText(formatter.format(new Date()));
            }
           
        }, 0, 500);

Der Error "Not on FX application thread; currentThread = Timer-0" kommt.
Ich dachte bei Timer wird prinzipiell ein neuer Thread erstellt und ich weiß nicht, was er für ein Problem damit hat...
 
Alle GUI Veränderungen müssen im JavaFX Thread geschehen. Versuchs mal mit Platform.runLater(()-> gui code here) ;
 
Alle GUI Veränderungen müssen im JavaFX Thread geschehen. Versuchs mal mit Platform.runLater(()-> gui code here) ;
hey Robat,
jetzt ist zwar die Fehlermeldung weg, jedoch wird die Zeit in der GUI auch nicht aktualisiert und friert ab dem Zeitpunkt ein, wenn die GUI sich öffnet.

Was ist die Begründung von den Entwicklern, dass alle Veränderungen im JavaFX Thread geschehen müssen ?
 
Ich wollte auch einmal einen Button haben welcher sich bewegt.
Java:
    Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            double currentValue = 0;
            @Override
            public void run() {
                currentValue += 0.5;
                AnchorPane.clearConstraints(button);
                AnchorPane.setTopAnchor(button, 10.0);
                AnchorPane.setLeftAnchor(button,currentValue);
            }
           
        }, 0, 3);

und da habe ich doch theoretisch auch durch ein neuen Thread etwas an der GUI verändert und das Ganze hat prima funktioniert.
 
Was ist die Begründung von den Entwicklern, dass alle Veränderungen im JavaFX Thread geschehen müssen
Warum es diese EDTs gibt, kannst du nachlesen. Das ist zwar anhand Swing beschrieben, die Begründung lässt sich aber auch auf JavaFX anwenden.

etzt ist zwar die Fehlermeldung weg, jedoch wird die Zeit in der GUI auch nicht aktualisiert und friert ab dem Zeitpunkt ein, wenn die GUI sich öffnet
Kann ich nicht nachvollziehen. Der Code sollte problemlos funktionieren.
Java:
Label lblTimer = new Label();
DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        Platform.runLater(() -> lblTimer.setText(formatter.format(new Date())));
    }
}, 0, 500);
Solltest du dennoch eine alternative suchen, würde ich dir JavaFX Timeline empfehlen.
Java:
Timeline timeline = new Timeline(
        new KeyFrame(Duration.seconds(1), 
        e -> lblTimer.setText(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")))));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.playFromStart();
 

Zurück
Oben