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

标签 java vaadin vaadin7

我有一个带有一些文本字段的基本 BeanFieldGroup 编辑器。我公开了 save-Button 以便 Presenter 类可以注册到它。

问题:当 View 中的 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);
    }
}

最佳答案

您的代码很好,只是您为保存按钮注册了两个 ClickListeners 。演示者中的监听器有效地规避了 editor FieldGroup 的验证逻辑,因为无论 FieldGroup 验证的结果如何都会调用它。您需要的是演示者上的一个方法,该方法将在输入成功验证后专门调用。

因此,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");
        }
    }
});

关于java - 如果字段存在验证错误,如何防止 ClickEvent 传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23754174/

相关文章:

java - 对不可变类使用最终私有(private)或私有(private) setter

java - 将 Eclipse 项目工作区导入 Apache tomcat 文件夹

java - 如何在Android Studio中将JRE更改为JDK8?

java - 具有生成的属性和排序的 Vaadin 网格

java - Maven 与 Vaadin Bean 验证?

java - 如何从 Vaadin 中的任何地方获取应用程序实例?

java - 如何克服 "double cannot be dereferenced"?

java - vaadin/java - 如何开发 Web 应用程序的多语言版本

java - 在 focframwork GUI 表中,某些单元格显示为空,直到我打开一行进行编辑并返回。由于 "maxCharaters"属性

Vaadin - 如何限制组件的柔软度和重叠?