我有这个代码应该根据我的查询返回的字段名称创建我的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();
}
}
答案 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 );
}
这种方法的原因:
DefaultTableModel将其数据存储在Vector中。因此,Array中的数据将复制到Vector。只需从头开始使用Vector即可节省资源。
输入的代码较短。这也使得重新排列列更容易,因为您不必担心索引。
每次调用setValueAt(...)方法时,都会生成一个事件来告诉表绘制自己。所以这发生了12次,一次用于addrow()方法,一次用于每个setValueAt()方法。通过最后使用addRow()方法,您只生成一个事件。