Использование showAndWait в onFinished EventHandler анимации не работает

В JavaFx я хочу показать модальное диалоговое окно после окончания анимации. По какой-то причине вызов showAndWait в EventHandler, который выполняется после окончания анимации, не работает. Отображается новое окно, но кажется, что внутри него ничего не нарисовано.

Этот пример демонстрирует проблему:

public void start(Stage primaryStage) {
    Rectangle rect = RectangleBuilder.create().width(200).height(200).fill(Color.RED).build();

    StackPane root = new StackPane();
    root.getChildren().add(rect);

    Timeline animation = new Timeline();
    animation.getKeyFrames().addAll(
            new KeyFrame(new Duration(1000),
                         new KeyValue(rect.widthProperty(), 100),
                         new KeyValue(rect.heightProperty(), 100)),
            new KeyFrame(new Duration(2000),
                         new KeyValue(rect.widthProperty(), 300),
                         new KeyValue(rect.heightProperty(), 300))
    );
    animation.setOnFinished(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent t) {
            Stage stage = new Stage();
            StackPane pane = new StackPane();
            pane.getChildren().add(new Label("Hello world"));
            stage.setScene(new Scene(pane, 100, 100));
            stage.showAndWait();
        }
    });
    animation.setCycleCount(1);

    Scene scene = new Scene(root, 300, 300);
    primaryStage.setScene(scene);
    primaryStage.show();

    animation.play();
}

Полный код можно найти по адресу https://gist.github.com/bmesuere/9605866

Я хотел бы знать, почему это не работает (на моем MacBook с использованием Java 1.7.0_51) и получить предложения для обходного пути.

2 ответа

Решение

Я сообщил об этом как об ошибке в JavaFX ( проблема Jira).

Комментарий от этой проблемы:

Проблема в том, что при вызове showAndWait() во время обработки импульса не запланирован ни один последующий импульс.

Это было "исправлено" в Java 8u20. Исключение теперь выброшено. Изменения можно увидеть здесь.

Кажется, это работает, если вы оберните код, чтобы показать сцену в Platform.runLater():

animation.setOnFinished(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent t) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        Stage stage = new Stage();
                        StackPane pane = new StackPane();
                        pane.getChildren().add(new Label("Hello world"));
                        stage.setScene(new Scene(pane, 100, 100));
                        stage.showAndWait();                        
                    }
                });

            }
        });

Понятия не имею почему. Сбой на Java FX 8 тоже.

Другие вопросы по тегам