Vaadin-> BeanFieldGroup滚动页面到不正确填充的字段

时间:2015-10-07 08:53:16

标签: hibernate vaadin bean-validation

我有一个Bean

@Entity
@Table(name = "t_beans1")
public class Bean1 implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;
    @NotNull(message = "empty")
    @Size(min = 2, max = 200)
    private String a00_01 = "";
...}

在我的布局中,我将它与BeanFieldGroup绑定

final BeanFieldGroup<Bean1> binder = new BeanFieldGroup<Bean1>(Bean1.class);
....
 vl00.addComponent(binder.buildAndBind(((MyUI) MyUI.getCurrent()).stringResource.getString("00.01"), "a00_01", TextField.class));

并提交:

 Button submit = new Button(((MyUI) MyUI.getCurrent()).stringResource.getString("submit"));
    submit.setSizeUndefined();
    submit.addClickListener(event -> {
                try {
                    binder.commit();
((MyUI) MyUI.getCurrent()).bean1Service.insert(binder.getItemDataSource().getBean());
}
catch (FieldGroup.CommitException e)
{ /*here i need to scroll to unproperly filled field**/}}

一切正常,bean验证工作正常,填写不正确的字段标记对应我的样式(例如红框)。 但! 我的问题是:检测滚动页面是否有不正确填充字段的机制?

PS:我正在使用hibernate-validator.4.3.2.Final,Vaadin 7.5.6,

感谢您的建议。

2 个答案:

答案 0 :(得分:0)

如果您可以访问要滚动到的组件实例,则可以使用scrollIntoView类上的UI方法:

TextField textField = new TextField();

...

getUI().scrollIntoView(textField);

答案 1 :(得分:0)

可以从异常对象中获取有关无效字段的信息:

} catch (FieldGroup.CommitException e) {
    String invalidFieldsNames = e.getInvalidFields().keySet().stream().map(Component::getCaption).collect(Collectors.joining(", "));
    Notification.show("Invalid fields: ", invalidFieldsNames, Notification.Type.ERROR_MESSAGE);
}

您可以使用@HenriKerola答案将视图滚动到任何无效字段。

简单解决方案:首先,您可以将所有字段保存在某个容器中,在catch中,您应该找到无效字段的标题,然后使用您自己的映射滚动到右侧组件(从容器中获取)。或者选择任何:

getUI().scrollIntoView(e.getInvalidFields().keySet().iterator().next());