当按下“ x”按钮时,Javafx中的警报不会关闭

时间:2018-09-24 02:35:11

标签: javafx alert

您好,对于另一个Javafx应用程序,我一直在测试警报,唯一无法通过按警报框的“ X”按钮进行操作。

我在下面添加了代码,但是如果您没有时间运行它,这是GIF,用于说明我的警报框存在哪些问题: https://giant.gfycat.com/GeneralUntimelyBluewhale.webm

我不确定如何将gif上传到实际帖子,对此感到抱歉。

有什么办法可以解决此问题?

谢谢

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Playground extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox(100);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        Button button = new Button("Alert");
        button.setOnAction(event -> {
            ButtonType goodButton = new ButtonType("Good");
            ButtonType badButton = new ButtonType("Bad");
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", goodButton, badButton);
            alert.showAndWait();

            if (alert.getResult().equals(goodButton)) {
                System.out.println("Good");
            } else if (alert.getResult().equals(badButton)) {
                System.out.println("Bad");
            }
        });

        // Add the buttons to the layout
        root.getChildren().addAll(button);

        // Show the Stage
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

2 个答案:

答案 0 :(得分:3)

根据Dialog API文档中的“对话框关闭规则”,仅当至少一个按钮的类型为“ CANCEL”时,默认的“ X”按钮才能正常工作。因此,将您的任何按钮更改为ButtonType.CANCEL应该在单击“ X”时关闭对话框。

如果您对使用内置按钮不感兴趣,则必须根据需要显式处理对话框的关闭请求。

            ButtonType goodButton = new ButtonType("Good");
            ButtonType badButton = new ButtonType("Bad");
            Alert alert = new Alert(Alert.AlertType.ERROR,"",goodButton,badButton);
            Window window = alert.getDialogPane().getScene().getWindow();
            window.setOnCloseRequest(e -> alert.hide());
            Optional<ButtonType> result = alert.showAndWait();
            result.ifPresent(res->{
                if (res.equals(goodButton)) {
                    System.out.println("Good");
                } else if (res.equals(badButton)) {
                    System.out.println("Bad");
                }
            });

答案 1 :(得分:0)

要添加到Sai Dandem's answer中,请参见Dialog中的相关Javadoc:

  

...

     

对话框关闭规则

     

重要的是要了解关闭对话框时会发生什么,以及如何关闭对话框,特别是在异常关闭情况下(例如,在对话框标题栏中单击“ X”按钮或操作时)输入系统特定的键盘快捷键(例如Windows上的alt-F4)。幸运的是,在这些情况下结果是明确定义的,可以在以下要点中最好地总结一下:

     
      
  • JavaFX对话框只能在两种情况下“异常”关闭(如上定义):      
        
    1. 对话框只有一个按钮时,或者
    2.   
    3. 当对话框具有多个按钮时,只要其中一个按钮满足以下要求之一:      
          
      1. 该按钮有一个ButtonType,其ButtonBar.ButtonData的类型为ButtonBar.ButtonData.CANCEL_CLOSE。
      2.   
      3. 该按钮有一个ButtonType,当调用ButtonBar.ButtonData时,其ButtonBar.ButtonData.isCancelButton()返回true。
      4.   
    4.   
  •   
  • 在所有其他情况下,对话框将拒绝响应所有关闭请求,并保持打开状态,直到用户单击对话框DialogPane区域中的可用按钮之一为止。
  •   
  • 如果对话框异常关闭,并且该对话框包含满足上述两个条件之一的按钮,则该对话框将尝试将result属性设置为调用{{3 }}和第一个匹配的result converter
  •   
  • 如果由于任何原因结果转换器返回null,或者如果仅存在一个非取消按钮时对话框关闭,则ButtonType属性将为null,并且result方法将返回showAndWait()。稍后,这意味着,如果您使用选项2或选项3(如本类文档的前面所述),则Optional.empty() lambda将永远不会被调用,并且代码将继续执行,就像没有返回对话框一样任何价值。
  •   

通常,当使用AlertType.CONFIRMATION时,已经有一个取消按钮。但是,您将在Alert的构造函数中声明自己的按钮,该构造函数将覆盖默认按钮。

Optional.ifPresent(java.util.function.Consumer)的Javadoc:

  

...

     

通过传递可变数量的ButtonType参数,开发人员将直接覆盖将在对话框中显示的默认按钮,将预定义按钮替换为varargs数组中指定的任何内容。

     

...

您的按钮都不是取消按钮。由于您未指定ButtonData,所以它们都具有ButtonBar.ButtonData.OTHER