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