2016-11-24 6 views
0

Converter를 사용하여 Vaadin의 DateField를 사용하여 java.time 패키지의 LocalDateTime을 사용하도록 설정합니다.변환기를 사용할 때 Vaadin DateField의 범위 설정

Converter를 사용하고 setRangeEnd()로 DateField를 제한하면 DateField는 항상 'Date is allowed Range'메시지와 함께 UserError를 표시합니다. 변환기를 사용하지 않으면 제대로 작동합니다.

내 변환기 다음하여 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 = 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.setRangeStart (..)'와'dateField.setRangeEnd() '를 제거해야 할 것입니다 : dateField.addValidator (new RangeValidator (..)'이것은 "엔트리 없음"커서가 범위 끝보다 큰 날짜에 표시되지 않기 때문에 사용자가 선택할 수 있도록 유효성 검사 메시지가 표시 될 수 있음을 의미합니다.이 이유로 나는 이것을 추가하기를 꺼립니다. Answer –

+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()); 
} 
} 

이제는 변환기가 필요 없으며 get/setDate() 메소드는 Google의 스윙 datepicker 메소드와 일치합니다. 우리의 경우이 방법이 최선의 해결책 일 수 있습니다.