我正在学习Vaadin框架。我正在尝试捕获项目单击侦听器的双击事件。但它没有按预期工作。请参考下面的代码,
grid.addItemClickListener(e -> {
if(e.isDoubleClick()) {
System.out.println("Double click");
} else {
System.out.println("Single click");
}
});
当我双击网格项时,它只被视为单击。
正如Doubleclick listener on Vaadin Grid中提到的,问题是setEditorEnabled(true)
,因为这会阻止DoubleClick事件被触发(因为看起来网格上的双击事件是Vaadin使得编辑器可见的触发器)。
我创建了一个似乎有用的解决方法(你应该测试/评估一切真的按预期工作),这样你就可以了:
诀窍是最初禁用编辑器(默认情况下禁用它),然后在ItemClickListener(如果e.isDoubleClick()
)中“自己”启用它。
然后你必须使用一个扩展Grid的类并覆盖方法doCancelEditor()
。在此方法内部(单击取消按钮时单击并在单击保存按钮后(在提交后)调用),然后在按下取消和/或保存按钮后再次禁用编辑器。
ExtendedGrid:
public class ExtendedGrid extends Grid {
@Override
protected void doCancelEditor() {
super.doCancelEditor();
setEditorEnabled(false);
System.out.println("Editor disabled during doCancelEditor");
}
}
MyUI:
@Override
protected void init(VaadinRequest vaadinRequest) {
Grid grid = new ExtendedGrid();
BeanItemContainer<Person> container = new BeanItemContainer<>(Person.class);
container.addBean(new Person("marco", "test"));
grid.setContainerDataSource(container);
grid.addItemClickListener(e -> {
if(e.isDoubleClick()) {
grid.setEditorEnabled(true);
BeanItem item = (BeanItem) e.getItem();
grid.editItem(item.getBean());
System.out.println("Double click");
}
});
setContent(grid);
}