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

Posted

技术标签:

【中文标题】当我使用 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 的列标题没有更新? 【发布时间】:2022-01-03 12:33:49 【问题描述】:

当我使用 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);
        

【问题讨论】:

我修好了先生。我犯了小错误。不幸的是,我没有注意到这一点。有没有办法从数据库中自动更新 jtable 列标题? 先生,我没有正确理解。可以上传代码吗?那么,我就可以理解了。否则,没关系,先生。我将使用手动命名进行管理。我觉得这不是什么大问题。但是,如果我能自动完成,那就太好了。 因为这里没有更新它的代码。 【参考方案1】:

CachedRowSet 继承方法getMetaData,它返回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,其元素为Vectors。每个元素都是JTable 中的一行。因此,在上面的代码中,我创建并填充了一个Vector,它可以作为DefaultTableModel 构造函数的参数之一。 DefaultTableModel 构造函数的另一个参数是Vector,其中包含JTable 中列的名称。正如我已经说过的,列名可以从ResultsetMetaData获取。

创建新的DefaultTableModel 后,我只需通过方法setModel 将其分配给JTable

【讨论】:

以上是关于当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为啥 JTable 的列标题没有更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 defaulttablemodel 上添加行

如何将DefaultTableModel对象的数据放入DefaultTableModel的子类中

Java Swing 如何使用DefaultTableModel交替刷新JTable?

如何在 DefaultTableModel/JTable 中合并单元格?

应该在哪里定义我的可选 DefaultTableModel 方法?

如何隐藏 DefaultTableModel 中的特定列以使其在表中显示?