更新#2

大家好,lemme打破了我对你的想法。



当前设置:


一个带有按钮(称为rootButton)的primaryStage,用于打开secondaryStage。
带按钮(称为closeButton)的secondaryStage关闭此secondaryStage。
按下closeButton.setCancelButton(true);来使secondaryStage上的ESC键按下closeButton




所需功能:


在secondaryStage上按ESC键应该弹出一个Alert对话框
问我是否真的要关闭secondaryStage。 <<<
如何实施?




运行当前代码的结果:


当我按键盘上的ESC键时,“警报”对话框不显示
第二阶段
命令行显示:“按下取消”。


因此,closeButton会以某种方式跳过“警报”对话框弹出窗口,而是直接导致

if (result.get() == ButtonType.CANCEL) {
    System.out.println("Cancel was pressed.");
}


那么ESC键事件是否有可能从secondaryStage传递到了Alert对话框?如果是这样,我如何以及在哪里在“警报”对话框中正确使用此按键事件?



当前代码(在GoXr3Plus的帮助下格式化):

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Closing extends Application {

  // handle primaryStage
  @Override
  public void start(Stage primaryStage) {
     Button rootButton = new Button("show dialog");

     // rootButton
     rootButton.setOnAction(ac -> {

        // CloseButton
        Button closeButton = new Button("Close");
        closeButton.setCancelButton(true); // make this cancel button
        closeButton.setOnAction(a -> {

            // Initialize the alert
            Alert alert = new Alert(AlertType.CONFIRMATION, "You really want to quit?");
            // Show the alert
            alert.showAndWait().ifPresent(result -> {
                if (result == ButtonType.OK)
                    System.out.println("OK was pressed.");
                else if (result == ButtonType.CANCEL)
                    System.out.println("Cancel was pressed.");
            });

            closeButton.getScene().getWindow().hide();
        });

        StackPane dialogPane = new StackPane(closeButton);

        Stage secondaryStage = new Stage();
        secondaryStage.setScene(new Scene(dialogPane, 200, 200));
        secondaryStage.showAndWait();
    });

    StackPane rootPane = new StackPane(rootButton);

    Scene scene = new Scene(rootPane, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}

}

最佳答案

您可能必须发布所有代码或发布mvce,因为您已经发布的代码完全适合我。似乎您好像连续不断地按了两次逃逸键。

尝试将您的setOnAction方法更改为以下方法,并检查标准输出。

btnCancel.setOnAction((ActionEvent event) -> {
    Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.setContentText("You really want to quit?");
    Optional<ButtonType> result = alert.showAndWait();
    if (result.isPresent()) {
        if (result.get() == ButtonType.OK) {
            System.out.println("OK was pressed.");
        }
        if (result.get() == ButtonType.CANCEL) {
            System.out.println("Cancel was pressed.");
        }
    }
    primaryStage.close();
});

10-06 14:11