我一直在尝试从Derby数据库中获取数据并填充由Netbeans GUI构建器创建的jTable。

我有一个保留以下代码的帐户类:

public static DefaultTableModel buildTableModel() throws SQLException {
    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    Vector columns = new Vector();
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        String stmt = "SELECT * FROM APP.DATAVAULT";
        ps = Main.getPreparedStatement(stmt);
        rs = ps.executeQuery();
        ResultSetMetaData metaData = rs.getMetaData();

        // names of columns
        Vector<String> columnNames = new Vector<String>();
        int columnCount = metaData.getColumnCount();
        for (int column = 1; column <= columnCount; column++) {
            columnNames.add(metaData.getColumnName(column));
        }
        // data of the table
        while (rs.next()) {
            Vector<Object> vector = new Vector<Object>();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                vector.add(rs.getObject(columnIndex));
            }
            data.add(vector);
        }
    } finally {
        try {
            ps.close();
        } catch (Exception e) {
        }
        try {
            rs.close();
        } catch (Exception e) {
        }
    }
    DefaultTableModel tableModel = new DefaultTableModel(data, columns);
    return tableModel;
}

如您所见,它返回一个带有两个参数的DefaultTableModel:数据和列。

然后,在我的GUI类中,我有以下内容:

我的领域:
Account acc = new Account();

构造函数:
public SPPMainGUI() throws SQLException {
    initComponents();
    datavaultjTable.setModel(acc.buildTableModel());
}

我的主要方法:
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                new SPPMainGUI().setVisible(true);
            } catch (SQLException ex) {
                Logger.getLogger(SPPMainGUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });
}

该代码设置为使用datavault表中的所有数据填充我的jTable,无论什么用户登录。

我的数据仓库表中有数据:

这是我的jTable在运行程序并成功登录后的样子:

这是应该的样子,但已填充:

我的代码哪里出问题了?我已经为此困扰了两个星期。

最佳答案

您需要将columnNames添加到columns标头数据中,否则JTable中将不会出现任何内容:

for (int column = 1; column <= columnCount; column++) {
   ...
}
columns.add(columnNames); <--- add this line

除了为该数据提供冗余变量,您还可以为模型简单地使用columnNames:
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames);

09-10 09:12
查看更多