我有一个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,
感谢您的建议。
答案 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());