当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为什么 JTable 的列标题没有更新?

When I populate a jTable from a CachedRowSet using the DefaultTableModel, why is the JTable's column title not updated?

当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,jtable 列的标题没有更新。所以我使用 jtable 属性 手动完成了它。有没有其他方法可以从数据库中自动获取标题名称?

此客户

 public studentdetails() 
 {
        initComponents();
    
    try {           
                       
         Interface b = (Interface) Naming.lookup("rmi://localhost:1099/Server");
              DefaultTableModel tblModel = 
              (DefaultTableModel)studentdetailstable.getModel();
              tblModel.setRowCount(0);
              CachedRowSet studentdetails=b.getArray();
                     
              while(studentdetails.next())
              {   
                   Vector t = new Vector();
                           
                   for(int i = 0; i <= studentdetails.getMaxRows(); i++) 
                   {
                     t.add(studentdetails.getInt("id"));
                     t.add(studentdetails.getString("names"));
                   }       
                     tblModel.addRow(t);
        }
    
        } catch (Exception e) {
             JOptionPane.showMessageDialog(null, e);
        } 
    }

实施

public CachedRowSet getArray() throws RemoteException {
        try (Connection con = ConnectionProvider.getConnection();
             Statement st = con.createStatement();
             //  ResultSet rs = st.executeQuery("select * from studentnames")) 
             ResultSet rs = st.executeQuery("select id, names from students"))                               {
             RowSetFactory factory = RowSetProvider.newFactory();
             CachedRowSet details= factory.createCachedRowSet();
             fruitDetails.populate(rs);
             return details;
        }
        catch (SQLException e) {
            throw new RemoteException("Method 'getArray()' failed.", e);
        }

CachedRowSet 继承方法 getMetaData 其中 returns ResultSetMetaData 可用于获取列的名称以及列数。 (参见下面的代码。代码后有更多解释。)

/* Required imports.

import java.rmi.Naming;
import java.sql.ResultSetMetaData;
import java.util.Vector;

import javax.sql.rowset.CachedRowSet;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
*/
public studentdetails() {
    initComponents();
    try {
        Interface b = (Interface) Naming.lookup("rmi://localhost:1099/Server");
        CachedRowSet details = b.getArray();
        ResultSetMetaData rsmd = details.getMetaData();
        int columnCount = rsmd.getColumnCount();
        Vector<Object> columnNames = new Vector<>(columnCount);
        for (int i = 0; i < columnCount; i++) {
            columnNames.add(rsmd.getColumnLabel(i + 1));
        }
        Vector<Object> rows = new Vector<>();
        while (details.next()) {
            Vector<Object> row = new Vector<>(columnCount);
            for (int i = 0; i < columnCount; i++) {
                row.add(details.getObject(i + 1));
            }
            rows.add(row);
        }
        DefaultTableModel tblModel = new DefaultTableModel(rows, columnNames);
        studentdetailstable.setModel(tblModel);
    }
    catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
        e.printStackTrace();
    }
}

DefaultTableModel 包含一个 Vector,其元素是 Vector。每个元素都是 JTable 中的一行。因此,在上面的代码中,我创建并填充了一个 Vector ,它可以作为 DefaultTableModel 构造函数的参数之一。 DefaultTableModel 构造函数的另一个参数是 Vector,其中包含 JTable 中列的名称。正如我已经说过的,列名可以从 ResultsetMetaData.

中获得

创建新的 DefaultTableModel 后,我只需通过方法 setModel.

将其分配给 JTable