You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮数据已存入列表但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:00