如何用数据库在JTable中填充数据?
我想显示一个JTable,它按原样显示来自数据库表的数据。
到目前为止,我一直使用JTable来显示来自对象[ ][ ]的数据。
我知道显示数据的一种方法是首先将数据库表转换为对象[ ][ ],但是还有其他简单但更强大,更灵活的方法吗?
我想显示一个JTable,它按原样显示来自数据库表的数据。
到目前为止,我一直使用JTable来显示来自对象[ ][ ]的数据。
我知道显示数据的一种方法是首先将数据库表转换为对象[ ][ ],但是还有其他简单但更强大,更灵活的方法吗?
我建议采取以下方法:
Row
ResultSet
Object[]
List<Row>
AbstractTableModel
SwingWorker
List<Row>
ResultSet
doInBackground()
SwingWorker
publish
Row
SwingWorker
process
List<Row>
TableEvent
ResultSetMetaData
Class
TableModel
Object[][]
此方法的优点是,在处理大型 s 时,UI 不会锁定,并且显示将随着结果的处理而增量更新。ResultSet
编辑
添加了以下示例代码:
/**
* Simple wrapper around Object[] representing a row from the ResultSet.
*/
private class Row {
private final Object[] values;
public Row(Object[] values) {
this.values = values;
}
public int getSize() {
return values.length;
}
public Object getValue(int i) {
return values[i];
}
}
// TableModel implementation that will be populated by SwingWorker.
public class ResultSetTableModel extends AbstractTableModel {
private final ResultSetMetaData rsmd;
private final List<Row> rows;
public ResultSetTableModel(ResultSetMetaData rsmd) {
this.rsmd = rsmd;
this.rows = new ArrayList<Row>();
}
public int getRowCount() {
return rows.size();
}
public int getColumnCount() {
return rsmd.getColumnCount();
}
public Object getValue(int row, int column) {
return rows.get(row).getValue(column);
}
public String getColumnName(int col) {
return rsmd.getColumnName(col - 1); // ResultSetMetaData columns indexed from 1, not 0.
}
public Class<?> getColumnClass(int col) {
// TODO: Convert SQL type (int) returned by ResultSetMetaData.getType(col) to Java Class.
}
}
// SwingWorker implementation
new SwingWorker<Void, Row>() {
public Void doInBackground() {
// TODO: Process ResultSet and create Rows. Call publish() for every N rows created.
}
protected void process(Row... chunks) {
// TODO: Add to ResultSetTableModel List and fire TableEvent.
}
}.execute();
在 JTable 中显示数据库数据的另一种强大而灵活的方法是将查询的结果数据加载到 CachedRowSet 中,然后使用 TableModel 适配器将其连接到 JTable。
George Reese的这本书给出了他的类RowSetModel的源代码,以将RowSet改编为TableModel。开箱即用地为我工作。我唯一的更改是该类的更好名称:RowSetTableModel。
RowSet 是 ResultSet 的子接口,在 Java 1.4 中添加。因此,行集就是结果集。
CachedRowSet 实现为您完成工作,而不是像本页其他答案中所述创建 Row 类、Row 对象列表和 ResultSetMetaData。
Sun/Oracle 提供了 CachedRowSet 的参考实现。其他供应商或 JDBC 驱动程序也可能提供实现。