2016-11-17 5 views
0

DefaultTableModelクラスを使用してResultSetデータをJTableに配置しようとしています。解決策として、私はStackOverflowの上で解決策を見つけたが、ビット(ここでは実際には関係ありません)、それを修正:データが照会されても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が移入され、
  • 行カウントがゼロ
  • であり、私は問題がこのラインvector.add(rs.getObject(columnIndex));だと思います3210 getObject()は既にデータを返していないので、私のベクトルが空になっているようです。

誰かが私にこれを手伝ったり問題の原因を説明したりできますか?私が生成したDefaultTableModelをJTableにバインドすると、それは空です(データは表示されません)。

+0

'DefaultTableModel'にはメソッドが存在すると行がありませんか? –

+0

はい、行数はゼロ@ dev-nullです。 – CodeShark

+0

コードは合理的に見えます。ループが期待通りに実行されることを確認するには、デバッグコードを追加する必要があります。行数がゼロの場合、ResultSetが空であることがわかります。 – camickr

答えて

0

私はちょっと前にこの問題を発見しました。問題は、他のメソッドが同じResultSetを既に反復していたためカーソルが最後の行に再度セットされていたため、 ResultSetクラスのメソッド。

+0

これを読んでいる人は誰でも、これはすぐに結果セットをリストにコピーする理由です。 ResultSetを周囲に渡すことは危険です。 –

+0

ヒント@GilbertLeBlancをありがとう!私はそれを行うことはめったにありませんが、それが通常の方法であるかどうかはわかりませんでした。今私は賢明だ;)。 – CodeShark

0

AbstractTableModelをベースとして使用することをおすすめします。数年前、Sunの例ではJDBCAdapter.javaというクラスが見つかりました。このクラスは、あなたが望むものです。 Webでこのクラスを検索すると、おそらくほとんどのニーズを満たす何かがあります。アプリケーションがDBに変更を書き戻すことができれば、テーブルをうまく表示するためには難しいかもしれません。

関連する問題