0

JTable を使用して、MySQL SELECT クエリの結果を表示します。そのようなテーブル モデル コードの一部:

public void setDataSource(ResultSet rs) throws Exception {  
    data.clear(); 
    columnNames.clear(); 
    columnTypes.clear(); 

    ResultSetMetaData rsmd = rs.getMetaData(); 
    int columnCount=rs md .getColumnCount(); 
    for (int i=0; i<columnCount; i++) { 
        columnNames.add(rsmd.getColumnName(i+1)); 
        Classtype =Cl as s.forName(rsmd.getColumnClassName(i+1)); 
        columnTypes.add(type); 
        // Here I need to detect is it a joined column
        // and if it is to set cell editor for this column to
        // a comboBox w/ data from joined table
    } 
    fireTableStructureChanged(); 
    while ( rs.next() ){ 
        ArrayListrow =new ArrayList(); 
        for ( int i=0; i<columnCount; i++) { 
            if(columnTypes.get(i) == String.class) 
             row.add(rs.getString(i+1)); 
            else 
             row.add(rs.getObject(i+1)); 
        } 
        synchronized(data){  
            data.add(row); 
            fireTableRowsInserted(data.size()-1,data .size()-1); 
        } 
    } 
} 

ご覧のとおり、一部の列は JOIN 操作によって取得される可能性があるため、実際に何であるかを検出し、それらのエディターを JOINED テーブルからの可能な値を持つコンボ ボックスに設定する必要があります。リレーション データベースに関する適切なマニュアルや書籍、swing を使用した使用法も問題ないと思います。ありがとうございました!

4

2 に答える 2

1

A などのベース テーブルが他の複数のテーブルと結合されているとします。要件は、結合されたテーブルから出てくる列を多少異なる方法で表示することです。

ResultSetMetaData のgetTableName()を試して、列が属するテーブルの名前を取得できます。このようなもの:

int columnCount = resultSetMetaData.getColumnCount();
System.out.println("Total Columns: "+columnCount);
for(int index = 1; index <= columnCount; index++){
    System.out.print("Column Name: "+resultSetMetaData.getColumnName(index));
    System.out.println("Table Name: "+resultSetMetaData.getTableName(index));
}

ベース テーブル名は既にわかっているので、それを使用して、現在見ている列がベース テーブルに属しているかどうかを比較できます。

于 2012-10-26T06:24:18.527 に答える
0

私が理解していれば、1対多の関係がある2つのテーブルに参加しています。説明を簡単にするために、department というテーブルと employee というテーブルがあるとします。各部門には 0 人以上の従業員を配置できます。テーブルの各行に部門を表示し、従業員を選択するためのコンボ ボックスを表示します。

まず、ResultSet を直接 TableModel に渡すことはお勧めできません。テーブルが部門データを表示することを目的としている場合、テーブル モデルは部門オブジェクトのコレクションを受け入れる必要があります。

したがって、結果セットを反復処理して、Department オブジェクトのコレクションを作成する必要があります。各部門オブジェクトは、Employee オブジェクトのコレクションを持つことができます。コレクションを作成したら、これらを TableModel に渡すことができます。

これだけではコンボ ボックスは表示されませんが、問題が整理され、懸念事項が分離されます。コンボ ボックスをセル エディターとして使用するには、次のようにする必要があります。

TableColumn employeeColumn = table.getColumnModel().getColumn(someIndex);

JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.addItem("Speed reading");
comboBox.addItem("Teaching high school");
comboBox.addItem("None");
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

上記のコードは、次の Oracle Java チュートリアルから取得したものです。

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html

于 2012-10-26T11:37:17.123 に答える