按“x”时javafx.scene.control.Dialog 不会关闭

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

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

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

 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 Dialog要求在对话框中包含关闭按钮以使关闭图标起作用的要求。

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

来自@eckig或@jewelsea的解决方法非常好。 但我会使用这样的东西:

 // Somewhere in code Dialog dialog = new Dialog<>(); Window window = dialog.getDialogPane().getScene().getWindow(); window.setOnCloseRequest(event -> window.hide()); 

我不知道这种用途的任何限制,但它对我有用。 我建议在对话框初始化后立即初始化窗口,如上所述。

引用Api文档 :

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

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

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

    1. 该按钮具有ButtonType,其ButtonData的类型为ButtonData.CANCEL_CLOSE。
    2. 该按钮具有ButtonType,当调用ButtonData.isCancelButton()时,其ButtonData返回true。

因此,要么添加至少一个按钮,要么添加多个按钮,其中一个按钮类型为ButtonData.CANCEL_CLOSE ,例如:

 Dialog dialog = new Dialog<>(); dialog.getDialogPane().getButtonTypes().add(new ButtonType("Got it!", ButtonData.CANCEL_CLOSE)); dialog.setContentText("test"); dialog.showAndWait(); 

编辑:

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

在我的Dialog我正在使用@vbargl所说的:

 Window window = alert.getDialogPane().getScene().getWindow(); window.setOnCloseRequest(event -> window.hide()); 

它会关闭对话框,但它会给我带来一个无值的错误。

为了避免它,我还检查result.get()result.isPresent()