Meine Szene besteht nur aus einer ImageView, die ein Bild anzeigt. Ich möchte das Bild auf schwarz (zugewiesene Farbe der Szene) verblassen, und dann nach einiger Zeit wieder von Schwarz auf das Bild verblassen. Ich fand die FadeTransition sehr passend für diesen Zweck. Dies ist ein Stück von meinem Code:Wie man auf einen Übergang wartet, um in javafx 2.1 zu enden?
// fade to black transition
FadeTransition ft1 = new FadeTransition(Duration.millis(2000), myImageView);
ft1.setFromValue(1.0);
ft1.setToValue(0.0);
ft1.play();
// fade from black transition
FadeTransition ft2 = new FadeTransition(Duration.millis(2000), myImageView);
ft2.setFromValue(0.0);
ft2.setToValue(1.0);
ft2.play();
Mein Problem ist, dass ft1.play()
asynchron ist, so unter dem Code wird ausgeführt starten, bevor ft1.play()
verlassen wird. Als Ergebnis sehe ich nur den zweiten Übergang. Wie kann ich warten, bis der erste Übergang beendet ist und dann den zweiten Übergang starten? Ich kann den Thread dazwischen nicht schlafen legen, weil es der Haupt-Javafx-Thread ist (versucht und nicht funktioniert).
Ich versuchte mit der onFinishedProperty() -Methode mit der Kombination von einem busy-Warten auf eine Flagge, aber ich bleibe für immer in der While-Schleife stecken. Hier ist mein Code dafür:
boolean isTransitionPlaying;
FadeTransition ft = new FadeTransition(Duration.millis(2000), iv);
ft.setFromValue(1.0);
ft.setToValue(0.0);
ft.onFinishedProperty().set(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
transitionPlaying = false;
}
});
transitionPlaying = true;
ft.play();
while (transitionPlaying == true)
{
// busy wait
System.out.println("still waiting...");
}
FadeTransition ft2 = new FadeTransition(Duration.millis(2000), iv);
ft2.setFromValue(0.0);
ft2.setToValue(1.0);
ft2.play();
Wie wird das Warten richtig gemacht? Danke
Ich denke, dass ich dachte, dass da die Übergänge play() asynchron sind, sie auf einem anderen Thread als dem JavaFX-Anwendungsthread passieren. Deshalb dachte ich, ich könnte den Haupt-Thread warten lassen, bis die Übergänge ihr Ding beendet haben und dann wieder aufgenommen werden. Jetzt sehe ich, dass, wenn der Anwendungsthread schläft, die Übergänge auch nicht verarbeitet werden können, oder? Also ich denke, die SequentialTransition ist die klarste Lösung für meinen Fall. Danke dir und Ukuk beides. – dadox