当我使用 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
,其元素为Vector
s。每个元素都是JTable
中的一行。因此,在上面的代码中,我创建并填充了一个Vector
,它可以作为DefaultTableModel
构造函数的参数之一。 DefaultTableModel
构造函数的另一个参数是Vector
,其中包含JTable
中列的名称。正如我已经说过的,列名可以从ResultsetMetaData
获取。
创建新的DefaultTableModel
后,我只需通过方法setModel
将其分配给JTable
。
【讨论】:
以上是关于当我使用 DefaultTableModel 从 CachedRowSet 填充 jTable 时,为啥 JTable 的列标题没有更新?的主要内容,如果未能解决你的问题,请参考以下文章
如何将DefaultTableModel对象的数据放入DefaultTableModel的子类中
Java Swing 如何使用DefaultTableModel交替刷新JTable?
如何在 DefaultTableModel/JTable 中合并单元格?