暂停JavaFX程序,直到过渡完成为止

时间:2020-10-05 15:09:00

标签: java multithreading javafx translate-animation

我正在制作一个JavaFX程序,该程序使用多个TranslateTransitionNode上移动多个Pane。我希望程序在转换完成之前停止执行。

import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Stack Overflow MRE");
        Pane root = new Pane();

        Rectangle rect1 = new Rectangle(25, 100, Color.AQUA);
        rect1.setX(10);
        rect1.setY(10);

        Rectangle rect2 = new Rectangle(25, 100, Color.BISQUE);
        rect2.setX(465);
        rect2.setY(10);

        root.getChildren().addAll(rect1, rect2);
        primaryStage.setScene(new Scene(root, 500, 500));
        primaryStage.show();
        for (int i = 0; i < 10; i++) {
            if (i == 0) {
                TranslateTransition translateRect1 = new TranslateTransition();
                translateRect1.setNode(rect1);
                translateRect1.setAutoReverse(true);
                translateRect1.setCycleCount(1);
                translateRect1.setToY(350);
                translateRect1.setDuration(Duration.millis(5000));
                translateRect1.play();

                TranslateTransition translateRect2 = new TranslateTransition();
                translateRect2.setNode(rect2);
                translateRect2.setAutoReverse(true);
                translateRect2.setCycleCount(1);
                translateRect2.setToY(350);
                translateRect2.setDuration(Duration.millis(5000));
                translateRect2.play();
            }
            // The loop will continue iterating while the above transitions are still running
            // I need the loop to pause until they complete
            System.out.printf("The current iteration is %s\n", i);
        }
    }

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

在上面的代码示例中,两个过渡同时发生,这正是我想要的,但是循环在过渡完成之前继续进行。我希望循环暂停直到转换完成,然后再进行下一个迭代。在继续进行其余代码之前,我将如何让该程序首先完成过渡?

1 个答案:

答案 0 :(得分:2)

只需使用onFinished处理程序进行过渡,之后您便希望代码得以执行,例如

    TranslateTransition translateRect2 = new TranslateTransition();
    translateRect2.setNode(rect2);
    translateRect2.setAutoReverse(true);
    translateRect2.setCycleCount(1);
    translateRect2.setToY(350);
    translateRect2.setDuration(Duration.millis(5000));

    translateRect2.setOnFinished(e -> {
        System.out.println("Testing timing of output");
    });

    translateRect2.play();

    // This line prints while the above transitions are still running
    // System.out.println("Testing timing of output");

已编辑问题的解决方案基本上是相同的:以显而易见的方式对其进行重构,以便要在转换后运行的代码在onFinished处理程序中:

    TranslateTransition translateRect1 = new TranslateTransition();
    translateRect1.setNode(rect1);
    translateRect1.setAutoReverse(true);
    translateRect1.setCycleCount(1);
    translateRect1.setToY(350);
    translateRect1.setDuration(Duration.millis(5000));
    translateRect1.play();

    TranslateTransition translateRect2 = new TranslateTransition();
    translateRect2.setNode(rect2);
    translateRect2.setAutoReverse(true);
    translateRect2.setCycleCount(1);
    translateRect2.setToY(350);
    translateRect2.setDuration(Duration.millis(5000));

    translateRect2.setOnFinished(e -> {
        for (int i = 1; i < 10; i++) {
            System.out.printf("The current iteration is %s\n", i);
        }
    });

    translateRect2.play();
    System.out.printf("The current iteration is 0\n");
相关问题