我尝试将ResultSet数据放入DefaultTableModel类的帮助下的JTable中。作为解决方案,我在Stackoverflow上找到了一个解决方案,但修改了一点(这里不太相关):
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
has data, -
ColumnNames
已填充, - RowCount为零
- ,我认为问题是这一行
vector.add(rs.getObject(columnIndex));
看起来我的向量变成空的,因为getObject()
已经没有返回数据。
有人可以帮助我这个或解释问题在哪里?当我将生成的DefaultTableModel绑定到JTable时,它是空的(没有显示数据)。
我建议使用AbstractTableModel作为基础。几年前,我在Sun的示例中发现了一个名为JDBCAdapter.java的类。这门课能满足你的要求。在网上搜索这门课,你会找到一些东西,可能满足你的大部分需求。如果您的应用程序应该能够将更改写回DB,那么这可能是一个挑战,但只是为了显示表,这很好。
我刚刚发现了这个问题不久之前:问题是光标被设置为最后一行,因为其他方法已经在相同的ResultSet上迭代,因此光标必须再次设置为ResultSet类的第一行。