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

时间:2010-02-03 14:51:44

标签: java swing jtable

我想显示一个JTable,它按原样显示DataBase表中的数据。

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

我知道显示数据的一种方法是首先将数据库表转换为Object [] []但是还有其他任何容易但更强大和灵活的方法。

7 个答案:

答案 0 :(得分:24)

我建议采取以下方法:

  • 创建一个Row类来表示从ResultSet读取的行。这可能是Object[]
  • 的简单包装
  • 创建一个List<Row>集合,并为此集合支持子类AbstractTableModel
  • 使用SwingWorker填充您的List<Row>,方法是阅读后台主题上的基础ResultSet(即doInBackground()方法内) 。调用SwingWorker的{​​{1}}方法将publish发布回Event Dispatch主题(例如,每100行)。
  • 当调用Row的{​​{1}}方法并读取最新的行数时,将其添加到SwingWorker并触发相应的process以显示更新。
  • 另外,使用List<Row>确定TableEvent定义中每列的ResultSetMetaData。这将使它们正确呈现(如果您只是使用2D Class数组,情况就不会这样了。)

这种方法的优点是在处理大型TableModel时UI不会锁定,并且显示将在处理结果时以递增方式更新。

修改

在下面添加了示例代码:

Object[][]

答案 1 :(得分:7)

在JTable中显示数据库数据的另一种强大而灵活的方法是将查询的结果数据加载到CachedRowSet,然后使用JTable适配器将其连接到TableModel

  1. 查询---&gt;数据库数据---&gt;行集
  2. RowSet&lt; - &gt; TableModel适配器&lt; - &gt; JTable的
  3. George Reese的这个book为他的班级 RowSetModel 提供the source code以使RowSet适应作为TableModel。为我工作开箱即用。我唯一的改变是该类的更好名称: RowSetTableModel

    RowSet是ResultSet的子接口,在Java 1.4中添加。所以RowSet 一个ResultSet。

    CachedRowSet实现为您完成工作,而不是创建Row类,Row对象列表和ResultSetMetaData,如本页其他答案中所述。

    Sun / Oracle提供了reference implementation的CachedRowSet。其他供应商或JDBC驱动程序也可以提供实现。

    RowSet tutorial

答案 2 :(得分:4)

根据您已经完成的工作以及您愿意做的事情,我已经非常成功地使用Netbeans及其Beans Binding支持数据库驱动的应用程序。将JTable绑定到数据库,它会自动构建JPA查询。

答案 3 :(得分:4)

使用ResultSet填充jTable的最佳方法

先决条件

1)结果集“rs”填充了您需要的数据。 2)JTable“jTable1”是在手工创建的 3)表头是在手前实现的

实施

        java.sql.ResultSet rs = datacn.executeSelectQuery(query);
        //Filling JTable with Result set

        // Removing Previous Data
        while (jTable1.getRowCount() > 0) {
            ((DefaultTableModel) jTable1.getModel()).removeRow(0);
        }

        //Creating Object []rowData for jTable's Table Model        
        int columns = rs.getMetaData().getColumnCount();
        while (rs.next())
        {  
            Object[] row = new Object[columns];
            for (int i = 1; i <= columns; i++)
            {  
                row[i - 1] = rs.getObject(i); // 1
            }
            ((DefaultTableModel) jTable1.getModel()).insertRow(rs.getRow() - 1,row);
        }

答案 4 :(得分:3)

您必须创建自定义TableModel您可以在此处指定数据的来源和方式。

首先,您必须完全了解JTable + TableModel的工作原理,然后按照之前发布的答案之一进行操作。

答案 5 :(得分:1)

我知道这个问题很老但是对于任何遵循Adamski解决方案的人来说,在gui和ResultSet线程之间共享ResultSetMetadataSwingWorker时应该小心。在SQLite中使用这种方法时,我得到了一个不一致的内部状态异常。解决方案是在执行SwingWorker之前将任何元数据加载到私有字段,并使用getter函数(getColumnName等)来返回字段。

答案 6 :(得分:0)

我在JTable中为显示数据库表数据提供了一个小方法。您只需要将数据库表的结果集作为参数传递。


    // rs is the ResultSet of the Database table
    public void displayData(ResultSet rs)
    {
        //jt Represents JTable
        //jf represents JFrame
        int i;
        int count;
        String a[];
        String header[] = {"1","2","3","4","5"};   //Table Header Values, change, as your wish
        count = header.length;

//First set the Table header for(i = 0; i < count; i++) { model.addColumn(header[i]); } jt.setModel(model); //Represents table Model jf.add(jt.getTableHeader(),BorderLayout.NORTH); a = new String[count]; // Adding Database table Data in the JTable try { while (rs.next()) { for(i = 0; i < count; i++) { a[i] = rs.getString(i+1); } model.addRow(a); //Adding the row in table model jt.setModel(model); // set the model in jtable } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Exception : "+e, "Error", JOptionPane.ERROR_MESSAGE); } }