首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止JavaFX对话框关闭

防止JavaFX对话框关闭
EN

Stack Overflow用户
提问于 2016-08-01 10:01:51
回答 2查看 8.7K关注 0票数 15

我目前正在使用JavaFX创建一个对话框。Dialog it self运行得很好,但是现在我尝试添加一个输入验证,当用户忘记填写文本字段时,它会发出警告。我的问题来了:是否有可能阻止对话框在结果转换器内关闭?如下所示:

代码语言:javascript
运行
复制
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
    }

});

我注意到,如果在resault转换器中抛出错误,对话框就不会关闭,但是这似乎不是解决这个问题的好方法。

如果不可能以这种方式解决这个问题,我可以禁用这个职位中描述的按钮。但我更喜欢保持按钮启用,并显示一条消息。

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-01 10:12:29

在Javadoc中,您应该如何在对话框中管理数据验证,我引用如下:

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

代码语言:javascript
运行
复制
final Button btOk = (Button) dlg.getDialogPane().lookupButton(ButtonType.OK);
btOk.addEventFilter(
    ActionEvent.ACTION, 
    event -> {
        // Check whether some conditions are fulfilled
        if (!validateAndStore()) {
            // The conditions are not fulfilled so we consume the event
            // to prevent the dialog to close
            event.consume();
        }
    }
);

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

更多细节这里

票数 28
EN

Stack Overflow用户

发布于 2018-07-03 10:30:47

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

代码语言:javascript
运行
复制
    setOnCloseRequest(e ->{
        if(!valid()) {
            e.consume();
        }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38696053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档