为什么当单击“添加到购物车”按钮时我的购物车没有更新和显示值?
我发现很难在 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 中显示任何值
有很多问题对您没有帮助。您的问题的“核心”问题可以在您的
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
。从长远来看,这将使您的生活变得更加轻松