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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 01:54:03