2016-11-17 9 views
0

DefaultTableModel 클래스를 사용하여 ResultSet 데이터를 JTable에 넣으려고합니다. 솔루션으로 I에 유래에 대한 해결책을 찾았지만 그것을 (여기 정말 관련이없는) 조금 수정 :데이터를 쿼리해도 DefaultTableModel이 비어 있습니다.

public static DefaultTableModel buildTableModel(ResultSet rs) { 
    try { 
     ResultSetMetaData metaData = rs.getMetaData(); 
     Vector<String> columnNames = new Vector<String>(); 
     int columnCount = metaData.getColumnCount(); 
     for (int column = 1; column <= columnCount;++column) { 
      columnNames.add(metaData.getColumnName(column)); 
     } 
     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); 
    } catch(SQLException e) { 
     e.printStackTrace(); 
     return new DefaultTableModel(new Vector<>(), new Vector<>()); 
    } 
} 

나는 것을 볼 수 있었다이 코드를 디버깅하는 동안 :

  • 의 ResultSet rs에 데이터가를 ,
  • ColumnNames
  • 의 RowCount는
  • 제로, 인구 내가 문제가이 라인 vector.add(rs.getObject(columnIndex));생각 3231 getObject()이 이미 데이터를 반환하기 때문에 벡터가 비어있는 것처럼 보입니다.

누군가가이 문제에 대해 도움을 주거나 문제가 어디에 있는지 설명해 줄 수 있습니까? 생성 된 DefaultTableModel을 JTable에 바인드 할 때 비어 있습니다 (데이터가 표시되지 않음).

+0

'DefaultTableModel'에는 기존 메서드가있을 때 행이 없습니까? –

+0

예 행 수는 @ dev-null입니다. – CodeShark

+0

코드가 적당 해 보입니다. 루프가 예상대로 실행되는지 확인하려면 디버그 코드를 추가해야합니다. 행 수가 0이면 ResultSet이 비어 있음을 나타냅니다. – camickr

답변

0

방금 ​​전에 문제가 발견되었습니다. 다른 메소드가 이미 동일한 ResultSet을 반복하여 커서가 첫 번째 행으로 다시 설정되어야했기 때문에 커서가 마지막 행으로 설정되었다는 것이 문제였습니다. ResultSet 클래스의 메소드

+0

이것을 읽는 다른 사람에게는 이것이 바로 ResultSet을 목록에 복사하는 이유입니다. ResultSet을 전달하는 것은 위험합니다. –

+0

힌트를 보내 주셔서 감사합니다. @ GilbertLeBlanc! 나는 거의하지 않지만 그것이가는 평범한 길인지는 몰랐다. 지금 나는 현명하다;). – CodeShark

0

AbstractTableModel을 기본으로 사용하는 것이 좋습니다. 몇 년 전, Sun의 예제에서 JDBCAdapter.java라는 클래스를 발견했습니다. 이 수업은 당신이 원하는 것입니다. 웹에서이 수업을 검색하면 아마도 대부분의 요구를 충족시키는 무언가를 얻을 수 있습니다. 응용 프로그램에서 DB에 변경 사항을 다시 쓸 수 있어야하지만 테이블을 잘 표시하는 것이 어려울 수 있습니다.