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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 05:06:03