You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin Flow 20.0.6自定义ConfirmDialog的addCancelListener不触发问题

问题根因
  • 监听器注册顺序错误:你执行utilsGui.showDialogFromList(listMessages)时,该方法内部已经调用this.open()打开对话框,后续才注册的addCancelListener不会被触发。
  • 自定义取消按钮未绑定事件触发逻辑:Vaadin 20的ConfirmDialog的setCancelButton方法仅替换按钮UI,不会自动绑定取消事件触发逻辑,你自定义的取消按钮点击后没有触发CancelEvent,所以监听器不会回调。
修复步骤
  1. 调整自定义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();
}
  1. 调整调用侧代码顺序,先注册监听器再打开对话框:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:36:08