java - JTable 缺少第一行

标签 java swing jdbc jtable defaulttablemodel

我已经搜索了整个网络,但找不到解决方案,所以我决定在这里提问。

以下问题:我使用这两种方法用 DefaultTableModel 填充 JTable,ResultSet 显示了正确数量的数据条目(我已经使用 System.out.println 搜索了它),但 JTable 总是错过第一行

我正在使用一种方法来获取如下所示的结果集:

    public static JTable DBCFillBTableAuftraege() {
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;

    JTable table = null;

    try {
        con = DriverManager.getConnection(host, uName, uPass);
        stmt = con.createStatement( );
        rs = stmt.executeQuery("SELECT a.auftrags_nr, k.firma, a.auftragsdatum, a.lieferdatum, a.rechnungsbetrag, k.name, k.strasse, k.plz, k.ort from auftrag a join kunde k on k.kunden_nr = a.kunden_nr ");
        while (rs.next()) {
            table = new JTable(tableModel(rs));
            return table;
        }   
    } catch (SQLException e) {
        System.out.println(e);
    } finally {
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return table;
}

然后调用此方法:

public static DefaultTableModel TableModel(ResultSet rs)
        throws SQLException {

    ResultSetMetaData metaData = rs.getMetaData();
    System.out.println(rs);
    // 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
    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    while (rs.next()) {
        Vector<Object> vector = new Vector<Object>();
        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            vector.add(rs.getObject(columnIndex));
        }
        data.add(vector);
    }
    return new DefaultTableModel(data, columnNames);
}

在我的主要部分:

    TableAuftrag = DBCFillBTableAuftraege();

    scpaneBestell.setViewportView(TableAuftrag); 

它工作正常,它向我显示我的列标题和数据,除了一个问题:

它总是缺少第一行并从第二行开始

最佳答案

你的问题从这里开始......

// Move to first row...
while (rs.next()) {
    table = new JTable(tableModel(rs));
    return table;
}   

和 list

// Move to second row and beyond...
while (rs.next()) {
    Vector<Object> vector = new Vector<Object>();
    for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
        vector.add(rs.getObject(columnIndex));
    }
    data.add(vector);
}

基本上,在第一个 while (rs.next()) 中,您移动到第一行,但在第二个 while (rs.next())您移动到第二行,而不处理第一行...

最好将 ResultSet 直接传递给 TableModel

约定还建议您可能不需要创建新的 JTable,而只需创建一个新的 TableModel 并应用于预先存在的表

关于java - JTable 缺少第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29986722/

相关文章:

java - HSQL 中是否有 'addScript' 的最大记录数?

Java 连接并执行数据库语句而不阻塞程序

java - 当容器大小更改时,JTable 仅调整选定列的大小

java - 如何暂停其他正在进行的流读取器线程

java - 计算负数减去另一个数字时出现问题

java - 在 JSP 中格式化 JSON 日期

java - JTree:如何添加节点的属性作为自己的叶子?

java - 事务 X 尝试通过 JDBC 访问事务 Y 创建的对象

java - Tomcat jdbc 连接池 - Pool-Cleaner Memory Leak

java - YCSB 对 mysql 数据库进行扫描操作时出错