Java Swing JDBC项目中JTable刷新按钮触发数据重复显示问题
重复数据问题的核心原因
- 刷新按钮的事件逻辑存在设计缺陷:每次触发刷新时,代码直接获取表格绑定的
DefaultTableModel,没有清空模型中已经保存的旧数据,就直接将数据库查询返回的全量学生数据逐行通过addRow()追加到模型末尾。 - 对应实际现象:数据库共10条数据,第一次刷新时空模型加载10行,表格显示10条;第二次刷新时模型保留之前的10行,再追加查询到的10行,最终显示20条重复数据,和描述的问题完全匹配。
具体修复方法
在刷新逻辑加载新数据之前,先清空表格模型内的所有旧行即可:
- 在获取到
DefaultTableModel对象之后、遍历结果集加载数据之前,添加tableModel.setRowCount(0);这行代码会重置模型的行数为0,彻底清空所有已存在的旧数据,后续追加的查询结果就是干净的全量最新数据,不会再出现堆叠重复的问题。
修正后的刷新事件核心代码片段:
DefaultTableModel tableModel = (DefaultTableModel) table.getModel(); // 清空模型内的所有旧数据,解决重复追加问题 tableModel.setRowCount(0); Class.forName("com.mysql.jdbc.Driver"); java.sql.Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root"); java.sql.Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("select * from student order by id"); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); tableModel.addRow(new Object[] {id, name}); } // 按照JDBC规范关闭资源 rs.close(); stmt.close(); connection.close();
可顺带优化的代码问题
- 移除代码中冗余的强制类型转换:
DriverManager.getConnection()返回的本身就是java.sql.Connection实例,不需要再次强制转换;同时删除错误导入的com.sun.jdi.connect.spi.Connection、com.mysql.cj.xdevapi.Statement等无关类引用,避免类加载冲突。 - 当前代码使用空绝对布局定位组件,且没有将
JTable放入JScrollPane中,当表格数据量较大或者窗口尺寸变化时,会出现表头不显示、内容被截断的问题,建议将table实例用JScrollPane包裹后再添加到窗口中。 - 所有数据库操作结束后需要显式关闭Connection、Statement、ResultSet资源,避免数据库连接泄漏。
内容的提问来源于stack exchange,提问作者Mr.Roy
相关产品推荐
相关产品推荐

