作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想显示一个 JTable,它按原样显示来自数据库表的数据。
到目前为止,我一直使用 JTable 来显示来自 Object [ ][ ] 的数据。
我知道显示数据的一种方法是首先将数据库表转换为 Object [ ][ ] 但是还有其他更简单但更强大和灵活的方法吗?
最佳答案
我建议采用以下方法:
Row
类来表示从您的 ResultSet
读取的行.这可能是对 Object[]
的简单包装。 .List<Row>
集合和子类 AbstractTableModel
得到这个集合的支持。SwingWorker
填充您的List<Row>
通过读取基础 ResultSet
在后台线程上(即在 doInBackground()
方法中)。调用 SwingWorker
的publish
发布方法Row
返回事件调度线程(例如每 100 行)。SwingWorker
的process
方法是用读取的最新的行 block 调用的,将它们添加到您的 List<Row>
并适当开火TableEvent
s 使显示更新。ResultSetMetaData
确定Class
TableModel
中的每一列定义。这将导致它们被正确渲染(如果您只使用 2D Object[][]
数组,则不会出现这种情况)。这种方法的优点是UI在处理大ResultSet
时不会锁定。 s,并且显示将随着结果的处理而逐渐更新。
编辑
在下面添加了示例代码:
/**
* 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();
关于java - 如何用数据库填充 JTable 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192764/
我是一名优秀的程序员,十分优秀!