按"x"时javafx.scene.control.Dialog <R>不会关闭

Jon*_*cka 8 java dialog javafx

如果我只创建一个从中延伸的空类javafx.scene.control.Dialog<R>,当我按下右上角的"x"按钮时它将不会关闭.

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

vba*_*rgl 18

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

// Somewhere in code
Dialog<?> dialog = new Dialog<>();
Window    window = dialog.getDialogPane().getScene().getWindow();
window.setOnCloseRequest(event -> window.hide());
Run Code Online (Sandbox Code Playgroud)

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


jew*_*sea 12

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,该对话框既满足了您通过本机窗口系统的窗口关闭图标关闭的要求,也满足了JavaFX Dialog要求在对话框中包含关闭按钮以使关闭图标工作的要求.

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


eck*_*kig 8

引用Api文档:

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

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

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

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

    ...

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

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

编辑:

这种行为是在实现的javafx.scene.control.FXDialog.requestPermissionToClose(Dialog<?>),但实际FXDialog显示的HeavyweightDialog不是公共API,因此不是真正的扩展点.