gpt4 book ai didi

java - 如何确定 DateField 在 Vaadin 8 中是否有效

转载 作者:行者123 更新时间:2023-11-29 07:28:34 25 4
gpt4 key购买 nike

我有:

DateField dateField = new DateField("Date");
Button submitButton = new Button("Submit");
submitButton.addClickListener(click -> handleClickListener());

如果 DateField 中存在验证错误,我想在 handleClickListener() 中阻止提交。我知道我可以使用 Binder,然后使用 binder.validate() 但此表单没有支持对象,我只想要一个简单的表单。我该怎么做:

if(!dateField.isValid())
// no further processing
else
// process

我在 DateField 中找不到任何允许检查输入值是否有效的代码。显然 in Vaadin 7 you could !dateField.validate() which would throw an exception但这似乎不再是这种情况......

我也知道可以执行 dateField.isEmpty() 或测试 null 但这不起作用,因为不需要值。换句话说,它可以是空的,或者如果您输入一个值,那么它必须是一个有效的条目。

最佳答案

这个问题已经被问过好几次了,据我所知,没有 Binder 是不可能添加 validator 的。你可以查看this answer以获得对该功能和共鸣的全面描述。

还有关于Vaadin forum的讨论和 github ,两个主要建议是使用 Binder ,或手动调用 validator 的值更改监听器。然而,后一种解决方案似乎不起作用,我怀疑这是因为值更改事件仅在实际值更改时触发,当您键入无效内容时可能不会发生这种情况,但我没有花太多时间进行调查。

latest suggestion on github请求 binder.noBind() 方法来促进这些情况,但在实现之前,您可以使用类似于以下代码示例的内容。我也讨厌使用字段绑定(bind)值的想法,所以我采用了无 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
};
}
}
}

结果:

date field validation with binder


稍后更新:

我一直在考虑更多,如果可以的话,您可以在值为 null 或对无效值发生解析错误时禁用提交按钮。这可以使用 ValueChangeListenerErrorHandler 轻松实现,如下所示。

或者,您可以将异常消息保存在变量中,当您单击按钮时检查是否有错误消息或值是否为空,按此顺序,因为如果您输入了无效日期,该字段的值将设置为空。

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

结果:

vaadin date field validation

关于java - 如何确定 DateField 在 Vaadin 8 中是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46598157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com