2

我正在用数据库中的数据填充 JTable。我已将 AbstractTableModel 子类化并将引用传递给 JTable。但是,我如何设法提取数据库中的列名并将它们设置为 JTable 中的“标题”?

提前致谢。

我已经有了这个,在控制台中显示标题名称,但我在 GUI 中没有列。我已将 JTable 附加到选项卡式窗格中的选项卡上。

@Override
public String getColumnName(int column) {
    try {
        System.out.println(dbhandler.getMetaData().getColumnName(column + 1));
        return dbhandler.getMetaData().getColumnName(column + 1);
    } catch (SQLException e) {
        e.printStackTrace();
        return "";
    }
}
4

5 回答 5

5

但是,我如何设法提取数据库中的列名并将它们设置为 JTable 中的“标题”?

您的表模型需要实现 getColumnName() 方法。然后你需要先用数据创建你的表模型。然后,您使用表模型创建 JTable,该表将为您构建列。

有关提供可重用表模型以及自动为您填充表的方法的代码,请参阅数据库中的表。

我根本没有任何列,它是所有行......

您需要将表格添加到 JScrollPane(不是 JPanel),并且标题将显示为滚动窗格的列标题视图:

JScrollPane scrollPane = new JScrollPane( table );
于 2011-01-29T21:17:42.403 回答
1

您可以通过覆盖 AbstractTableModel 的 getColumnName(int i) 方法来做到这一点,并将您的“标题”字符串放入此方法中。

于 2011-01-29T20:04:45.163 回答
1

你如何获得你的数据?使用“SELECT * FROM foo”?

接口:java.sql.DatabaseMetaData

getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) 检索指定目录中可用的表列的描述。

于 2011-01-29T20:22:48.990 回答
1

你也覆盖了 getColumnCount 吗?

于 2011-01-29T20:44:03.017 回答
1
private void getColumnsFromDB (Connection connection, String tname) throws SQLException
{
    String query = "SELECT * FROM " + tname;
    Statement stmt = connection.createStatement ();
    ResultSet res = stmt.executeQuery (query);
    ResultSetMetaData rsmd = res.getMetaData ();
    int numberOfColumns = rsmd.getColumnCount ();
    boolean searchable = rsmd.isSearchable (1);
    if (searchable)
    {
        for (int j = 1; j <= numberOfColumns; ++j)
        {
            Column col = new Column (tname, rsmd, j);
            // do something with Column (col);
        }
    }
}

类列,Ctor:

public Column (String t, ResultSetMetaData rsmd, int j) throws SQLException
{
    table = t;
    name = rsmd.getColumnName (j);
    schema = rsmd.getSchemaName (j);
    precision = -1;
    try
    {
        precision = rsmd.getPrecision (j);
    }
    catch (NumberFormatException nfe)
    {
        System.err.println ("nfe[gtd]: " + nfe + " " + t.getName () + "." + name);
    }
    scale = rsmd.getScale (j);
    catName = rsmd.getCatalogName (j);
    coltype = rsmd.getColumnType (j);
    coltypeName = rsmd.getColumnTypeName (j);
    int nulling = rsmd.isNullable (j);
    nullable = NULLTYP [nulling];
}

我希望它可以工作,因为这段代码是一个更大的代码库的一部分,而且很久以前我就使用它了。

于 2011-01-30T03:42:00.170 回答