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

Vaadin-> BeanFieldGroup scroll page to improperly filled field

我有一颗豆子

@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,

感谢您的建议。

如果您有权访问要滚动到的组件实例,则可以在 UI class:

上使用 scrollIntoView 方法
TextField textField = new TextField();

...

getUI().scrollIntoView(textField);

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

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