点击按钮数据已存入列表但JTable不显示数据该如何处理
解决Swing JTable新增数据后不刷新的方案
核心原因是AbstractTableModel无法自动感知绑定的列表内容变动,你往列表里添加数据后,没有主动通知模型刷新视图,所以表格不会更新。
第一步:给CartTableModel新增操作数据的方法
在你的CartTableModel类中新增添加商品的方法,修改数据后主动触发表格刷新通知:
// 加入到CartTableModel类中 public void addProduct(Products product) { this.productList.add(product); // 通知表格:指定区间的行已插入,触发重绘 fireTableRowsInserted(productList.size() - 1, productList.size() - 1); }
如果后续需要支持修改、删除数据,对应操作完成后调用对应通知方法即可:
- 修改单格数据:
fireTableCellUpdated(行索引, 列索引) - 修改整行数据:
fireTableRowsUpdated(起始行, 结束行) - 删除行数据:
fireTableRowsDeleted(起始行, 结束行) - 全量数据变动:
fireTableDataChanged()
第二步:调整按钮点击逻辑
首先要将你初始化的CartTableModel实例设置为类成员变量,不要定义为局部变量,确保点击事件中可以拿到该实例:
// 类成员变量声明 private CartTableModel cartModel; // 初始化表格的逻辑修改为: cartModel = new CartTableModel(productList); JTable cartTable = new JTable(cartModel);
修改按钮点击的事件代码:
public void actionPerformed(ActionEvent e) { if(e.getSource() == coconutPieBtn){ // 注意统一商品类名,你代码中同时存在Product/Products/ProductInfo三个类名,需要先修正为同一个 Products newProduct = new Products("Coconut Creamy Pie", 101,"Pastry","Med",79.99); // 调用模型的方法添加数据,自动触发刷新 cartModel.addProduct(newProduct); // 如果你必须先调用cart.addProduct存储数据,要保证cart持有的productList和模型绑定的是同一个实例,添加完后手动触发通知: // cart.addProduct(newProduct); // cartModel.fireTableRowsInserted(cart.getProductList().size() -1, cart.getProductList().size() -1); } }
现有代码需要修正的小问题
- CartTableModel构造函数参数为
List<ProductInfo>,但成员变量是List<Products>,类型不匹配,需要统一 - 按钮点击逻辑中创建的是
Product类实例,和模型中使用的Products类名不一致,需要统一避免类型错误
注意:必须保证TableModel绑定的List和你存储数据的List是同一个实例,不要中途替换List对象,否则也会导致数据不同步。
内容的提问来源于stack exchange,提问作者Vince Viloria
相关产品推荐
相关产品推荐

