2016-11-24 4 views
0

Я использую 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()); 

Каждый знает, как я могу установить диапазон, используя конвертер?

+0

Вы можете использовать [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 »не будет отображаться в датах, больших конца диапазона, поэтому пользователь мог бы выбрать их (хотя появится сообщение проверки). По этой причине я неохотно добавляю это как ответ –

+0

@Ian Благодарю вас за ваш ответ. Основная причина использования методов setRange - показать пользователю информацию о том, что нет доступных данных для неизбираемых дат. В настоящее время я решил эту проблему, Класс DateField. Хорошая вещь в том, что я делаю больше не нужен конвертер. –

ответ

0

Мой последний способ решить эту проблему - расширить класс 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()); 
} 
} 

Теперь нет необходимости в преобразователе больше и прибудет/SETDATE() методы соответствуют нашим методам свинга Datepicker. Для нашего случая это может быть лучшим решением.

Смежные вопросы