У меня возникли проблемы с проверкой DateFields. В моем приложении у меня есть таблица с свойствами DateField, которую пользователи должны иметь возможность редактировать, нажав кнопку редактирования. У меня также есть кнопка OK, которая фиксирует поля и кнопку отмены, которая отбрасывает их.Как правильно проверить DateField в Vaadin?
Вот что я хочу достичь (конечно, есть некоторые аккуратные правила, которые нужно выполнять):
- Во-первых, сроки могут быть изменены только на текущий день до 9999 -12-31.
- Во-вторых, я предпочитаю, чтобы валидация была динамической (как у вас)
- Исходные даты (даты, которые уже находятся в таблице при переходе в режим редактирования) могут быть любой датой, и вы должны иметь возможность совершайте их так, как они есть, даже если они в прошлом.
- Если вы изменили дату на недопустимую дату (вы все равно можете сделать это «вручную», то есть непосредственно в поле, а не в подборщике даты) или ввести недопустимый символ в DateField, должен отображаться значок ошибки с сообщение, не позволяющее вам вносить изменения, пока вы не введете действительную дату.
- Если вы изменили дату на недопустимую дату (отображается значок ошибки), а затем до допустимой даты, значок ошибки должен исчезнуть.
текущее поведение, что мне удалось реализовать делает следующее:
- Позволяет «оригинальные даты» - OK
- Позволяет изменять к действительной дате - OK
- При переходе неверная дата (может быть выполнена «вручную», а не с помощью выбора даты) и нажмите клавишу ввода в поле, поле немедленно будет сброшено на исходную дату, но значок ошибки все еще отображается - НЕ ОК
- При вводе недопустимого символа (можно сделать «вручную», не используя средство выбора даты), и нажмите клавишу ввода в поле, при вызове будет выбрано NPE, также отображается значок ошибки - НЕ ОК
- При переходе на неверную дату и нажмите ввод в поле и обратно до действительной даты и нажмите клавишу ввода в поле, значок ошибки все еще там - НЕ ОК
- При изменении на недопустимую дату и нажмите OK (т.е. commit()), поле сначала сбрасывается до исходной даты, и изменения (т. е. никаких изменений вообще не изменяются в поле) фиксируются - НЕ ОК
Теперь я попытался реализовать обертку, чтобы я мог слушать но у DateField нет удобных методов, таких как TextField (например, setTextChangeEventMode и setTextChangeTimeout). Я переопределяю valueChange, чтобы позаботиться о некоторых проблемах, но он кажется, что он вызван только при переходе на действительную дату, а не при переходе на недействительную дату (вы также должны нажимать клавишу ввода каждый раз, когда не используете средство выбора даты) ... вместо этого другая функция validate() вызывается в фоновом режиме, все время перезаписывая setValidationVisible().
Я даже попытался создать CustomDateRangeValidator, но выяснил, что это не очень поможет.
Пожалуйста, помогите мне получить это прямо, я пробовал так много вещей сейчас, и у меня заканчиваются варианты.
Вот мой метод createField:
createField(){
// some more code up here...
if (propertyId.equals("Valid From")) {
dField.setImmediate(true);
dField.setRangeStart(new Date());
dField.setRangeEnd(dateUtil.getDate(9999, 12, 31));
dField.setDateOutOfRangeMessage("Date out of range!");
@SuppressWarnings({ "unchecked", "rawtypes" })
TableDataValidatingWrapper<TextField> wField = new TableDataValidatingWrapper(dField);
return wField;
}
// some more code down here...
}
... и вот моя обертка:
public class TableDataValidatingWrapper<T> extends CustomField<T> {
private static final long serialVersionUID = 1L;
protected Field<T> delegate;
public TableDataValidatingWrapper(final Field<T> delegate) {
this.delegate = delegate;
if (delegate instanceof DateField) {
final DateField dateField = (DateField) delegate;
dateField.setCaption("");
dateField.setImmediate(true);
dateField.setInvalidAllowed(false);
dateField.setInvalidCommitted(true);
dateField.setValidationVisible(false);
dateField.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
try {
dateField.validate();
dateField.setValidationVisible(false);
} catch (InvalidValueException ive) {
//handle exception
} catch (Exception e) {
//handle exception
}
}
});
}
}
//some other overridden methods here...
}
вы получили какое-либо решение? – Visruth