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

Bin*_*t09 3 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

hud*_*onb 7

正如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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @BinaryDigit09 它是“外部”的,因为它是关闭窗口的本机操作系统请求,而不是来自 Java 代码的调用。窗口本身是从本机窗口工具包生成的,“装饰”按钮(例如关闭按钮)由本机工具包提供。因此,如果用户按下关闭按钮,操作系统会请求关闭窗口(如果您从任务栏操作等关闭,情况也是如此)。 (3认同)
  • @BinaryDigit09这种区别有时很有帮助:如果您想否决关闭(保存更改?是/否/取消)等,如果您从自己的代码关闭窗口,则不需要处理程序来执行此操作(因为您只需显示对话框,然后决定是否调用“hide()”)。但是,如果您想在用户按下本机“关闭”按钮等时执行此操作,则需要一个处理程序来捕获该操作。请注意,“onHidden”是在窗口实际关闭时调用的:您无法从那里否决关闭请求。 (2认同)