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 表中可能值的组合框。我认为关于关系数据库和使用它们的良好手册或书籍 w/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

如果我理解的话,您将加入两个表,它们之间存在一对多关系。为了使讨论更简单,让我们假设您有一个名为部门的表和一个名为员工的表。每个部门可以有 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 回答