gpt4 book ai didi

java - 使用 Converter 时在 Vaadin DateField 中设置范围

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:21 25 4
gpt4 key购买 nike

我在 Vaadin 中使用 DateField 和转换器来启用 java.time 包的 LocalDateTime。

当我使用转换器并通过 setRangeEnd() 限制 DateField 时,DateField 始终显示用户错误,并显示消息“日期超出允许的范围”。不使用转换器它工作正常。

我的转换器:

public class LocalDateTimeToDateConverter implements Converter<Date,LocalDateTime> {

private static final long serialVersionUID = -4900262260743116965L;

@Override
public LocalDateTime convertToModel(Date value, Class<? extends LocalDateTime> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {

if (value != null) {
return value.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDate().atStartOfDay();
}

return null;
}

@Override
public Date convertToPresentation(LocalDateTime value, Class<? extends Date> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {

if (value != null) {
return Date.from(value.atZone(ZoneOffset.systemDefault()).toInstant());
}

return null;
}

@Override
public Class<LocalDateTime> getModelType() {
return LocalDateTime.class;
}

@Override
public Class<Date> getPresentationType() {
return Date.class;
}
}

MyView 在哪里使用 DateField:

dateField = new DateField();
dateField.setDateFormat("yyyy-MM-dd");
dateField.setRangeStart(null);
dateField.setRangeEnd(Date.from(lastAvailableDataDate.atZone(ZoneId.systemDefault()).toInstant()));
dateField.setConverter(new LocalDateTimeToDateConverter());

有人知道如何在使用转换器时设置范围吗?

最佳答案

我目前解决此问题的方法是扩展 DateField 类。

public class MyDateField extends DateField {

private static final long serialVersionUID = -7056642919646970829L;

public MyDateField() {
super();
}

public LocalDateTime getDate() {
Date value = super.getValue();

return DateToLocalDateTime(value);
}

public void setDate(LocalDateTime date) {
super.setValue(LocalDateTimeToDate(date));
}

public void setRange(LocalDateTime start, LocalDateTime end) {

if (start != null) {
super.setRangeStart(LocalDateTimeToDate(start));
} else {
super.setRangeStart(null);
}

if (end != null) {
super.setRangeEnd(LocalDateTimeToDate(end));
} else {
super.setRangeEnd(null);
}
}

private Date LocalDateTimeToDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

private LocalDateTime DateToLocalDateTime(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}
}

现在不再需要转换器,并且 get/setDate() 方法与我们的 swing 日期选择器方法相对应。对于我们的情况,这可能是最好的解决方案。

关于java - 使用 Converter 时在 Vaadin DateField 中设置范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40780755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com