未在 JTable 问题中显示产品

问题描述 投票:0回答:1

为什么当单击“添加到购物车”按钮时我的购物车没有更新和显示值?

我发现很难在 ShoppingCart 类的 Jtable 中显示用户从 ShoppingCentre 类的 JTable 中选择的产品

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;

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);
        String[] columnNames = {"Product ID","Name","Category","Price(£)","Info"};
        String [] [] data = new String [(product_data.size())] [5];

        int i = 0;
        for(Map.Entry<String, Product> entry : product_data.entrySet()){
            Product product = entry.getValue();
            data [i] [0] = product.getProductID();
            data [i] [1] = product.getProductName();
            data [i] [2] = product.getCategory();
            data [i] [3] = Double.toString(product.getPrice());
            data [i] [4] = product.getInfo();
            i++;

        }

        JPanel SelectPanel = new JPanel();
        SelectPanel.setLayout(new FlowLayout());

        // constructing the label with text "Select Product Category"
        JLabel jlblName = new JLabel("Select Product Category : ");
        SelectPanel.add(jlblName);


        // constructing the combo box with choices All,Electronics,Clothing
        JComboBox jcboProductCategory = new JComboBox (new String[]{"All","Electronics","Clothing"});
        SelectPanel.add(jcboProductCategory);

        // constructing shopping cart btn
        CartBtn = new JButton("Shopping Cart");
        SelectPanel.add(CartBtn);

        JPanel TablePanel = new JPanel();
        TablePanel.setLayout(new FlowLayout());

        // constructing the product info table
        DefaultTableModel model = new DefaultTableModel(data,columnNames);
        prodInfoTable = new JTable(model);
        TablePanel.add(prodInfoTable);

        // container for a table
        JScrollPane scrollPane = new JScrollPane(prodInfoTable);
        TablePanel.add(scrollPane,BorderLayout.CENTER);
        prodInfoTable.setGridColor(Color.BLACK);

        // panel for the product details
        JPanel infopanel = new JPanel(new BorderLayout(0,25));
        JLabel SelectedProdLbl = new JLabel("Selected Product - Details");
        ShoppingCartBtn = new JButton("Add to Shopping Cart ");
        JLabel text = new JLabel("NBGJDLBLDGB");
        infopanel.add(SelectedProdLbl,BorderLayout.NORTH);
        infopanel.add(text,BorderLayout.CENTER);
        infopanel.add(ShoppingCartBtn,BorderLayout.SOUTH);



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

        // visualise the table and the frame
        setLayout(new BorderLayout ());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(TablePanel);
        add(SelectPanel,BorderLayout.NORTH);
        add(scrollPane,BorderLayout.CENTER);
        add(infopanel,BorderLayout.SOUTH);
        setSize(700,600);
        setVisible(true);
    }

    private class EventHandler implements ActionListener{
        private int quantity = 0;
        private String [] [] data = new String [0][3];
        @Override
        public void actionPerformed(ActionEvent event) {

            if(event.getSource() == CartBtn){
                ShoppingCart sc = new ShoppingCart("Shopping Cart");
            } else if (event.getSource() == ShoppingCartBtn ) {
                int SelectedRow = prodInfoTable.getSelectedRow();
                if(SelectedRow != -1){
                    String productID = (String) prodInfoTable.getValueAt(SelectedRow,0);  // https://docs.oracle.com/javase%2F7%2Fdocs%2Fapi%2F%2F/javax/swing/JTable.html#getValueAt(int,%20int)
                    String productName = (String) prodInfoTable.getValueAt(SelectedRow,1);
                    String  productdetails= (String) prodInfoTable.getValueAt(SelectedRow,4);

                    String priceString= (String) prodInfoTable.getValueAt(SelectedRow, 3);
                    double price = Double.parseDouble(priceString);
                    boolean productExisting = false;
                    for(int i = 0; i < shopcart.cartTable.getRowCount();i++){
                        if(productID.equals(shopcart.cartTable.getValueAt(i,0))){
                            int quantity = (Integer) shopcart.cartTable.getValueAt(i, 1) + 1;
                            ShoppingCart.cartTable.setValueAt(quantity, i, 1); // Update quantity
                            productExisting = true;
                            break;
                        }
                        if (!productExisting) {
                            shopcart.addProductToCart(productID, 1, price);
                            shopcart.setVisible(true);
                        }

                    }

//                    String Product = s + "\n" + y + "\n" + z ;
//                    quantity++;
//
//                    String p = (String)prodInfoTable.getValueAt(SelectedRow,3);
//                    double price = Double.parseDouble(p) * quantity;
//                    String [] [] newData = new String[data.length + 1][3];
//                    System.arraycopy(data,0,newData,0,data.length);
//                    newData [data.length][0] = Product;
//                    newData [data.length][1] = Integer.toString(quantity);
//                    newData [data.length][2] = Double.toString(price);
//                    ShoppingCart.loadProductInfoToCart(newData);
                }
            }
        }
    }




}

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.ArrayList;

public class ShoppingCart extends JFrame {
    private ArrayList<String> listOfProducts = new ArrayList<>();
    private double total_cost;

    public static JTable cartTable;
    private String [][] data = new String[1][3];

    private String[] columnNames = {"Product","Quantity","Price ($)"};

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

        JPanel cartTablePanel  = new JPanel();
        DefaultTableModel model = new DefaultTableModel(data,columnNames);
        cartTable = new JTable(model);
        cartTablePanel.add(cartTable);

        JScrollPane scrollPane = new JScrollPane(cartTable);
        cartTablePanel.add(scrollPane, BorderLayout.CENTER);
        cartTable.setGridColor(Color.BLACK);

        add(cartTablePanel);
        add(scrollPane,BorderLayout.CENTER);


    }
    public static void addProductToCart(String productName, int quantity, double price) {
        DefaultTableModel model = (DefaultTableModel) cartTable.getModel();
        model.addRow(new Object[]{productName, quantity, price});
    }

//    public static void loadProductInfoToCart(String [] [] array){
//        data = array;
//        //data = new String[][]{new String[]{Product}, new String[]{Integer.toString(quantity)}, new String[]{Double.toString(price)}};
//    }
}

我尝试使用多种方法,然后在购物管理器类中的购物车类中使用静态变量,但它没有在购物车类的 Jtable 中显示任何值

java swing user-interface
1个回答
0
投票

有很多问题对您没有帮助。您的问题的“核心”问题可以在您的

EventHandler
课程中找到...

public void actionPerformed(ActionEvent event) {
    if (event.getSource() == CartBtn) {
        ShoppingCart sc = new ShoppingCart("Shopping Cart");
    } 
    //...

您正在创建

ShoppingCart
的新实例并将其分配给局部变量,一旦该方法存在,该变量就会丢失。这意味着外部类的
static
属性永远不会被赋值,当你这样做时......

if (!productExisting) {
    shopcart.addProductToCart(productID, 1, price);
    shopcart.setVisible(true);
}

您最终会得到

NullPointerException

简单的答案是将

ShoppingCart
的新实例分配给
shopcart
属性(也许首先检查该值是否为
null
)。

但是,我的直觉是,您应该使用依赖注入,以便将产品信息和购物车之类的内容传递到类中。

在这种情况下你也应该避免

static
,它不是你的朋友,从长远来看不会帮助你。

我还会考虑创建一个自定义的

TableModel
,它可以包裹(一个
List
Product
。从长远来看,这将使您的生活变得更加轻松

© www.soinside.com 2019 - 2024. All rights reserved.