输入验证失败时继续显示对话框

时间:2014-12-17 10:13:42

标签: dialog javafx javafx-8

我目前有一个包含四个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),它具有内置的对话功能。

3 个答案:

答案 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);
});