如何使用数据库填充JTable中的数据? [英] How to fill data in a JTable with database?

查看:95
本文介绍了如何使用数据库填充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 进程方法并读取最新的行数,将它们添加到列表< Row> 并激活相应的 TableEvent s使显示更新。

  • 另外,使用 ResultSetMetaData 来确定 TableModel 定义中每列的类。这将导致它们被正确呈现(如果你只是使用2D Object [] [] 数组,情况就不是这样了。

  • Create a Row class to represent a row read from your ResultSet. This could be a simple wrapper around an Object[].
  • Create a List<Row> collection, and subclass AbstractTableModel to be backed by this collection.
  • Use a SwingWorker to populate your List<Row> by reading from the underlying ResultSet on a background thread (i.e. within the doInBackground() method). Call SwingWorker's publish method to publish Rows back to the Event Dispatch thread (e.g. every 100 rows).
  • When the SwingWorker's process method is called with the latest chunk of Rows read, add them to your List<Row> and fire appropriate TableEvents to cause the display to update.
  • Also, use the ResultSetMetaData to determine the Class of each column within the TableModel definition. This will cause them to be rendered correctly (which won't be the case if you simply use a 2D Object[][] array).

这种方法的优点是在处理大型 ResultSet 时,UI不会锁定,显示将在处理结果时逐步更新。

The advantage of this approach is that the UI will not lock up when processing large ResultSets, 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中的数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆