java - 如何用数据库填充 JTable 中的数据?

标签 java swing jtable

我想显示一个 JTable,它按原样显示来自数据库表的数据。

到目前为止,我一直使用 JTable 来显示来自 Object [ ][ ] 的数据。

我知道显示数据的一种方法是首先将数据库表转换为 Object [ ][ ] 但是还有其他更简单但更强大和灵活的方法吗?

最佳答案

我建议采用以下方法:

  • 创建一个 Row类来表示从您的 ResultSet 读取的行.这可能是对 Object[] 的简单包装。 .
  • 创建一个 List<Row>集合和子类 AbstractTableModel得到这个集合的支持。
  • 使用 SwingWorker填充您的List<Row>通过读取基础 ResultSet后台线程上(即在 doInBackground() 方法中)。调用 SwingWorkerpublish发布方法Row返回事件调度线程(例如每 100 行)。
  • SwingWorkerprocess方法是用读取的最新的行 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/

相关文章:

java - JTable - 在列末尾点击返回后不应移动到下一列

c# - switch 语句可以有多个变量吗?

java - java无法解析textArea

java - 如何在运行时在 java swing 中更改语言

java安全不允许我使用Jfilechooser打开拍照

java - 在 JTable 中选择记录时 Netbeans F2 按键不起作用

java - Java 中的二分查找结果错误

java - Retrofit 2,如何在其他 Activity 中访问收到的ArrayList?

java - 通过使用 BCEL 解析 Java 字节码来确定 LCOM4(方法中缺乏内聚)

java - 多个字符串以不同方式着色到 JTable 的同一单元格中