Java 如果字段存在验证错误,如何防止ClickEvent传播?

Java 如果字段存在验证错误,如何防止ClickEvent传播?,java,vaadin,vaadin7,Java,Vaadin,Vaadin7,我有一个带有一些文本字段的基本BeanFieldGroup编辑器。我公开了save-按钮,以便演示者类可以注册到它 问题:当视图中的TextField元素存在验证错误时,我希望阻止clickevent的传播(因为无效的输入值需要进一步的用户输入,不应触发任何其他操作) 但是我怎样才能预防它们呢 class UserView { private TextField username = new TextField("username"); private Button save;

我有一个带有一些文本字段的基本
BeanFieldGroup
编辑器。我公开了save-
按钮
,以便
演示者
类可以注册到它

问题:当视图中的
TextField
元素存在验证错误时,我希望阻止clickevent的传播(因为无效的输入值需要进一步的用户输入,不应触发任何其他操作)

但是我怎样才能预防它们呢

class UserView {
    private TextField username = new TextField("username");
    private Button save;
    private BeanFieldGroup<User> editor;

    public UserView() {
        editor = new BeanFieldGroup<User>(User.class);

        save = new Button("Save", new ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                try {
                    editor.commit();
                } catch (CommitException e) {
                    //how can I prevent the click event to be routed to the presenter?
                    Notification.show("Form invalid");
                }
            }
        });
    }

    public getSaveBtn() {
        return save;
    }

}


class UserPresenter implements Button.ClickListener {
    void bind() {
        view.getSaveBtn().addClickListener(this);
    }

    @Override
    public void buttonClick(ClickEvent event) {
        //this should be prevented if username field has validation errors in view
        doa.save(entity);
    }
}
class用户视图{
私有文本字段用户名=新文本字段(“用户名”);
私人按钮保存;
私有BeanFieldGroup编辑器;
公共用户视图(){
编辑器=新BeanFieldGroup(User.class);
保存=新建按钮(“保存”,新建ClickListener(){
@凌驾
公共作废按钮单击(单击事件){
试一试{
commit();
}捕获(委员会){
//如何防止单击事件路由到演示者?
通知。显示(“表格无效”);
}
}
});
}
公共getSaveBtn(){
返回保存;
}
}
类UserPresenter实现Button.ClickListener{
无效绑定(){
view.getSaveBtn().addClickListener(此);
}
@凌驾
公共作废按钮单击(单击事件){
//如果用户名字段在视图中有验证错误,则应防止出现这种情况
保存(实体);
}
}

除了为保存按钮注册两个
单击监听器之外,您的代码很好。演示者中的侦听器有效地绕过了
编辑器
字段组的验证逻辑,因为无论字段组的验证结果如何,都会调用它。您需要的是演示者上的一个方法,该方法将在输入成功验证后以独占方式调用

因此,
UserView
中ClickListener的代码应该如下所示:

save = new Button("Save", new ClickListener() {
    @Override
    public void buttonClick(ClickEvent event) {
        try {
            editor.commit();

            // no CommitException thrown until now, so go ahead and tell the presenter:
            presenter.doSave(entity);
        } catch (CommitException e) {
            // validation failed -> don't tell the presenter
            Notification.show("Form invalid");
        }
    }
});

好的,这是可行的,尽管我觉得从设计角度来看,在视图中包含presenter实例是不对的。是的,MVP就是这样工作的:)视图必须能够访问presenter,否则它无法与应用程序的其余部分通信。演示者是视图和模型之间的链接。就reads而言,事实上MVP意味着视图不知道演示者,只知道演示者关于视图。引用博客中的话:“是视图的设计备选方案。它可以在其构造函数中接收侦听器,也可以只知道演示者。”当然,您可以不使用视图对演示者的引用。但是您的代码将变得非常笨拙,因为您需要引入自己的事件/侦听器(例如ValidationSucceedEvent)。我认为这对你来说太过分了。