Java 如何确定日期字段在Vaadin 8中是否有效

Java 如何确定日期字段在Vaadin 8中是否有效,java,vaadin,vaadin8,Java,Vaadin,Vaadin8,我有: 其中,在handleClickListener()中,如果日期字段中存在验证错误,我希望阻止提交。我知道我可以使用活页夹,然后使用Binder.validate(),但是这个表单没有支持对象,我只想要一个简单的表单。我怎样才能做到: DateField dateField = new DateField("Date"); Button submitButton = new Button("Submit"); submitButton.addClickListener(click ->

我有:

其中,在
handleClickListener()
中,如果
日期字段中存在验证错误,我希望阻止提交。我知道我可以使用活页夹,然后使用
Binder.validate()
,但是这个表单没有支持对象,我只想要一个简单的表单。我怎样才能做到:

DateField dateField = new DateField("Date");
Button submitButton = new Button("Submit");
submitButton.addClickListener(click -> handleClickListener());
我在
日期字段中找不到允许检查输入值是否有效的代码。显然,但情况似乎不再如此


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

这已经被问了好几次了,据我所知,没有活页夹是不可能添加验证器的。您可以查看功能和共振的全面描述

还有关于and的讨论,两个主要建议是使用活页夹或值更改侦听器,您可以在其中手动调用验证器。然而,后一种解决方案似乎不起作用,我怀疑这是因为只有当实际值发生变化时才会触发值变化事件,而当您键入无效的内容时,可能不会发生这种情况,但我没有花太多时间进行调查

请求一个
binder.noBind()
方法来简化这些情况,但在实现之前,您可以使用类似于下面代码示例的方法。我也不喜欢使用字段将值绑定到,所以我采用了无setter和无getter的概念:

结果:


这已经被问了好几次,据我所知,如果没有活页夹,就不可能添加验证器。您可以查看功能和共振的全面描述

还有关于and的讨论,两个主要建议是使用活页夹或值更改侦听器,您可以在其中手动调用验证器。然而,后一种解决方案似乎不起作用,我怀疑这是因为只有当实际值发生变化时才会触发值变化事件,而当您键入无效的内容时,可能不会发生这种情况,但我没有花太多时间进行调查

请求一个
binder.noBind()
方法来简化这些情况,但在实现之前,您可以使用类似于下面代码示例的方法。我也不喜欢使用字段将值绑定到,所以我采用了无setter和无getter的概念:

结果:


即使您声明不想使用支持对象,我还是建议您使用
活页夹。我认为所提供的
No
class@Morfic非常优秀(我倾向于在许多验证实现中重用它)

因此,我要做的是在活页夹上添加一个
addStatusChangeListener
,并在那里启用/禁用按钮:

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);
    }
}
省略了
Binder
对象的实例化,因为@Morfic已经在他的答案中提供了一个很好的例子


我建议使用
Binder
的原因是,您不需要很难维护值更改侦听器,如果以后需要,您可以轻松地使用新的
验证器扩展绑定。也许您会希望在某一点上将字段绑定到对象。

即使您声明不想使用备份对象,我还是建议使用
绑定器。我认为所提供的
No
class@Morfic非常优秀(我倾向于在许多验证实现中重用它)

因此,我要做的是在活页夹上添加一个
addStatusChangeListener
,并在那里启用/禁用按钮:

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);
    }
}
省略了
Binder
对象的实例化,因为@Morfic已经在他的答案中提供了一个很好的例子


我建议使用
Binder
的原因是,您不需要很难维护值更改侦听器,如果以后需要,您可以轻松地使用新的
验证器扩展绑定。也许你会希望在某一点上将字段绑定到一个对象。

使用
Binder
()怎么样
Binder
附带了类似于
validate()
isValid()
的方法。有时Binder不起作用。例如,我的表单后面可能没有POJO等。可能我只是在使用表单对标签进行快速计算,不想用任何东西来支持它。使用
活页夹
()怎么样
Binder
附带了类似于
validate()
isValid()
的方法。有时Binder不起作用。例如,我的表单后面可能没有POJO等,也许我只是在使用表单对标签进行快速计算,不想用任何东西来支持它。这与我所做的非常接近。你基本上是创建一个假的POJO(或类似的东西)与活页夹绑定,然后在单击“提交”按钮时使用活页夹的验证。@StephaneGrenier是的,基本上就是这个想法,至少目前是这样。…@StephaneGrenier第二种方法怎么样?这与我所做的非常接近。你基本上是创建一个假的POJO(或类似的东西)与活页夹绑定,然后在单击“提交”按钮时使用活页夹的验证。@StephaneGrenier是的,基本上就是这个想法,至少目前是这样。…@StephaneGrenier第二种方法怎么样?
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);
    }
}
binder.addStatusChangeListener(event -> {
            if (event.hasValidationErrors()) {
                submitButton.setEnabled(false);
            } else {
                submitButton.setEnabled(true);
            }
        });