【问题标题】:Simple show database data in JTable在 JTable 中简单显示数据库数据
【发布时间】:2013-07-28 22:51:21
【问题描述】:

我有一个结构简单的JTable,我想用数据库数据填充它。

我写了这段代码,但现在不知道如何继续!

【问题讨论】:

  • 您目前遇到的问题是什么?正如我所看到的,您永远不会修改您的 data[][] 和 cols[] 数组,它们是空值,因此您要么得到一些异常,要么您的表为空。
  • 您有什么具体问题,或者您只是想学习如何使用 JTable?如果是后者,网上有很多教程可以参考。
  • 我认为你在一节课上要做的事情太多了。将问题分解成可以单独测试的部分。在您担心 Swing 或 UI 之前,让数据库部分自行工作。
  • 这个String[] rowdata = new String[500] 是个坏主意。你怎么知道预期的行数?你可能会溢出数组。同样,您可能会使数组下溢,留下大量空行。请改用List 类型。如果我可以避免的话,我也非常不愿意在表中混合我的数据库逻辑......但这只是我;)

标签: java database swing jdbc


【解决方案1】:

在 JTable 中简单显示数据库数据

无需创建自定义 TableModel。

请参阅Table From Database 中的Table From Database Example 代码,了解将数据加载到 DefaultTableModel 并在 JTable 中显示模型的简单方法。

【讨论】:

  • 我需要创建一个自定义的TableMode,像这样。我认为我的主要问题是将数据发送到数组或向量中,然后创建表模型。
  • camickr 是 Swing 专家。当他告诉你一个 DefaultTableModel 就足够时,你应该倾听并尝试一下。
【解决方案2】:

任何愚蠢到包含一个空的 catch 块的人肯定会挣扎:

} catch (SQLException ex) {
    }

这是一个非常糟糕的主意。您应该至少记录或打印堆栈跟踪,或者在方法签名中添加 throws 子句并在其他地方处理。

你的代码风格也很差。可读性很重要。发展一种连贯的风格并坚持下去。

【讨论】:

    【解决方案3】:

    这个异常是因为 cols 变量没有在任何地方初始化。

    因此您应该初始化 TableModels 构造函数中或 TableModel 之外的所有字段。

    好吧,那么您不应该在 TableModels 的主要方法中使用 metaData 或任何类型的使用数据库。

    就在构造函数中或 TableModel 之外。

    像这样。试试:

    class d9tableModel extends AbstractTableModel {
    
    Connection con;
    Statement statement;
    ResultSetMetaData metadata;
    ResultSet resultSet;
    String dbName = "mydb";
    String bdUser = "root";
    String dbPassword = "2323";
    String dbUrl = "jdbc:mysql://localhost/mydb";
    String query = "select * from mytable";
    ArrayList<String> cols = new ArrayList<>();
    ArrayList<ArrayList<String>> data = new ArrayList<>();
    
    public d9tableModel() {
    
        try {
            con = DriverManager.getConnection(dbUrl, bdUser, dbPassword);
            System.out.println("Connected to database successfully!");
            statement = con.createStatement();
            resultSet = statement.executeQuery(query);
    
            int c = resultSet.getMetaData().getColumnCount();
            for (int i = 0; i < c; i++) {
                cols.add(resultSet.getMetaData().getColumnName(i));
            }
    
            while (resultSet.next()) {
                ArrayList<String> row = new ArrayList<>();
                for (int i = 0; i < c; i++) {
                    row.add(resultSet.getString(i));
                }
                data.add(row);
            }
        } catch (SQLException ex) {
            System.out.println("Could not connect to database");
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (SQLException ex) {
                Logger.getLogger(d9tableModel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    @Override
    public int getRowCount() {
        return data.size();
    }
    
    @Override
    public int getColumnCount() {
        return cols.size();
    }
    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        ArrayList<String> row = data.get(rowIndex);
        return row.get(columnIndex);
    }
    
    @Override
    public String getColumnName(int column) {
        return cols.get(column);
    }}
    

    此表模型将您的数据库表精确映射到您的 JTable 中。

    对不起,我的英语不好。

    祝你好运。

    【讨论】:

    • @kleopatra 我运行这段代码,只显示了第一列!将i &lt; =c 添加到循环后,问题解决了!
    • @Sajjad,您正确地发现了错误,基本问题是您未完全修复它:仅调整上限,而不是下限:-) Omid,结果集中的索引是基于 1 的,不是从 0 开始的,您需要适当地编辑和修复循环。
    猜你喜欢
    • 2011-07-18
    • 2012-08-28
    • 1970-01-01
    • 2011-08-03
    • 2014-05-06
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多