Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止JavaFX对话框关闭_Java_Javafx - Fatal编程技术网

防止JavaFX对话框关闭

防止JavaFX对话框关闭,java,javafx,Java,Javafx,我目前正在使用JavaFX创建一个对话框。对话框本身工作得很好,但现在我尝试添加一个输入验证,当用户忘记填写文本字段时,它会警告用户。 我的问题来了:是否有可能阻止对话框在结果转换器内关闭?像这样: ButtonType buttonTypeOk = new ButtonType("Okay", ButtonData.OK_DONE); dialog.getDialogPane().getButtonTypes().add(buttonTypeOk); dialog.setResultConv

我目前正在使用JavaFX创建一个对话框。对话框本身工作得很好,但现在我尝试添加一个输入验证,当用户忘记填写文本字段时,它会警告用户。 我的问题来了:是否有可能阻止对话框在结果转换器内关闭?像这样:

ButtonType buttonTypeOk = new ButtonType("Okay", ButtonData.OK_DONE);
dialog.getDialogPane().getButtonTypes().add(buttonTypeOk);

dialog.setResultConverter((ButtonType param) -> {   

    if (valid()) {
        return ...
    } else {
        Alert alert = new Alert(Alert.AlertType.WARNING);
        alert.setHeaderText("Pleas fill all fields!");
        alert.showAndWait();
        //prevent dialog from closing
    }

});
我注意到,如果在Result converter中抛出错误,对话框不会关闭,但这似乎不是解决此问题的好方法

如果无法以这种方式解决问题,我可以按中所述禁用按钮。但我更愿意保持按钮处于启用状态并显示消息


提前谢谢你

您应该如何在对话框中管理数据验证,这在Javadoc中得到了解释,我引用:

对话框验证/拦截按钮操作

在某些情况下,需要防止对话框关闭 直到对话框的某些方面变得内部一致(例如 对话框中的窗体的所有字段都处于有效状态)。为此,, 对话框API的用户应该熟悉
DialogPane.lookupButton(按钮类型)
方法。通过传入
按钮类型
(已在按钮类型列表中设置),用户将 返回的节点通常为Button类型(但这取决于 如果
对话框窗格.createButton(ButtonType)
方法 覆盖)。使用此按钮,用户可以添加 在按钮执行其常规事件处理之前调用,因此 用户可以通过使用事件来阻止事件处理。这里有一个 简化示例:

换句话说,您应该在按钮中添加一个事件过滤器,以便在未满足要求时使用事件,这将阻止对话框关闭


更多详细信息

解决此问题的另一种方法是使用
setOnCloseRequest
,如果您不想仅在用户单击“确定”按钮时进行中继。当有关闭
对话框的外部请求时,将调用事件处理程序。然后,事件处理程序可以通过使用接收到的事件来阻止对话框关闭

    setOnCloseRequest(e ->{
        if(!valid()) {
            e.consume();
        }
    });

validateAndStore()方法是什么?它应该做什么?@EdvBeq这种方法并不存在,它只是为了展示想法。这只是一个自定义方法,它将验证输入数据,如果验证成功,还可能执行其他操作。如果返回true,则对话框将关闭,否则事件将被消耗,对话框将保持打开状态。我尝试了两种解决方案,发现这一种要好得多-我希望在未来几天它将获得更多的投票…这不适用。无论用户按下OK或Cancel按钮,onCloseRequest都会被激发。
    setOnCloseRequest(e ->{
        if(!valid()) {
            e.consume();
        }
    });