javafx.scene.control.Dialog<R>在按下“x”后不会关闭

14
如果我只创建一个继承自javafx.scene.control.Dialog<R>空类,当我按右上角的"x"按钮时它不会关闭。
如何实现这种行为?API似乎告诉我需要实现一个关闭按钮。但在我的情况下,我不想要一个关闭按钮,我只想通过点击x按钮或按ESC来关闭窗口。这可行吗?
5个回答

27

@eckig或@jewelsea提供的解决方案非常好。但我会使用类似这样的内容:

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

我不知道这种用法有什么限制,但它对我起作用了。 我建议在对话框初始化后立即初始化窗口,就像上面那样。


16
为了解决这个问题,你可以在对话框中添加一个隐藏的关闭按钮。
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对话框的要求,在对话框中包括一个关闭按钮,以使关闭图标起作用。
或者,您可以使用带有showAndWait的Stage代替Dialog。没有任何包含的按钮的Stage可使用窗口系统的关闭窗口图标进行关闭。

隐藏“关闭”按钮似乎会禁用“Esc”功能。 - Hollis Waite

10

引用Api文档的话:

在以下两种情况下,JavaFX对话框只能被“异常”关闭(如上所定义):

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

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

    1. 该按钮具有ButtonType,其ButtonData类型为ButtonData.CANCEL_CLOSE。
    2. 该按钮具有ButtonType,当调用ButtonData.isCancelButton()时,ButtonType返回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();

编辑:

该行为已经实现在javafx.scene.control.FXDialog.requestPermissionToClose(Dialog<?>)中,但是真正显示的FXDialogHeavyweightDialog,它不是公共API,因此不能真正作为扩展点。


1
怎么可能需要实现一个关闭按钮才能使用另一个关闭按钮呢?为什么两个都要有?如果我需要从窗口返回结果但不想要任何按钮(除了标题栏中的按钮,如“x”),是否还有其他可用的方法?最初,我从头开始创建了自己的类来实现这种行为,但是我无法返回结果。 - Jonatan Stenbacka
@JonatanStenbacka,唯一的解决方案是实现自己的FXDialog...但我不建议这样做。但是我无法想象一个没有任何按钮的对话框...? - eckig
确认这是我见过的唯一可行的选项。太棒了,谢谢。 - JonasAnon

1
在我的 Dialog<ButtonType> 中,我正在使用 @vbargl 提出的方法:
Window window = alert.getDialogPane().getScene().getWindow();
window.setOnCloseRequest(event -> window.hide());

它关闭了对话框,但是却出现了一个没有值存在的错误。

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


0
我在使用以下代码时遇到了警报的情况。
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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接