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

如何从含Radio组件的ZK Listbox中获取数据并通过POJO持久化?

没问题,我来一步步帮你搞定这个需求,从定义数据模型到最终把数据存进数据库,咱们一步一步来:

1. 先定义存储每行数据的POJO类

首先得有个POJO来对应每行的Label值和Radio选中状态,用枚举来规范可选的Radio选项会更严谨,避免出现非法值:

public class RowData {
    // 单元格的Label文本
    private String cellLabel;
    // 选中的Radio选项,用枚举限定可选值
    private SelectedOption selectedOption;

    // 构造器,初始化Label并设置默认选中状态
    public RowData(String cellLabel) {
        this.cellLabel = cellLabel;
        this.selectedOption = SelectedOption.NONE; // 默认未选中
    }

    // 枚举定义三个Radio选项+未选中状态
    public enum SelectedOption {
        OPTION1, OPTION2, OPTION3, NONE
    }

    // getter和setter方法
    public String getCellLabel() { return cellLabel; }
    public void setCellLabel(String cellLabel) { this.cellLabel = cellLabel; }
    public SelectedOption getSelectedOption() { return selectedOption; }
    public void setSelectedOption(SelectedOption selectedOption) { this.selectedOption = selectedOption; }
}
2. 配置Listbox和自定义ListitemRenderer

接下来在ZUL里定义Listbox,然后通过Renderer渲染每行内容,重点是给Radio绑定选中事件,让选中状态直接同步到对应的POJO里:

ZUL页面部分

<listbox id="dataListbox" model="${vm.rowDataList}" width="100%">
    <listhead>
        <listheader label="标签列"/>
        <listheader label="选项列"/>
    </listhead>
</listbox>
<button label="保存到数据库" onClick="@command('saveData')"/>

自定义ListitemRenderer实现

public class CustomRowRenderer implements ListitemRenderer<RowData> {

    @Override
    public void render(Listitem item, RowData rowData, int index) throws Exception {
        // 渲染第一列的Label
        Listcell labelCell = new Listcell(rowData.getCellLabel());
        labelCell.setParent(item);

        // 渲染第二列的三个Radio
        Listcell radioCell = new Listcell();
        radioCell.setParent(item);

        // 同一行的Radio用同一个group,但不同行的group要唯一(避免跨行选中干扰)
        String radioGroup = "rowRadio_" + index;

        // 第一个Radio
        Radio radio1 = new Radio("选项1");
        radio1.setGroup(radioGroup);
        radio1.setChecked(rowData.getSelectedOption() == RowData.SelectedOption.OPTION1);
        // 绑定选中事件,同步到POJO
        radio1.addEventListener(Events.ON_CHECK, event -> {
            Radio source = (Radio) event.getTarget();
            if (source.isChecked()) {
                rowData.setSelectedOption(RowData.SelectedOption.OPTION1);
            }
        });
        radio1.setParent(radioCell);

        // 第二个Radio
        Radio radio2 = new Radio("选项2");
        radio2.setGroup(radioGroup);
        radio2.setChecked(rowData.getSelectedOption() == RowData.SelectedOption.OPTION2);
        radio2.addEventListener(Events.ON_CHECK, event -> {
            Radio source = (Radio) event.getTarget();
            if (source.isChecked()) {
                rowData.setSelectedOption(RowData.SelectedOption.OPTION2);
            }
        });
        radio2.setParent(radioCell);

        // 第三个Radio
        Radio radio3 = new Radio("选项3");
        radio3.setGroup(radioGroup);
        radio3.setChecked(rowData.getSelectedOption() == RowData.SelectedOption.OPTION3);
        radio3.addEventListener(Events.ON_CHECK, event -> {
            Radio source = (Radio) event.getTarget();
            if (source.isChecked()) {
                rowData.setSelectedOption(RowData.SelectedOption.OPTION3);
            }
        });
        radio3.setParent(radioCell);

        // 把POJO绑定到Listitem,方便后续其他操作获取
        item.setAttribute("rowData", rowData);
    }
}

在ViewModel/Controller中初始化Listbox

@Wire
private Listbox dataListbox;

// 存储所有行数据的列表,作为Listbox的数据源
private List<RowData> rowDataList = new ArrayList<>();

@Init
public void init() {
    // 初始化测试数据,实际可从数据库/接口加载
    rowDataList.add(new RowData("第一行标签"));
    rowDataList.add(new RowData("第二行标签"));
    rowDataList.add(new RowData("第三行标签"));

    // 设置Renderer和Model
    dataListbox.setItemRenderer(new CustomRowRenderer());
    dataListbox.setModel(new ListModelList<>(rowDataList));
}
3. 收集数据并保存到数据库

当点击保存按钮时,直接遍历rowDataList就能拿到每行的Label和Radio选中状态,再用你熟悉的数据库方式(JDBC/MyBatis/Hibernate等)保存:

保存方法示例(JDBC版)

@Command
public void saveData() {
    String insertSql = "INSERT INTO your_table (cell_label, selected_option) VALUES (?, ?)";

    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_db", "user", "password");
         PreparedStatement pstmt = conn.prepareStatement(insertSql)) {

        for (RowData row : rowDataList) {
            pstmt.setString(1, row.getCellLabel());
            // 把枚举转成字符串存入数据库
            pstmt.setString(2, row.getSelectedOption().name());
            pstmt.addBatch();
        }

        // 批量执行插入
        pstmt.executeBatch();
        Messagebox.show("数据保存成功!");
    } catch (SQLException e) {
        e.printStackTrace();
        Messagebox.show("保存失败:" + e.getMessage());
    }
}
关键注意事项
  • Radio组唯一性:同一行的Radio用同一个group,不同行的group要加索引区分,不然会出现跨行只能选一个的问题。
  • 数据同步:Radio的选中事件直接修改绑定的POJO属性,不需要额外去DOM里查找值,逻辑更清晰。
  • 初始状态回显:渲染时根据POJO的selectedOption设置Radio的初始选中状态,编辑已有数据时能正确显示之前的选择。

内容的提问来源于stack exchange,提问作者Arturo Amalfi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:44:40