2015-05-01 2 views
0

Я уже искал всю сеть, но я не могу найти решение, поэтому я решил задать здесь.JTable missing first row

Следующая проблема: Я использую эти 2 метода для заполнения JTable с помощью DefaultTableModel, 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); 

Он отлично работает, он показывает мне мои заголовки столбцов и данные, за исключением одной проблемы:

Это всегда отсутствует первая строка и начинается со второй

ответ

2
while (rs.next()) { 
    table = new JTable(tableModel(rs)); 
    return table; 
} 

Вы потребляя первый ряд из набора результатов здесь, а затем вызовите tableModel(), который потребляет другие строки. Цикл while бесполезен. Просто сделайте

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

Большое вам спасибо, я бы никогда не нашел его сам :) – Rob987

3

начинается Ваша проблема здесь ...

// 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 и применить к уже существующей таблице

+0

большое вам спасибо! это было бы, я бы никогда не нашел его сам – Rob987

+0

@ Rob987 Да, это было подлый один – MadProgrammer