JavaFX Stage.close()没有调用我的onCloseRequest()处理程序

时间:2018-02-08 16:14:15

标签: javafx

请参阅下面的JavaFX SSCCE。从窗口的默认标题栏“X”按钮关闭主要舞台时出现打印语句。单击“关闭”按钮时不显示打印语句。当我在舞台上调用close()时,为什么不调用我的onCloseHandler?我的期望是不合理的还是JavaFX中的这个(又一个)错误?谢谢!

public class Main extends Application { 
    public static void main(String[] args) {
        launch(args);
    }   
    @Override
    public void start(Stage primaryStage) {     
        Button closeButton = new Button("Close");
        closeButton.setOnAction(e -> {          
            primaryStage.close();
        });     
        primaryStage.setOnCloseRequest(e -> {
            System.out.println("onCloseRequest handler called!");
        });
        StackPane rootPane = new StackPane();
        rootPane.getChildren().add(closeButton);        
        primaryStage.setScene(new Scene(rootPane, 300, 250));       
        primaryStage.show();
    }
}

1 个答案:

答案 0 :(得分:4)

正如Javadoc所述,这只会在外部请求中触发:

  

当有外部请求关闭此窗口时调用。

也许setOnHidden对你有用,在两种情况下都会调用它。

public class Main extends Application { 
    public static void main(String[] args) {
        launch(args);
    }   
    @Override
    public void start(Stage primaryStage) {     
        Button closeButton = new Button("Close");
        closeButton.setOnAction(e -> {          
            primaryStage.close();
        });     
        primaryStage.setOnHidden(e -> {
            System.out.println("stage hidden");
        });
        StackPane rootPane = new StackPane();
        rootPane.getChildren().add(closeButton);        
        primaryStage.setScene(new Scene(rootPane, 300, 250));       
        primaryStage.show();
    }
}