Ste*_*ier 1 java vaadin vaadin8
我有:
DateField dateField = new DateField("Date");
Button submitButton = new Button("Submit");
submitButton.addClickListener(click -> handleClickListener());
Run Code Online (Sandbox Code Playgroud)
在handleClickListener()我想要阻止提交的地方,如果有一个验证错误DateField.我知道我可以使用Binder,binder.validate()但是这个表单没有后备对象,我只想要一个简单的表单.我该怎么做:
if(!dateField.isValid())
// no further processing
else
// process
Run Code Online (Sandbox Code Playgroud)
我找不到任何DateField允许检查输入值是否有效的代码.显然在Vaadin 7你可能!dateField.validate()会抛出一个例外,但这似乎不再是这种情况......
我也知道可以执行dateField.isEmpty()或测试null,但这不起作用,因为不需要值.换句话说,它可以是空的,或者如果你输入一个值,那么它必须是一个有效的条目.
已多次询问过这个问题,据我所知,如果没有粘合剂,就无法添加验证器.您可以查看此答案,以获得有关该功能的全面描述并产生共鸣.
还有关于Vaadin论坛和github的讨论,2个主要建议是使用绑定器,或者手动调用验证器的值更改侦听器.然而,后者的解决方案似乎不工作,我怀疑这是因为一个价值变动事件triggerd只有当实际值发生变化,这可能当你输入了无效的情况不会发生,但我并没有花太多的时间来调查.
关于github的最新建议请求一种binder.noBind()方法来促进这些情况,但在实现之前,您可以使用类似于下面的代码示例.我也讨厌使用字段绑定值的想法,所以我选择了没有setter和没有getter的概念:
public class DateFieldWithValidator extends VerticalLayout {
public DateFieldWithValidator() {
// date field with binder
Binder<LocalDate> binder = new Binder<>();
DateField dateField = new DateField("Date");
binder.forField(dateField)
.asRequired("Please select a date")
.bind(No.getter(), No.setter());
// validity status
TextField validityField = new TextField("Status:", "N/A");
validityField.setReadOnly(true);
validityField.addStyleName(ValoTheme.TEXTFIELD_BORDERLESS);
validityField.setWidth("100%");
// submit button
Button submitButton = new Button("Submit");
submitButton.addClickListener(event -> {
BinderValidationStatus<LocalDate> status = binder.validate();
if (status.isOk()) {
validityField.setValue("OK: " + dateField.getValue().toString());
} else {
validityField.setValue("KO: " + status.getValidationErrors().stream().map(ValidationResult::getErrorMessage).collect(Collectors.joining(",")));
}
});
addComponents(dateField, submitButton, validityField);
}
// convenience empty getter and setter implementation for better readability
public static class No {
public static <SOURCE, TARGET> ValueProvider<SOURCE, TARGET> getter() {
return source -> null;
}
public static <BEAN, FIELDVALUE> Setter<BEAN, FIELDVALUE> setter() {
return (bean, fieldValue) -> {
//no op
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
稍后更新:
我一直在考虑更多,如果可以接受,如果值为null或者无效值发生解析错误,则可以禁用提交按钮.这可以通过下面的ValueChangeListener等等容易地实现ErrorHandler.
或者,你可以在一个变量保存异常消息,当您单击按钮检查如果任一错误消息或值为空,在这种顺序,因为如果你输入一个无效的日期,该字段的值将被设置为空值.
public class DateFieldWithValidator extends VerticalLayout {
public DateFieldWithValidator() {
DateField dateField = new DateField("Date");
Button submitButton = new Button("Submit");
submitButton.setEnabled(false);
submitButton.addClickListener(event -> Notification.show("Selected date: " + dateField.getValue()));
dateField.setRequiredIndicatorVisible(true);
dateField.setErrorHandler(event -> submitButton.setEnabled(false));
dateField.addValueChangeListener(event -> submitButton.setEnabled(event.getValue() != null));
addComponents(dateField, submitButton);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
| 归档时间: |
|
| 查看次数: |
1422 次 |
| 最近记录: |