如何将ArrayList中的数据动态展示到JTable中
问题原因
- 你的
getAll方法返回的是嵌套ArrayList结构:外层List的每个元素对应数据库的一行记录,每个行元素本身也是ArrayList,存储当前行的每一列值。无法直接强转为一维Object数组,也不能直接传入TableModel。 - 现有
getAll方法存在隐藏bug:遍历列的循环条件为x < totalColumn,JDBC ResultSet的列下标从1开始,该写法会漏掉最后一列数据,需要先修改为x <= totalColumn。
修复步骤
1. 先修复getAll方法的列遍历问题
public ArrayList<Object> getAll() { try { ArrayList<Object> resultList = new ArrayList<>(); query = this.conn.prepareStatement("select * from " + this.currentTable + this.tableClass.getWhere()); ResultSet result = query.executeQuery(); ResultSetMetaData meta = result.getMetaData(); int totalColumn = meta.getColumnCount(); while(result.next()) { ArrayList<Object> obj = new ArrayList<>(); // 修改循环条件,避免漏掉最后一列 for (int x = 1; x <= totalColumn; x++) { obj.add(result.getObject(x)); } resultList.add(obj); } result.close(); query.close(); return resultList; } catch (Exception e) { System.out.println("Error : " + e.getMessage()); } return null; }
2. 填充DefaultTableModel的实现代码
如果暂时不需要显示数据库真实列名,可以按列数生成默认列名再填充数据:
DefaultTableModel model = new DefaultTableModel(); ArrayList<Object> dataList = this.getAll(); // 增加非空判断避免空指针异常 if (dataList != null && !dataList.isEmpty()) { // 按第一行的列数生成默认列名,也可以自定义替换成业务需要的列名 int columnCount = ((ArrayList<Object>)dataList.get(0)).size(); for (int i = 0; i < columnCount; i++) { model.addColumn("列" + (i+1)); } // 遍历每一行数据,转成数组后加入表格模型 for (Object rowObj : dataList) { ArrayList<Object> rowList = (ArrayList<Object>) rowObj; model.addRow(rowList.toArray()); } } tableResult.setModel(model);
如果需要显示数据库真实列名,修改getAll方法,从ResultSetMetaData中取出列名集合和数据一起返回即可。
内容的提问来源于stack exchange,提问作者smzapp
相关产品推荐
相关产品推荐

