javafx.scene.control.Dialog<;R>;韩元';t按下时关闭";x";

javafx.scene.control.Dialog<;R>;韩元';t按下时关闭";x";,java,javafx,dialog,Java,Javafx,Dialog,如果我只是创建一个从javafx.scene.control.Dialog扩展的空类,当我按下右上角的“x”按钮时,它不会关闭 我如何实现这种行为?API似乎告诉我需要实现一个关闭按钮。但在我的情况下,我不需要关闭按钮,我只想用x按钮或按ESC键关闭窗口。这可能吗?引用以下内容: JavaFX对话框只能在中“异常”关闭(如上所述) 两种情况: 当对话框只有一个按钮时,或 当对话框有多个按钮时,只要其中一个按钮满足以下要求之一: 按钮有一个ButtonType,其ButtonData 类型为Bu

如果我只是创建一个从
javafx.scene.control.Dialog
扩展的空类,当我按下右上角的“x”按钮时,它不会关闭

我如何实现这种行为?API似乎告诉我需要实现一个关闭按钮。但在我的情况下,我不需要关闭按钮,我只想用x按钮或按ESC键关闭窗口。这可能吗?

引用以下内容:

JavaFX对话框只能在中“异常”关闭(如上所述) 两种情况:

  • 当对话框只有一个按钮时,或

  • 当对话框有多个按钮时,只要其中一个按钮满足以下要求之一:

  • 按钮有一个ButtonType,其ButtonData 类型为ButtonData.CANCEL\u CLOSE
  • 按钮有一个ButtonType,其 调用ButtonData.isCancelButton()时,ButtonData返回true
  • 因此,请至少添加一个按钮或多个按钮,其中一个按钮的类型为
    ButtonData。取消关闭
    ,例如:

    Dialog<ButtonType> dialog = new Dialog<>();
    dialog.getDialogPane().getButtonTypes().add(new ButtonType("Got it!", ButtonData.CANCEL_CLOSE));
    dialog.setContentText("test");
    dialog.showAndWait();
    
    Dialog Dialog=新建Dialog();
    dialog.getDialogPane().getButtonTypes().add(新的ButtonType(“明白了!”,ButtonData.CANCEL_CLOSE));
    setContentText(“测试”);
    dialog.showAndWait();
    

    编辑:


    此行为是在
    javafx.scene.control.fxlialog.requestPermissionToClose(Dialog)
    中实现的,但实际显示的
    fxlialog
    HeavweightDialog,它不是公共API,因此不是真正的扩展点。

    要解决此问题,可以在对话框中添加隐藏的关闭按钮

    import javafx.application.Application;
    import javafx.scene.*;
    import javafx.scene.control.*;
    import javafx.stage.Stage;
    
    public class DialogClosure extends Application{
    
        @Override
        public void start(Stage stage) throws Exception {
            Button openDialog = new Button("Open Dialog");
            openDialog.setOnAction(event -> {
                Dialog dialog = new Dialog();
                dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
                Node closeButton = dialog.getDialogPane().lookupButton(ButtonType.CLOSE);
                closeButton.managedProperty().bind(closeButton.visibleProperty());
                closeButton.setVisible(false);
                dialog.showAndWait();
            });
    
            stage.setScene(new Scene(openDialog));
            stage.show();
        }
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    然后,该对话框满足您通过本机窗口系统的窗口关闭图标关闭的要求,以及JavaFX对话框在对话框中包含关闭按钮以使关闭图标工作的要求


    或者,您可以使用带有的舞台,而不是。使用窗口系统的“关闭窗口”图标可以关闭没有任何按钮的舞台。

    来自@eckig或@jewelsea的解决方案非常好。但我会用这样的方式:

    // Somewhere in code
    Dialog<?> dialog = new Dialog<>();
    Window    window = dialog.getDialogPane().getScene().getWindow();
    window.setOnCloseRequest(event -> window.hide());
    
    //代码中的某个地方
    Dialog=新建Dialog();
    Window Window=dialog.getDialogPane().getScene().getWindow();
    setOnCloseRequest(事件->window.hide());
    
    我不知道这种用法有什么限制,但它对我起了作用。 我建议在对话框初始化之后立即初始化窗口,如上所述。

    在我的
    对话框中
    我使用的是@vbargl所说的:

    Window window = alert.getDialogPane().getScene().getWindow();
    window.setOnCloseRequest(event -> window.hide());
    
    它关闭了对话框,但给我带来了一个无值当前错误


    为了避免这种情况,我还检查了
    result.get()
    ,以及
    result.isPresent()

    我用下面的代码警告了这种情况

    Alert alert = new Alert(Alert.AlertType.NONE);
         alert.setTitle("Export Successful");
         alert.setContentText("All the posts have been exported to Posts.txt file 
     successfully");
        alert.show(); 
    
    唯一的解决办法是创建一个警报或对话框,其中有一个按钮,如下所示

    Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("Export Successful");
        alert.setContentText("All the posts have been exported to Posts.txt file 
    successfully");
        alert.showAndWait();
    

    您必须实现一个关闭按钮才能使用另一个关闭按钮,这有什么意义?你为什么要两者兼得?如果我需要从窗口返回结果而不需要任何按钮(除了标题栏中的按钮,如“x”)的话,还有什么可以使用的吗。最初,我从头开始创建自己的类来实现此行为,但无法返回结果。@Jonatanstenback唯一的解决方案是实现自己的
    FXDialog
    。。但我不建议这样做。但我无法想象没有任何按钮的对话框…?确认这是我见过的唯一有效选项。非常感谢。隐藏“关闭”按钮将禁用“Esc”功能。