Search code examples
javaanimationjavafxpause

JavaFX: pause until animation finishes


I have a basic javafx program where a rectangle, simulating an elevator, must move up and down at the push of 'up' and 'down' buttons. I have successfully implemented the code to do this below:

public void handle(ActionEvent event) {
    if (event.getSource() == upButton) {
        //this should all be put into a 'slideNode' method
        TranslateTransition translateTransition1 = new TranslateTransition(Duration.millis(500), theElevator);
        translateTransition1.setByX(0);
        translateTransition1.setByY(-50);
        translateTransition1.setCycleCount(1);
        translateTransition1.setAutoReverse(false);
        translateTransition1.play();
    }
}

The issue I need to solve is what happens when the elevator is partway through this motion and the button is pressed again - the elevator doesn't get the full motion it would have if I waited until it reached its first destination to press the button again!

I understand why this happens, but I'd like to know if there's a way to solve this. I imagine there should be some piece of the API similar to the following, which I can toss at the end of my code:

Pause pause = new Pause(Duration.millis(500));
pause.pause();

Does such a thing exist? How would you solve my problem?


Solution

  • You can disable the button while the TranslateTransition is playing:

    public void handle(ActionEvent event) {
        if (event.getSource() == upButton) {
            //this should all be put into a 'slideNode' method
            TranslateTransition translateTransition1 = new TranslateTransition(Duration.millis(500), theElevator);
            translateTransition1.setByX(0);
            translateTransition1.setByY(-50);
            translateTransition1.setCycleCount(1);
            translateTransition1.setAutoReverse(false);
            translateTransition.statusProperty().addListener((obs, oldStatus, newStatus) -> 
                button.setDisable(newStatus==Animation.Status.RUNNING));
            translateTransition1.play();
        }
    }