2017-04-14 16 views
0

私のクエリから返されたフィールド名に基づいてJTable列の聞き手を作成する必要があるこのコードがあります。何らかの理由で私のコードが動作していない、私は非常にJavaに新しいと私は研究を行っているが、私の問題がどこにあるかを見つけることができないようです。どんな助けでも大歓迎です。JTableにヘッダーとして列名を取得できません

public void initTable(){  
    try { 
     DefaultTableModel tblModel = new DefaultTableModel() 
     { 
      @Override 
      public boolean isCellEditable(int row, int column) 
      { 
       return false; 
      } 
     }; 

     tblMain.setModel(tblModel); 
     tblMain.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     //tblMain.getTableHeader().setReorderingAllowed(false); 

     Connection dbconn = dbConn(); 
     Statement stmt = dbconn.createStatement(); 

     String qry = "SELECT * FROM Services"; 
     ResultSet rs = stmt.executeQuery(qry);   

     int numCols = rs.getMetaData().getColumnCount(); 
     System.out.println("Num Cols: " + numCols); 

     for (int col = 1; col <= numCols; col++){ 
      tblModel.addColumn(rs.getMetaData().getColumnLabel(col)); 
      //tblModel.addColumn("Tmp"); 
      System.out.println(col + " - " + rs.getMetaData().getColumnLabel(col)); 
     } 

     int row = 0; 
     while (rs != null && rs.next()){ 
      tblModel.addRow(new Object[0]); 
      tblModel.setValueAt(rs.getString("ServiceID"), row, 0); 
      tblModel.setValueAt(rs.getString("Institution"), row, 1); 
      tblModel.setValueAt(rs.getString("Doctor"), row, 2); 
      tblModel.setValueAt(rs.getString("Street"), row, 3); 
      tblModel.setValueAt(rs.getString("City"), row, 4); 
      tblModel.setValueAt(rs.getString("State"), row, 5); 
      tblModel.setValueAt(rs.getString("ZipCode"), row, 6); 
      tblModel.setValueAt(rs.getDate("Date"), row, 7); 
      tblModel.setValueAt(rs.getDouble("Cost"), row, 8); 
      tblModel.setValueAt(rs.getInt("ServiceTypeID"), row, 9); 
      tblModel.setValueAt(rs.getString("Comments"), row, 10); 
      row++; 
     } 
     rs.close();   

    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 
+1

この質問を参照してください:適切な[JTableは列ヘッダーが表示されません](http://stackoverflow.com/questions/2320812/jtable-wont-show-column-headers?rq=1) –

+1

投稿問題を示す[mcve]。問題が解決するまでは、どのコードが問題を引き起こしているのか分かりません。上記の提案は、JTableを表示するためにJScrollPaneを使用していないことを推測しています。したがって、問題は投稿したコードとはまったく関係ありません。この提案が助けにならない場合は、ポストする 'MCVE'は、ハードコードされたデータでなければなりません。つまり、データベースにアクセスできないため、データベースを使用して問題を示すことはできません。 – camickr

答えて

0

実際には問題はありませんが、データをモデルに追加するより良い方法を提案したいと思います。

代わりに空の配列を作成し、あなたのような何か見てループのコードを変更することができますのsetValueAt(...)を使用する:このアプローチの

while (rs != null && rs.next()) 
{ 
    Vector<Object> row = new Vector<Object>(11); 
    tblModel.addRow(new Object[0]); 
    row.add(rs.getString("ServiceID")); 
    row.add(rs.getString("Institution")); 
    ... 
    row.add(rs.getString("Comments")); 
    tblModel.addRow(row); 
} 

理由:

  1. DefaultTableModelはそのデータをVectorに格納します。したがって、配列からのデータはVectorにコピーされます。最初からVectorを使用するだけでリソースを節約できます。

  2. コードは入力する方が簡単です。また、インデックスを心配する必要がないので、列の並べ替えが簡単になります。

  3. setValueAt(...)メソッドを呼び出すたびに、テーブルにペイントするようにイベントが生成されます。これはaddrow()メソッドで1回、setValueAt()メソッドごとに1回、12回発生します。最後にaddRow()メソッドを使うだけで、1つのイベントしか生成されません。

関連する問題