JavaFX日期选择器验证

6

我们尝试验证JavaFX的日期选择器。因此,我们使用了以下代码:

if (fromDatePicker.getValue() == null) {
        sb.append("No valid from date!\n");
    } else {
        System.out.println(fromDatePicker.getValue().toString());
        if (!DateUtil
                .validEnglishDate(fromDatePicker.getValue().toString())) {
            sb.append("No valid from date. Use the format yyyy-MM-dd.\n");
        }
    }

目前来看,使用日期选择器不可能得到无效的日期,因为所有无效的日期都会被更改为起始值。 因此,我们问自己:是否可能在JavaFX日期选择器中得到一个无效的日期?

***** 编辑 *****

例如,我们有以下日期选择器: DatePicker [2015-05-12] 现在我们在日期选择器中输入"fjdfk",那么现在的日期选择器是这样的: DatePicker [fjdfk] 在保存数据时,日期选择器会自动更改为:DatePicker [2015-05-12]


你的问题不是很清楚。你所说的“无效日期”是什么意思?DatePicker.getValue()将返回null或一个实际的LocalDate实例。如果它不是nulltoString()会以特定的方式格式化它(javadoc告诉你格式)。如果需要,你可以使用DateTimeFormatter以不同的格式来格式化结果。 - James_D
我有相同的使用情况。DatePicker.getValue() 不会返回 null,而是返回先前的值。是否有任何方法可以拦截 DatePicker 的验证(可能是通过属性监听器)?我想向用户显示一条消息,例如“请输入有效日期”。 - giraffe.guru
1个回答

5
您可以使用DatePicker#setConverter(StringConverter<LocalDate>)方法来捕获任何解析异常,并相应地警告用户。以下是一个示例:
public class SecureLocalDateStringConverter extends StringConverter<LocalDate> {
    /**
     * The date pattern that is used for conversion. Change as you wish.
     */
    private static final String DATE_PATTERN = "dd/MM/yyyy";

    /**
    * The date formatter.
    */
    public static final DateTimeFormatter DATE_FORMATTER =
        DateTimeFormatter.ofPattern(DATE_PATTERN);

    private boolean hasParseError = false;

    public boolean hasParseError(){
        return hasParseError;
    }

    @Override
    public String toString(LocalDate localDate) {
       return DATE_FORMATTER.format(localDate);
    }

    @Override
    public LocalDate fromString(String formattedString) {

            try {
                LocalDate date=LocalDate.from(DATE_FORMATTER.parse(formattedString));
                hasParseError=false;
                return date;
            } catch (DateTimeParseException parseExc){
                hasParseError=true;
                return null;
            }
    }

}

在控制器中,您只需调用converter#hasParseError(),其中converter是您使用DatePicker#setConverter(StringConverter<LocalDate>)设置的转换器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接