如何编写公共Dialog的点击监听,实现数据自定义回写Form的TextField
实现方案
核心思路是通过回调接口将不同场景的自定义逻辑(回写规则、特殊查询)从公共Dialog中剥离,Dialog只负责客户选择的通用交互逻辑,业务侧的个性化逻辑由各个Form自己实现后注入Dialog即可。
1. 定义客户选择回调接口
先抽象出选中客户后的动作契约,所有需要使用客户选择Dialog的Form都可以按需实现该接口:
// 回调接口定义 public interface CustomerSelectListener { // 参数为选中的客户数据实体 void onCustomerSelected(Customer selectedCustomer); } // 客户数据实体示例 public class Customer { private String custNo; private String custName; // 其他需要的字段 // getter、setter省略 }
2. 封装公共客户选择Dialog
Dialog内部仅保留通用交互逻辑,对外暴露回调注入入口:
public class CustomerSelectDialog extends Dialog { private final CustomerSelectListener selectListener; // 客户列表表格、搜索框等通用组件省略 // 构造方法注入回调,也可以根据需求加其他配置参数(比如客户列表过滤条件) public CustomerSelectDialog(CustomerSelectListener selectListener) { this.selectListener = selectListener; initUI(); // 初始化Dialog的布局、客户列表加载等通用逻辑 initOkButtonListener(); } private void initOkButtonListener() { Button okBtn = new Button("确认选择"); okBtn.addClickListener(event -> { // 通用逻辑:获取表格中选中的客户 Customer selectedCustomer = customerTable.getSelectionModel().getSelectedItem().orElse(null); if (selectedCustomer == null) { // 通用未选中提示 Notification.show("请先选择客户"); return; } // 触发注入的回调,把选中数据传给调用方 selectListener.onCustomerSelected(selectedCustomer); // 关闭弹窗 this.close(); }); } }
3. 不同Form按需注入自定义回调
场景1:仅需回填cust_no、cust_name
// 普通Form中打开Dialog的按钮点击逻辑 TextField custNoField = new TextField("客户编号"); TextField custNameField = new TextField("客户名称"); Button selectCustBtn = new Button("选择客户"); selectCustBtn.addClickListener(event -> { // 注入当前场景的回写逻辑 new CustomerSelectDialog(selectedCustomer -> { custNoField.setValue(selectedCustomer.getCustNo()); custNameField.setValue(selectedCustomer.getCustName()); }).open(); });
场景2:需要额外回填消费金额
// 带消费金额字段的Form中调用 TextField custNoField = new TextField("客户编号"); TextField custNameField = new TextField("客户名称"); TextField custAmtField = new TextField("消费金额"); Button selectCustBtn = new Button("选择客户"); selectCustBtn.addClickListener(event -> { new CustomerSelectDialog(selectedCustomer -> { // 通用回写 custNoField.setValue(selectedCustomer.getCustNo()); custNameField.setValue(selectedCustomer.getCustName()); // 当前场景的特殊逻辑:查询消费金额回填 BigDecimal custAmt = customerService.queryConsumeAmt(selectedCustomer.getCustNo()); custAmtField.setValue(custAmt.toString()); }).open(); });
4. 特殊查询场景扩展
如果部分Form需要Dialog加载客户列表时使用特殊过滤规则(比如只查询VIP客户、只查询当月有消费的客户),可以再扩展Dialog的配置项:
- 方案1:构造方法新增过滤参数,Dialog内部的查询逻辑根据参数动态拼接过滤条件
- 方案2:新增客户查询回调接口,由调用方实现客户列表的查询逻辑注入Dialog,适配完全自定义的查询需求
注意事项
- 回调中如果有UI组件操作,需要确保执行在UI线程内,避免跨线程更新UI异常
- 可以按需扩展回调方法,新增取消选择、多选等场景的支持
内容的提问来源于stack exchange,提问作者Air Wei
相关产品推荐
相关产品推荐

