Vaadin Flow 20.0.6自定义ConfirmDialog的addCancelListener不触发问题
问题根因
- 监听器注册顺序错误:你执行
utilsGui.showDialogFromList(listMessages)时,该方法内部已经调用this.open()打开对话框,后续才注册的addCancelListener不会被触发。 - 自定义取消按钮未绑定事件触发逻辑:Vaadin 20的
ConfirmDialog的setCancelButton方法仅替换按钮UI,不会自动绑定取消事件触发逻辑,你自定义的取消按钮点击后没有触发CancelEvent,所以监听器不会回调。
修复步骤
- 调整自定义
showDialogFromList方法中取消按钮的逻辑,添加点击事件触发取消事件:
public void showDialogFromList(ArrayList<EntityMessage> listMessage) { ......... this.setText(new Html("<div>"+message+"</div>").getElement()) Image imgOk = new Image(ICO_OK16,"ok"); Button buttonYes = new Button("συνέχεια"); buttonYes.setIcon(imgOk); this.setConfirmButton(buttonYes); this.addConfirmListener(event -> { this.close(); }); Image imgCancel = new Image(ICO_CANCEL16,"cancel"); Button buttonNo = new Button("άκυρο"); buttonNo.setIcon(imgCancel); // 新增:点击取消按钮时触发ConfirmDialog的取消事件 buttonNo.addClickListener(clickEvent -> { fireEvent(new ConfirmDialog.CancelEvent(this, true)); close(); }); this.setCancelButton(buttonNo); this.open(); }
- 调整调用侧代码顺序,先注册监听器再打开对话框:
UtilsGui utilsGui = new UtilsGui(); // 先注册取消监听器 utilsGui.addCancelListener( e->{ System.out.println(" ------A checkForListMessages utilsGui.showMessageFromList return intListMessages:"+utilsGui.getDialogResult()); utilsGui.close(); }); // 最后调用方法打开对话框 utilsGui.showDialogFromList(listMessages);
补充说明
如果后续需要监听确认按钮的点击事件,也可以给自定义的确认按钮添加触发ConfirmEvent的逻辑,保持事件机制统一。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

