package de.calette.mephisto3.util; import javafx.animation.SequentialTransition; import javafx.animation.Transition; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Node; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Helper class that ensures the sequential execution * of transitions, while additional ones might be added. */ public class TransitionQueue { private List<Transition> transitionQueue = Collections.synchronizedList(new ArrayList<Transition>()); private SequentialTransition sequentialTransition; private boolean running = false; public TransitionQueue(Node node) { sequentialTransition = new SequentialTransition(node); } public void addTransition(Transition transition) { this.transitionQueue.add(transition); } /** * Synchronized playback of the translate transitions. */ public void play() { if(running) { return; } running = true; Platform.runLater(new Runnable() { @Override public void run() { sequentialTransition.getChildren().clear(); sequentialTransition.getChildren().addAll(transitionQueue.remove(0)); sequentialTransition.setAutoReverse(false); sequentialTransition.play(); sequentialTransition.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { running = false; if(!transitionQueue.isEmpty()) { play(); } } }); } }); } }