5

JavaFxで、アニメーション終了後にモーダルダイアログを表示したい。何らかの理由で、アニメーションの終了後に実行される EventHandler での showAndWait の呼び出しが機能しません。新しいウィンドウが表示されますが、その中には何も描かれていないようです。

この例は、問題を示しています。

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 を使用) を知り、回避策の提案を得たいと思います。

4

2 に答える 2

4

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 でも失敗します。

于 2014-03-17T19:42:41.767 に答える
1

これは JavaFX のバグ ( Jira の問題)として報告しました。

その問題からのコメント:

問題は、パルスの処理中に showAndWait() が呼び出されると、後続のパルスがスケジュールされないことです。

これは、Java 8u20 で「修正」されました。例外がスローされるようになりました。変更はこちらで確認できます。

于 2014-03-18T12:09:26.217 に答える