JTable 缺少第一行

Posted

技术标签:

【中文标题】JTable 缺少第一行【英文标题】:JTable missing first row 【发布时间】:2015-05-01 12:19:02 【问题描述】:

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

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

我正在使用一种方法来获取这样的 ResultSet:

    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); 

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

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

【问题讨论】:

【参考方案1】:

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

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

并表现出来

// 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 并应用于预先存在的表

【讨论】:

非常感谢!就是这样,我自己永远找不到它 @Rob987 是的,这是一个偷偷摸摸的【参考方案2】:
while (rs.next()) 
    table = new JTable(tableModel(rs));
    return table;

您在此处使用结果集的第一行,然后调用tableModel(),它会使用其他行。 while 循环是没用的。做吧

table = new JTable(tableModel(rs));
return table;

【讨论】:

非常感谢,我自己永远找不到它:)

以上是关于JTable 缺少第一行的主要内容,如果未能解决你的问题,请参考以下文章

反序列化缺少第一列的数据表

如何纠正流量警告:解构(缺少注释)

如何修复“缺少表的 FROM 子句条目”?

JTable - 拖动列以增加宽度

从 Postgres 数据库填充 jTable

tslint - 最后一行缺少尾随逗号(尾随逗号)