Vaadin 23.1.x Grid:如何阻止组件列按钮触发行itemClickListener?
解决Vaadin 23.1.x中Grid行点击与组件列按钮点击的冲突问题
这是事件冒泡导致的——按钮的点击事件会向上传递到Grid行容器,因此同时触发了两个监听。有两种实用的解决办法:
办法1:在按钮点击时阻止事件冒泡
直接在按钮的点击逻辑里调用stopPropagation(),切断事件向上传播的路径,这样Grid行的监听就不会被触发。
代码示例:
Button actionBtn = new Button("执行操作"); actionBtn.addClickListener(clickEvent -> { // 这里写按钮的业务逻辑 System.out.println("按钮触发:执行操作"); // 阻止事件冒泡到Grid行 clickEvent.stopPropagation(); }); // 把按钮加入Grid的组件列 grid.addComponentColumn(item -> actionBtn);
办法2:在Grid行监听里过滤事件源
如果不想改动按钮的逻辑,可以在Grid的行点击监听中判断事件的源头是不是按钮,是就跳过行的处理逻辑。
代码示例:
grid.addItemClickListener(gridEvent -> { Component eventSource = gridEvent.getSource(); // 只有当触发源不是按钮时,才执行行点击逻辑 if (!(eventSource instanceof Button)) { System.out.println("行触发:选中数据 -> " + gridEvent.getItem()); } });
两种方法都能解决问题,按需选择就行:办法1从根源阻止冒泡,更高效;办法2不用修改组件内部逻辑,适合现有组件不想动的场景。
内容的提问来源于stack exchange,提问作者André Schild
相关产品推荐
相关产品推荐

