本文介绍了如何使用数据库填充JTable中的数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想显示一个JTable,它按原样显示DataBase表中的数据。
I want to display a JTable that display the data from a DataBase table as it is.
到目前为止,我已经使用JTable来显示来自Object的数据[ ] []。
Up till now, I have used JTable that displays data from Object [ ][ ].
我知道显示数据的一种方法是首先将数据库表转换为Object [] []但是还有其他任何容易的东西吗?强大而灵活。
I know one way to display the data is to first convert the database table into Object [ ][ ] but Is there any other which is easy yet more powerful and flexible.
推荐答案
我建议采取以下方法:
- 创建一个
Row
类来表示从ResultSet
中读取的行。这可以是Object []
的简单包装。 - 创建
列表< Row>
集合,以及要由此集合支持的子类AbstractTableModel
。 - 使用
SwingWorker
通过在 ResultSet 来填充列表< Row>
>后台线程(即在doInBackground()
方法内)。调用SwingWorker
的发布
方法发布行
s返回到事件调度线程(例如,每100行)。 - 当
SwingWorker
的进程调用code>方法并读取最新的行数,将它们添加到
列表< Row>
并激活相应的TableEvent
s使显示更新。 - 另外,使用
ResultSetMetaData
来确定TableModel
定义中每列的类Object [] []
数组,情况就不是这样了。
- Create a
Row
class to represent a row read from yourResultSet
. This could be a simple wrapper around anObject[]
. - Create a
List<Row>
collection, and subclassAbstractTableModel
to be backed by this collection. - Use a
SwingWorker
to populate yourList<Row>
by reading from the underlyingResultSet
on a background thread (i.e. within thedoInBackground()
method). CallSwingWorker
'spublish
method to publishRow
s back to the Event Dispatch thread (e.g. every 100 rows). - When the
SwingWorker
'sprocess
method is called with the latest chunk of Rows read, add them to yourList<Row>
and fire appropriateTableEvent
s to cause the display to update. - Also, use the
ResultSetMetaData
to determine theClass
of each column within theTableModel
definition. This will cause them to be rendered correctly (which won't be the case if you simply use a 2DObject[][]
array).
这种方法的优点是在处理大型 ResultSet
时,UI不会锁定,显示将在处理结果时逐步更新。
The advantage of this approach is that the UI will not lock up when processing large ResultSet
s, and that the display will update incrementally as results are processed.
编辑
已添加示例代码如下:
/**
* 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中的数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!