如何在Java Swing的JTable组件中展示Oracle数据库的表数据
JTable 数据库数据展示实现指南
现有代码存在的核心问题
- 冗余创建了
table_1并手动塞给滚动窗格的列头视图,会出现双层表格叠加、列头显示异常的问题,该逻辑属于无效代码,可直接删除 - 数据库查询得到的
studentList没有和表格组件建立数据绑定,哪怕拿到了完整数据,界面也不会有任何显示 - Add按钮中操作的
studList是方法局部变量,和全局的学生列表不是同一个对象,新增的数据既不会持久化到全局列表,也不会同步到表格 - 数据库操作的连接、语句、结果集没有自动回收机制,长期运行会出现数据库连接泄漏
标准实现流程
JTable本身不负责数据存储,所有数据交互都要通过其绑定的TableModel完成,最常用的就是你已经初始化好的DefaultTableModel:
- 每次加载数据前,先通过
table.getModel()强转拿到表格绑定的模型实例 - 调用模型的
setRowCount(0)清空所有旧行数据,避免重复加载时数据叠加 - 遍历从数据库/内存中拿到的Student列表,按照你预先定义的列顺序(ID、FN、LN)组装成Object数组
- 调用模型的
addRow()方法把组装好的数据逐行添加,模型会自动触发界面重绘,不需要手动写重绘逻辑
修正后的核心代码
Refresh按钮的查询展示逻辑(替换原有事件代码)
btnRefresh.addActionListener(e -> { // 获取当前表格的模型 DefaultTableModel tableModel = (DefaultTableModel) table.getModel(); // 清空原有表格行 tableModel.setRowCount(0); // try-with-resources 自动回收数据库资源 try (Connection con = ConnectionDB.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from student")) { studentList = new ArrayList<>(); while(rs.next()) { int id = rs.getInt("id"); String fn = rs.getString("fn"); String ln = rs.getString("ln"); // 存入全局列表 Student stu = new Student(id, fn, ln); studentList.add(stu); // 同步添加到表格 tableModel.addRow(new Object[]{id, fn, ln}); } } catch (SQLException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog(null, "读取数据失败:" + e1.getMessage()); } });
Add按钮的新增同步逻辑(替换原有事件代码)
btnAdd.addActionListener(e -> { try { // 读取输入框内容 int id = Integer.parseInt(textID.getText().trim()); String fn = textFN.getText().trim(); String ln = txtLN.getText().trim(); // 构建学生对象 Student newStu = new Student(id, fn, ln); // 存入全局列表 studentList.add(newStu); // 同步到表格 DefaultTableModel tableModel = (DefaultTableModel) table.getModel(); tableModel.addRow(new Object[]{id, fn, ln}); // 清空输入框 textID.setText(""); textFN.setText(""); txtLN.setText(""); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(frame, "ID输入必须为数字格式"); } });
需要删除的无效代码
直接删掉以下两行,避免列头渲染异常:
table_1 = new JTable(); scrollPane.setColumnHeaderView(table_1);
同时可以把类里定义的private JTable table_1;成员变量一起删掉,减少冗余代码。
内容的提问来源于stack exchange,提问作者WildThing
相关产品推荐
相关产品推荐

