首页 > 解决方案 > tableModel.addRow() 未在 JTable 中显示任何内容,但行对象具有值

问题描述

我在 swing 中使用 JTable 来显示 MySQL 表,虽然表值存在于行对象中(如屏幕截图中的输出所示),但应用程序中的 jtable 为空。屏幕截图中的输出包含 Object[] 数组,但是当我在 addRow 方法中传递它时,它不会在 JTable GUI 上显示任何内容。

private void tableSubmitButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    //fetch the name of the database to be created
    String dbName = tableDBName.getText();
    //fetch the root password 
    String password = new String(tableDBPass.getPassword());
    // fetch table name
    String tableName = tableTableName.getText();        

    DefaultTableModel tableModel = (DefaultTableModel)tableViewTable.getModel();
    int rowCount = tableModel.getRowCount();
    for(int i = 0; i<rowCount; i++){
        tableModel.removeRow(0);
    }

    try{
        // create connection
        CreateConnection newCon = new CreateConnection();
        Statement newStat = newCon.initiate(dbName, password);

        // result set contains the data fetched from the MySQL table
        ResultSet rs = newStat.executeQuery("select * from "+tableName);

        // get column names and column count
        ResultSetMetaData metaData = rs.getMetaData();
        int n_columns = metaData.getColumnCount();

        ArrayList<String> columnNames = new ArrayList<>();


        for(int i = 1; i<=n_columns; i++){
            columnNames.add(metaData.getColumnName(i));
        }


        while(rs.next()){
            ArrayList row = new ArrayList(n_columns);

            for(int i = 1; i<=n_columns; i++){
                row.add(rs.getObject(i));
            }
            Object[] obj = row.toArray();
            tableModel.addRow(obj);
            System.out.println("table updated..: "+Arrays.toString(obj));
        }
    }catch(SQLException e){
        System.out.println(e.getMessage());
    }

}

截屏

除此之外,当您在表单中插入 JTable 时,我删除了最初存在的所有行。

标签: javamysqlswingjava-8jtable

解决方案


DefaultTableModel tableModel = (DefaultTableModel)tableViewTable.getModel();

因此,您从一个空的 TableModel 开始,这意味着该模型没有列或行。

因此,即使您调用 addRow() 方法,您的模型也没有列,因此 JTable 中没有任何内容可显示

ArrayList<String> columnNames = new ArrayList<>();

for(int i = 1; i<=n_columns; i++){
     columnNames.add(metaData.getColumnName(i));
 }

上面的代码什么都不做。它所做的只是向 ArrayList 添加一些数据,但从未使用过该 ArrayList。

你想做的是:

  1. 使用 a Vector,而不是 ArrayList
  2. 然后你需要创建一个DefaultTableModel只有列名的空。阅读相应构造函数的 API。

然后在您想要遍历 ResultSet 的逻辑中:

  1. 再次Vector对每一行数据使用
  2. 将数据添加到 Vector
  3. 调用addRow(...)模型的方法。该模型还将接受 Vector,因此无需将其转换为数组

将所有数据添加到模型后,您需要:

  1. 用于tableModelView.setModel(...)替换表中的模型。

现在您的表模型将同时包含数据列和行。


推荐阅读