我目前正在使用JavaFX创建一个对话框。Dialog it self运行得很好,但是现在我尝试添加一个输入验证,当用户忘记填写文本字段时,它会发出警告。我的问题来了:是否有可能阻止对话框在结果转换器内关闭?如下所示:
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转换器中抛出错误,对话框就不会关闭,但是这似乎不是解决这个问题的好方法。
如果不可能以这种方式解决这个问题,我可以禁用这个职位中描述的按钮。但我更喜欢保持按钮启用,并显示一条消息。
提前谢谢你!
发布于 2016-08-01 10:12:29
在Javadoc中,您应该如何在对话框中管理数据验证,我引用如下:
对话框验证/截取按钮操作 在某些情况下,需要防止对话框关闭,直到对话框的某些方面变得内部一致(例如,对话框中的表单具有处于有效状态的所有字段)。为此,对话框API的用户应该熟悉
DialogPane.lookupButton(ButtonType)
方法。通过传入一个ButtonType
(已经在按钮类型列表中设置),用户将返回一个节点,该节点通常为button类型(但这取决于是否覆盖了DialogPane.createButton(ButtonType)
方法)。使用此按钮,用户可以在按钮执行其通常的事件处理之前添加调用的事件筛选器,因此用户可以通过使用事件来阻止事件处理。下面是一个简化的示例:
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();
}
}
);
换句话说,您应该向按钮中添加一个事件筛选器,以便在不满足要求时使用该事件,这将阻止对话框关闭。
更多细节这里
发布于 2018-07-03 10:30:47
解决这一问题的另一种方法是使用setOnCloseRequest
,如果您不想只在用户单击“on”按钮上中继。当有关闭Dialog
的外部请求时,将调用事件处理程序。然后,事件处理程序可以通过使用接收到的事件来防止对话框关闭。
setOnCloseRequest(e ->{
if(!valid()) {
e.consume();
}
});
https://stackoverflow.com/questions/38696053
复制相似问题