无法将列名称作为标题添加到JTable中

时间:2017-04-14 16:24:13

标签: java swing jtable

我有这个代码应该根据我的查询返回的字段名称创建我的JTable列听众。由于某种原因,我的代码不起作用,我对Java很新,我一直在做研究,但似乎无法找到我的问题所在。任何帮助将不胜感激。

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 个答案:

答案 0 :(得分: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中。因此,Array中的数据将复制到Vector。只需从头开始使用Vector即可节省资源。

  2. 输入的代码较短。这也使得重新排列列更容易,因为您不必担心索引。

  3. 每次调用setValueAt(...)方法时,都会生成一个事件来告诉表绘制自己。所以这发生了12次,一次用于addrow()方法,一次用于每个setValueAt()方法。通过最后使用addRow()方法,您只生成一个事件。