java - tableModel.addRow() 未在 JTable 中显示任何内容,但行对象具有值
问题描述
我在 swing 中使用 JTable 来显示 MySQL 表,虽然表值存在于行对象中(如屏幕截图中的输出所示),但应用程序中的 jtable 为空。屏幕截图中的输出包含 Object[] 数组,但是当我在 addRow 方法中传递它时,它不会在 JTable GUI 上显示任何内容。
private void tableSubmitButtonActionPerformed(java.awt.event.ActionEvent evt) {
//fetch the name of the database to be created
String dbName = tableDBName.getText();
//fetch the root password
String password = new String(tableDBPass.getPassword());
// fetch table name
String tableName = tableTableName.getText();
DefaultTableModel tableModel = (DefaultTableModel)tableViewTable.getModel();
int rowCount = tableModel.getRowCount();
for(int i = 0; i<rowCount; i++){
tableModel.removeRow(0);
}
try{
// create connection
CreateConnection newCon = new CreateConnection();
Statement newStat = newCon.initiate(dbName, password);
// result set contains the data fetched from the MySQL table
ResultSet rs = newStat.executeQuery("select * from "+tableName);
// get column names and column count
ResultSetMetaData metaData = rs.getMetaData();
int n_columns = metaData.getColumnCount();
ArrayList<String> columnNames = new ArrayList<>();
for(int i = 1; i<=n_columns; i++){
columnNames.add(metaData.getColumnName(i));
}
while(rs.next()){
ArrayList row = new ArrayList(n_columns);
for(int i = 1; i<=n_columns; i++){
row.add(rs.getObject(i));
}
Object[] obj = row.toArray();
tableModel.addRow(obj);
System.out.println("table updated..: "+Arrays.toString(obj));
}
}catch(SQLException e){
System.out.println(e.getMessage());
}
}
除此之外,当您在表单中插入 JTable 时,我删除了最初存在的所有行。
解决方案
DefaultTableModel tableModel = (DefaultTableModel)tableViewTable.getModel();
因此,您从一个空的 TableModel 开始,这意味着该模型没有列或行。
因此,即使您调用 addRow() 方法,您的模型也没有列,因此 JTable 中没有任何内容可显示
ArrayList<String> columnNames = new ArrayList<>();
for(int i = 1; i<=n_columns; i++){
columnNames.add(metaData.getColumnName(i));
}
上面的代码什么都不做。它所做的只是向 ArrayList 添加一些数据,但从未使用过该 ArrayList。
你想做的是:
- 使用 a
Vector
,而不是 ArrayList - 然后你需要创建一个
DefaultTableModel
只有列名的空。阅读相应构造函数的 API。
然后在您想要遍历 ResultSet 的逻辑中:
- 再次
Vector
对每一行数据使用 - 将数据添加到 Vector
- 调用
addRow(...)
模型的方法。该模型还将接受 Vector,因此无需将其转换为数组
将所有数据添加到模型后,您需要:
- 用于
tableModelView.setModel(...)
替换表中的模型。
现在您的表模型将同时包含数据列和行。
推荐阅读
- spring-boot - log4j2.xml fluentd 错误,当 servlet 抛出 ex 日志被破坏时(转储错误事件:error_class=Fluent::Plugin::Parser::ParserError)
- python - ImportError:无法从烧瓶中的“flask_sqlalchemy”错误导入名称“SQLALchemy”
- java - 为什么 Maven 生成具有 5 个参数而不是 wsdl 参数的方法?
- pandas - 用于基因组学的 Python 中的嵌套结构和大数据处理(Dask.Bags vs PySpark vs 替代方案?)
- java - 在 domain.com/robots.txt 中显示 robots.txt 文件,而不是在 Spring Java Web 应用程序中的 domain.com/context/robots.txt
- javafx - fxml 文件中的更改不可见
- reactjs - 如何使用反冲为自定义钩子编写测试代码
- c# - 根据用户语言将嵌套的 JSON 数据渲染到剃须刀页面(asp.net 核心剃须刀页面)
- python - 为什么这个变量不是全局的(不能在函数中使用)?
- javascript - 如何让加载画面消失?html css js