Using showAndWait in the onFinished EventHandler of an Animation doesn't work

浪尽此生 提交于 2019-12-12 11:14:39

问题


In JavaFx, I want to show a modal dialog after an animation ends. For some reason, calling showAndWait in the EventHandler that gets executed after the animation ends doesn't work. A new window is shown, but it seems like nothing is drawn inside it.

This example demonstrates the issue:

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();
}

The full code can be found at https://gist.github.com/bmesuere/9605866

I'd like to know why this doesn't work (on my macbook using java 1.7.0_51) and get suggestions for a workaround.


回答1:


It seems to work if you wrap the code to show the stage in a 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();                        
                    }
                });

            }
        });

No idea why. It fails on Java FX 8 too.




回答2:


I have reported this as a bug in JavaFX (Jira issue).

A comment from that issue:

The problem is that no subsequent pulse is scheduled when showAndWait() is called while pulse is being processed.

This was 'fixed' in Java 8u20. An exception is now thrown. Changes can be seen here.



来源:https://stackoverflow.com/questions/22463004/using-showandwait-in-the-onfinished-eventhandler-of-an-animation-doesnt-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!