2011-01-29 21 views
2

データベースのデータでJTableを埋めています。私はAbstractTableModelをサブクラス化し、JTableへの参照を渡しています。しかし、データベースの列名を抽出してJTableの「ヘッダー」として設定するにはどうすればよいですか?JTable、Javaの列ヘッダー名

ありがとうございます。

私はすでにコンソールにヘッダー名を表示していますが、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 ""; 
    } 
} 
+0

現在、列ヘッダーには何が表示されていますか?デフォルトのA、B、C..etc? –

+0

私はすべての列を持っていない、それはすべての行です... – LuckyLuke

答えて

5

ただし、データベースの列名を抽出してJTableの「ヘッダー」として設定するにはどうすればよいですか。

テーブルモデルでは、getColumnName()メソッドを実装する必要があります。次に、データを含むテーブルモデルを最初に作成する必要があります。次に、テーブルモデルを使用してJTableを作成すると、テーブルによって列が作成されます。

再利用可能なテーブルモデルを提供するコードと、テーブルを自動的に作成する方法については、Table from Databaseを参照してください。

私はそれがすべての行で、まったくの列を持っていない...

あなたはJScrollPaneの(ないのJPanel)にテーブルを追加する必要があり、ヘッダが列として表示されますスクロールペインのヘッダビュー:

JScrollPane scrollPane = new JScrollPane(table); 
+0

私はあなたのリストのすべてを5時間前にしましたが、それをスクロールペインに追加しませんでした。どうもありがとうございます! – LuckyLuke

1

あなたはAbstractTableModelにするのgetColumnName(int型I)メソッドをオーバーライドすることでそれを行うと、この方法では、あなたの「ヘッダー」の文字列を置くことができます。

+0

私の更新された記事を参照してください。 – LuckyLuke

1

どのようにデータを取得しますか? "SELECT * FROM foo"を使用していますか?

インタフェース:のjava.sql.DatabaseMetadata

のgetColumns(文字列カタログ、文字列 schemaPatternは、文字列 tableNamePattern、文字列 columnNamePatternは)は は、指定されたカタログで使用可能なテーブル列の記述を取得します。

+0

申し訳ありませんが、分かりません。例を挙げてください。はい、私のSQLクエリはSELECT * FROM tablename – LuckyLuke

+0

はい、新しい回答としての可読性です。 –

1

getColumnCountもオーバーライドしましたか?

+0

はい、私はそれをしました。 – LuckyLuke

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); 
     } 
    } 
} 

Class列、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]; 
} 

私はそれがうまくいくことを望みます。なぜなら、このコードははるかに大きなコードベースの一部であり、ずっと前に私はそれを使って作業していたからです。