我目前有一个包含四个TextField的对话框,从中收集输入。当输入无法满足我的要求时,对话框应保持打开状态并显示错误消息。我目前有以下代码:
dlg.setResultConverter(dialogButton -> {
if (dialogButton == createButtonType) {
ArrayList<String> returnList = getInput();
if (returnList != null) {
return returnList;
}
else {
dlg.showAndWait();
}
}
return null;
});
Optional<ArrayList<String>> result = dlg.showAndWait();
result.ifPresent(customerDetails -> {
//Use the input for something
});
getInput()
方法从TextFields获取文本并根据某些要求对其进行测试。当输入通过时,四个字符串放在ArrayList<String>
中。否则,该方法返回null
。如您所见,结果转换器检查方法是否返回null
。如果它没有,它只返回ArrayList<String>
。
但是,当验证失败时,对话框应保持打开状态。它适用于dlg.showAndWait()
,但缺点是它会触发错误:java.lang.IllegalStateException: Stage already visible
。 (它继续工作,但得到错误不是应该的方式)
我的问题是:有没有人知道如何做到这一点,而不会触发错误?
注意:我使用的是JavaFX 8(JDK 1.8.0_40),它具有内置的对话功能。
答案 0 :(得分:17)
final Button okButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
okButton.addEventFilter(ActionEvent.ACTION, ae -> {
if (!isValid()) {
ae.consume(); //not valid
}
});
对我来说很好。只需在首先触发过滤器时使用过滤器。
BTW在official docs中描述。
答案 1 :(得分:5)
将监听器添加到TextField
,验证用户输入。
如果用户输入有效,如果用户输入无效,请启用“确定”Button
(或其名称),禁用Button
。
如果关闭Button
关闭Dialog
,则关闭Dialog
的唯一方法是取消,这会导致结果为空Optional
。< / p>
答案 2 :(得分:0)
假设一个带TextField的对话框和一个Ok按钮。
该按钮无法启动,并且在TextField中输入有效数据时启用(长度为5到25个字符的文本)。附加到TextField的StringProperty的ChangeListener控制按钮的启用/禁用状态。
TextField textFld = new TextField();
...
ButtonType buttonTypeOk = new ButtonType("Okay", ButtonData.OK_DONE);
dialog.getDialogPane().getButtonTypes().add(buttonTypeOk);
final Button okButton = (Button) dialog.getDialogPane().lookupButton(buttonTypeOk);
okButton.setDisable(true);
textFld.textProperty().addListener((observable, oldValue, newValue) -> {
okButton.setDisable(newValue.trim().length() < 5 || newValue.trim().length() > 25);
});