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

Java Swing购物车JTable不更新显示问题求助

Java Swing购物车功能修复方案

问题根源分析

  • shopcart变量未正确初始化:WestminsterShoppingCentre中声明的静态shopcart从未被赋值,点击「添加到购物车」时会触发空指针,且点击「Shopping Cart」按钮新建的实例与shopcart无关,导致数据无法同步。
  • 购物车表格初始化错误:ShoppingCart构造方法中用new String[1][3]初始化模型,会生成一行空数据,且面板布局重复添加JTable和ScrollPane,导致表格显示异常。
  • 商品存在性判断逻辑错误:「添加到购物车」的循环中,if (!productExisting)被放在循环内部,会在每次循环迭代时执行,而非循环结束后判断是否添加新商品。
  • 静态变量滥用:ShoppingCart的cartTable设为静态,容易引发多实例冲突,不符合面向对象设计规范。

修复步骤与代码修改

1. 修正WestminsterShoppingCentre中的实例引用

初始化全局唯一的购物车实例,调整添加商品的逻辑判断位置:

public class WestminsterShoppingCentre extends JFrame {
    private JButton CartBtn;
    private JButton ShoppingCartBtn;
    private JTable prodInfoTable;
    private static ShoppingCart shopcart;
    public static HashMap<String,Product> product_data = new HashMap<>();

    public WestminsterShoppingCentre(String title) throws HeadlessException {
        super(title);
        frameInit();
        WestminsterShoppingManager.ReadInfo(product_data);
        // 初始化购物车实例,默认隐藏
        shopcart = new ShoppingCart("Shopping Cart");
        shopcart.setVisible(false);

        // 原有表格、面板初始化代码保持不变

        EventHandler handler = new EventHandler();
        CartBtn.addActionListener(handler);
        ShoppingCartBtn.addActionListener(handler);

        // 原有布局代码保持不变
    }

    private class EventHandler implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent event) {
            if(event.getSource() == CartBtn){
                shopcart.setVisible(true); // 显示已初始化的购物车
            } else if (event.getSource() == ShoppingCartBtn ) {
                int SelectedRow = prodInfoTable.getSelectedRow();
                if(SelectedRow != -1){
                    String productID = (String) prodInfoTable.getValueAt(SelectedRow,0);
                    String priceString= (String) prodInfoTable.getValueAt(SelectedRow, 3);
                    double price = Double.parseDouble(priceString);
                    boolean productExisting = false;

                    DefaultTableModel cartModel = (DefaultTableModel) shopcart.getCartTable().getModel();
                    // 遍历购物车检查商品是否存在
                    for(int i = 0; i < cartModel.getRowCount();i++){
                        if(productID.equals(cartModel.getValueAt(i,0))){
                            int quantity = (Integer) cartModel.getValueAt(i, 1) + 1;
                            cartModel.setValueAt(quantity, i, 1);
                            productExisting = true;
                            break;
                        }
                    }
                    // 循环结束后判断是否添加新商品
                    if (!productExisting) {
                        shopcart.addProductToCart(productID, 1, price);
                        shopcart.setVisible(true);
                    }
                }
            }
        }
    }
}

2. 重构ShoppingCart类,移除静态变量

将表格改为实例变量,修正布局和初始化逻辑:

public class ShoppingCart extends JFrame {
    private ArrayList<String> listOfProducts = new ArrayList<>();
    private double total_cost;
    private JTable cartTable;
    private String[] columnNames = {"Product","Quantity","Price (£)"}; // 统一货币符号

    public ShoppingCart(String title){
        super(title);
        setSize(700,600);

        JPanel cartTablePanel = new JPanel(new BorderLayout());
        // 初始化空模型,避免默认空行
        DefaultTableModel model = new DefaultTableModel(columnNames, 0);
        cartTable = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(cartTable);
        cartTablePanel.add(scrollPane, BorderLayout.CENTER);
        cartTable.setGridColor(Color.BLACK);

        add(cartTablePanel);
    }

    // 提供getter方法供外部访问表格
    public JTable getCartTable() {
        return cartTable;
    }

    // 改为实例方法,移除静态
    public void addProductToCart(String productName, int quantity, double price) {
        DefaultTableModel model = (DefaultTableModel) cartTable.getModel();
        model.addRow(new Object[]{productName, quantity, price});
    }
}

额外优化建议

  • 商品信息优化:可将商品ID+名称合并显示在购物车的Product列,提升可读性。
  • 总价计算:添加总价标签,每次操作购物车时自动计算并更新显示。
  • 异常处理:对价格解析等步骤添加异常捕获,避免程序崩溃。

内容的提问来源于stack exchange,提问作者localalpha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:47:04