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

使用DefaultTableModel从CachedRowSet填充JTable列名未更新,如何自动取数据库列名

原因说明
  • 你当前的代码仅向已存在的DefaultTableModel中插入行数据,从未更新过模型的列定义,JTable的列标题直接绑定TableModel的columnIdentifiers属性,你没有修改该属性自然不会自动更新。
  • 原代码存在逻辑错误:遍历行时的内层循环使用studentdetails.getMaxRows()做判断完全多余,会导致每行重复插入多次id、names字段,造成列数异常。
自动获取数据库列名的解决方案

你可以通过CachedRowSet的元数据ResultSetMetaData自动获取列名,直接更新到DefaultTableModel中即可,修正后的客户端代码如下:

public studentdetails() {
    initComponents();
    try {           
        Interface b = (Interface) Naming.lookup("rmi://localhost:1099/Server");
        DefaultTableModel tblModel = (DefaultTableModel)studentdetailstable.getModel();
        CachedRowSet studentdetails = b.getArray();
        // 从结果集元数据获取列名
        ResultSetMetaData meta = studentdetails.getMetaData();
        int columnCount = meta.getColumnCount();
        Vector<String> columnNames = new Vector<>();
        for (int i = 1; i <= columnCount; i++) {
            // 可以用getColumnLabel获取别名,用getColumnName获取原始表列名
            columnNames.add(meta.getColumnLabel(i));
        }
        // 更新模型的列定义,同时会清空原有行数据
        tblModel.setColumnIdentifiers(columnNames);
        // 填充行数据
        while(studentdetails.next()) {
            Vector row = new Vector();
            for (int i = 1; i <= columnCount; i++) {
                row.add(studentdetails.getObject(i));
            }
            tblModel.addRow(row);
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    } 
}
额外注意事项
  • 你提供的实现层代码存在笔误:声明的CachedRowSet变量名为details,但调用populate方法时写的是fruitDetails.populate(rs),会直接编译报错,需要统一变量名。
  • 如果SQL语句使用了列别名,调用meta.getColumnLabel(i)可以获取别名作为列标题,比getColumnName更贴合业务展示需求。

内容的提问来源于stack exchange,提问作者Clean Code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:00