JTable Swing检索数据

时间:2012-03-06 23:18:48

标签: java database swing netbeans jtable

我尝试使用数据库中的数据填充表格但是我遇到了一些问题。有人可以给我一个例子吗? (因此该表接受数据的Object [] []参数)。我有以下基本代码来显示表格;

class table extends JFrame
{
    JTable table; 

    public table()
    {
        setLayout(new FlowLayout());
        String[] columnNames = {"test","test","test"};
        Object[][] data= {{"test","test","test"},{"test","test","test"}};

        table = new JTable(data,columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500,100));
        table.setFillsViewportHeight(true);

       JScrollPane scrollPane = new JScrollPane(table);
       add(scrollPane); 
    }
}

1 个答案:

答案 0 :(得分:1)

两年前,在我上技术学校期间,我写了一个小图书馆帮助解决练习提出的一些问题,包括一个DatabaseTableModel

该类从AbstractTableModelwhich means you can set it扩展为您的JTable数据源。

以下是从ResultSet构建模型的算法:

public final void constructModel(ResultSet rs) throws SQLException {
    ResultSetMetaData rsmd = rs.getMetaData();
    rs.last();
    rowCount = rs.getRow();
    int columnCount = rsmd.getColumnCount();
    // DatabaseColumn simply holds a name and a Class<?>.
    columns = new DatabaseColumn[columnCount];
    // This is the Object[][] array that you were talking about.
    // It holds all the data from the ResultSet.
    data = new Object[columnCount][rowCount];
    for (int i = 0; i < columnCount; ++i) {
        // Figure out the column name and type.
        int j = i + 1;
        String colName = rsmd.getColumnLabel(j);
        Class<?> colClass = String.class;
        try {
            colClass = Class.forName(rsmd.getColumnClassName(j));
        } catch (ClassNotFoundException ex) {
            colClass = String.class;
        }
        columns[i] = new DatabaseColumn(colName, colClass);
        // Get the data in the current column as an Object.
        rs.beforeFirst();
        for (int k = 0; rs.next(); ++k) {
            data[i][k] = rs.getObject(j);
        }
    }
    // Notify listeners about the changes so they can update themselves.
    fireTableStructureChanged();
}

当我在学校使用它时,该课程有效,但它并不完全是生产代码。当我今天看到它时,我开始看到问题。

一个问题是它正在将ResultSet整个内容加载到内存中。可能会很快变丑。

此外,该算法并非完全最优。它循环使用数据库游标,好像它什么都没有;我假设如果数据库首先检索了当前行中的所有对象并在移动到下一行之前将它们分配到适当的列,那么它对数据库的成本会降低。行。

尽管如此,我认为这是一个很好的起点。