不能';t使用vaadin 7捕获双击事件

不能';t使用vaadin 7捕获双击事件,vaadin,vaadin7,vaadin-grid,Vaadin,Vaadin7,Vaadin Grid,我正在学习瓦丁框架。我正在尝试捕获项目单击侦听器的双击事件。但它并没有像预期的那样工作。请参考下面的代码 grid.addItemClickListener(e -> { if(e.isDoubleClick()) { System.out.println("Double click"); } else { System.out.println("Single click");

我正在学习瓦丁框架。我正在尝试捕获项目单击侦听器的双击事件。但它并没有像预期的那样工作。请参考下面的代码

grid.addItemClickListener(e -> {
        if(e.isDoubleClick()) {
            System.out.println("Double click");
        } else {
            System.out.println("Single click");             
        }
});
当我双击网格项时,它仅被视为一次单击

问题中提到的是
setEditorEnabled(true)
,因为这可以防止触发双击事件(因为网格上的双击事件似乎是Vaadin内部使编辑器可见的触发器)

我创建了一个似乎有效的工作环境(您应该测试/评估所有事情是否真正按照预期工作),这样您就可以:

  • 双击并添加对双击作出反应的侦听器的可能性
  • 在网格上启用编辑器
  • 诀窍是首先禁用编辑器(默认情况下禁用),然后在ItemClickListener中“自己”启用它(如果
    e.isDoubleClick()

    然后您必须使用一个类来扩展网格并重写方法
    doCancelEditor()
    。在该方法中(当单击“取消”按钮时调用该方法,和单击“保存”按钮后调用该方法(提交后)),然后在按下“取消”和/或“保存”按钮后再次禁用编辑器

    扩展网格:

    public class ExtendedGrid extends Grid {
    
        @Override
        protected void doCancelEditor() {
            super.doCancelEditor();
            setEditorEnabled(false);
            System.out.println("Editor disabled during doCancelEditor");
        }
    }
    
    MyUI:

    @覆盖
    受保护的void init(VaadinRequest VaadinRequest){
    Grid Grid=新的扩展网格();
    BeanItemContainer=新的BeanItemContainer(Person.class);
    addBean(新人(“马可”,“测试”));
    grid.setContainerDataSource(容器);
    grid.addItemClickListener(e->{
    如果(如isDoubleClick()){
    grid.setEditorEnabled(true);
    BeanItem item=(BeanItem)e.getItem();
    editItem(item.getBean());
    System.out.println(“双击”);
    }
    });
    设置内容(网格);
    }
    
    谢谢@codinghaus。这个解决方案在我们双击时运行良好,但它也调用了我为单键单击编写的功能。例如,对于一次单击,我们有记录的弹出窗口,其中详细显示了信息。因此,双击调用了单键单击和双击的功能。有什么建议吗?所以您添加了第二个侦听器,带有
    if(!e.isDoubleClick())
    ?我没有尝试过,但我想说这是工作的预期。双击包括一次单击和随后的第二次单击。所以我认为触发两个单击侦听器是可以的。代码如何知道第一次单击不是“真正的”单击,而是双击的一部分?必须有一种机制,在单击后等待,并查看是否有第二次单击。。我想你不能那样做。也许你应该将“打开信息弹出”逻辑移动到一个按钮上,而不是“单击”打开它。谢谢你的建议@codinghaus
        @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);
        }