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

如何编写公共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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:48:03