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

Java新手技术咨询:如何实现将MySQL数据库中的数据行加载至JTable组件

解决MySQL数据展示到JTable的问题

我帮你排查了代码里的几个关键问题,这些问题导致点击Load按钮后JTable无法正确显示数据。咱们一步步修复:

主要问题分析

  • 静态数组限制:你用固定长度的String data[][]= new String[8][7];存储数据,数据库记录数可能和8不匹配,要么数组越界要么出现空行,应该用动态集合来存储数据。
  • JTable初始化时机错误:先创建JTable再填充数据,JTable的模型不会自动感知数组变化,必须先读取完所有数据再创建表格。
  • 重复添加组件:每次点击按钮都会向p2添加新的JScrollPane,导致界面出现多个表格,需要先移除旧的表格组件。
  • 数据库资源泄漏:Connection、PreparedStatement、ResultSet使用后未关闭,会耗尽数据库连接池资源。
  • 语法小错误:数据库连接语句里密码参数的引号未闭合,导致编译错误。

修改后的代码实现

下面是调整后的loadBtn事件监听代码,同时优化了布局逻辑让表格展示更合理:

//Load Catches from MySQL database
loadBtn.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        // 先移除p2中已有的表格组件(避免重复添加)
        Component[] components = p2.getComponents();
        for(Component comp : components){
            if(comp instanceof JScrollPane){
                p2.remove(comp);
            }
        }
        // 通知布局更新
        p2.revalidate();
        p2.repaint();

        Connection conn = null;
        PreparedStatement preparedStmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 注意:补全密码和闭合引号,替换成你的实际数据库密码
            conn = DriverManager.getConnection("jdbc:mysql://localhost/sys","root","你的数据库密码");
            String query = "SELECT * FROM FishEntry;";
            preparedStmt = conn.prepareStatement(query);
            rs = preparedStmt.executeQuery();

            // 用动态集合存储数据,避免固定长度数组的问题
            ArrayList<ArrayList<String>> dataList = new ArrayList<>();
            String column[]={"FishId","Species","Length", "Weight", "Date", "Location", "Additional Info"};

            while(rs.next()) {
                ArrayList<String> row = new ArrayList<>();
                row.add(String.valueOf(rs.getInt("FishId")));
                row.add(rs.getString("Species"));
                row.add(rs.getString("Length"));
                row.add(rs.getString("Weight"));
                row.add(rs.getString("Date"));
                row.add(rs.getString("Location"));
                row.add(rs.getString("AdditionalInfo"));
                dataList.add(row);
            }

            // 把ArrayList转成二维数组,用于创建JTable
            String[][] data = new String[dataList.size()][column.length];
            for(int i=0; i<dataList.size(); i++){
                data[i] = dataList.get(i).toArray(new String[0]);
            }

            // 创建JTable和滚动面板
            JTable fishTable = new JTable(data, column);
            fishTable.setFillsViewportHeight(true); // 让表格占满滚动面板高度
            JScrollPane sp = new JScrollPane(fishTable);

            // 修改p2的布局为BorderLayout,让组件合理分配空间
            p2.setLayout(new BorderLayout());
            p2.add(tab2Label, BorderLayout.NORTH);
            p2.add(sp, BorderLayout.CENTER);
            p2.add(loadBtn, BorderLayout.SOUTH);

            // 再次更新布局,确保组件刷新
            p2.revalidate();
            p2.repaint();

        } catch (SQLException | ClassNotFoundException d) {
            d.printStackTrace(); // 用printStackTrace更方便排查具体错误
        } finally {
            // 关闭数据库资源,避免连接泄漏
            try {
                if(rs != null) rs.close();
                if(preparedStmt != null) preparedStmt.close();
                if(conn != null) conn.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
});

额外优化建议

  • 使用TableModel代替二维数组:可以直接用DefaultTableModel,后续修改数据时表格会自动更新,无需重新创建JTable,示例代码如下:
    DefaultTableModel model = new DefaultTableModel(column, 0);
    while(rs.next()){
        Object[] rowData = {
            rs.getInt("FishId"),
            rs.getString("Species"),
            rs.getString("Length"),
            rs.getString("Weight"),
            rs.getString("Date"),
            rs.getString("Location"),
            rs.getString("AdditionalInfo")
        };
        model.addRow(rowData);
    }
    JTable fishTable = new JTable(model);
    
  • 异常处理优化:可以用JOptionPane弹出错误提示框,让用户直观看到错误,而不是仅在控制台输出。
  • 布局管理器:尽量避免使用setBounds和null布局,使用Swing自带的布局管理器(如BorderLayout、GridBagLayout)可以让界面在不同窗口大小下更适配。

内容的提问来源于stack exchange,提问作者brxdn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:19:11