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

bas*_*aad 7 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

});
Run Code Online (Sandbox Code Playgroud)

getInput()方法从TextFields获取文本并根据某些要求对其进行测试.当输入通过时,四个字符串被放入ArrayList<String>.否则,该方法返回null.如您所见,结果转换器检查方法是否返回null.如果没有,它只会返回ArrayList<String>.

但是,当验证失败时,对话框应保持打开状态.它适用dlg.showAndWait(),但缺点是它会触发错误:java.lang.IllegalStateException: Stage already visible.(它继续工作,但得到错误不是应该的方式)

我的问题是:有没有人知道如何做到这一点,而不会触发错误?

注意:我使用的是JavaFX 8(JDK 1.8.0_40),它具有内置的对话功能.

Dav*_*_cz 18

final Button okButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
okButton.addEventFilter(ActionEvent.ACTION, ae -> {
    if (!isValid()) {
        ae.consume(); //not valid
    }
});
Run Code Online (Sandbox Code Playgroud)

对我来说很好.只需使用过滤器,因为它首先触发.

BTW在官方文档中有描述.


eck*_*kig 6

将侦听器添加到您的TextFields,验证用户输入.

如果用户输入有效,如果用户输入无效,则启用"OK" Button(或其名称),禁用Button.

如果禁用Button关闭,Dialog则关闭的唯一方法Dialog是取消,这会导致结果为空Optional.