Я использую DateField в Vaadin с конвертером, чтобы включить использование LocalDateTime пакета java.time.Set Range в Vaadin DateField при использовании конвертера
Когда я использую конвертер и ограничиваю DateField с помощью setRangeEnd(), DateField всегда показывает UserError с сообщением «Дата вне допустимого диапазона». Без использования конвертера он отлично работает.
Мой конвертер:
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());
Каждый знает, как я могу установить диапазон, используя конвертер?
Вы можете использовать [RangeValidator] (http://demo.vaadin.com/javadoc/com.vaadin/vaadin/7.0.0.alpha3/com/vaadin/data/validator/RangeValidator.html), например: ' dateField.addValidator (новый RangeValidator ("Не в диапазоне", LocalDateTime.class, null, lastAvailableDataDate) '. Для этого вам придется удалить' dateField.setRangeStart (..) 'и' dateField.setRangeEnd (..) ', что означало бы, что курсор« no entry »не будет отображаться в датах, больших конца диапазона, поэтому пользователь мог бы выбрать их (хотя появится сообщение проверки). По этой причине я неохотно добавляю это как ответ –
@Ian Благодарю вас за ваш ответ. Основная причина использования методов setRange - показать пользователю информацию о том, что нет доступных данных для неизбираемых дат. В настоящее время я решил эту проблему, Класс DateField. Хорошая вещь в том, что я делаю больше не нужен конвертер. –