使用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
相关产品推荐
相关产品推荐

