概述
本次作业主要是为之前做的购物车系统添加图形界面,下面展示的是GUI的主要代码和运行的截图
GUI主要代码
组件
使用到的组件主要是JFrame、JPanel、JLable、JScrollPane和JButton
Mall mall;
ShoppingCart cart;
JFrame frame = new JFrame("lwx的购物车");
JButton shopButton = new JButton(" 商城 ");
JButton cartButton = new JButton(" 购物车 ");
JPanel mainPanel = new JPanel(new CardLayout());
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
//商城组件
JPanel mallPanel = new JPanel(new BorderLayout());
JPanel mallNorth = new JPanel();
JPanel mallCenter = new JPanel(new BorderLayout());
JLabel shuxing1 = new JLabel("名称 价格 数量");
JButton addToCart = new JButton("加入购物车");
JPanel mallGoodsPanel = new JPanel();
JScrollPane mallGoods = new JScrollPane(mallGoodsPanel);
//购物车组件
JPanel cartPanel = new JPanel(new BorderLayout());
JPanel cartNorth = new JPanel();
JPanel cartCenter = new JPanel(new BorderLayout());
JLabel shuxing2 = new JLabel("名称 价格 数量");
JPanel cartSouth = new JPanel(new BorderLayout());
JPanel cartGoodsPanel = new JPanel();
JScrollPane cartGoods = new JScrollPane(cartGoodsPanel);
JButton delete = new JButton("删除商品");
JButton clear = new JButton("清空购物车");
JButton checkOut = new JButton("结算购物车");
界面设计、展示方法
进入主界面后默认显示商城界面,主界面下方有“商城”和“购物车”两个按钮,点击按钮可以进入对应的界面。商城界面上显示商品的信息以及“加入购物车”的按钮,点击后可以选择商品和数量加入购物车;购物车界面显示商品信息与商城界面差不多,下方有三个按钮,分别为“删除商品”“清空购物车”“结算购物车”。
界面设计主要代码如下:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 700);
//商城界面
mallNorth.add(new JLabel("商城界面"), BorderLayout.CENTER);
mallPanel.add(mallNorth, BorderLayout.NORTH);
mallPanel.add(mallCenter);
mallCenter.add(shuxing1, BorderLayout.NORTH);
mallCenter.add(addToCart, BorderLayout.SOUTH);
mallCenter.add(mallGoods, BorderLayout.CENTER);
mallGoodsPanel.setLayout(new GridLayout(0, 3));
mallGoods.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
mallGoods.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
showMallGoods(mallGoodsPanel);
//购物车界面
cartNorth.add(new JLabel("购物车界面"), BorderLayout.NORTH);
cartPanel.add(cartNorth, BorderLayout.NORTH);
cartCenter.add(shuxing2, BorderLayout.NORTH);
cartPanel.add(cartCenter);
cartSouth.add(delete, BorderLayout.WEST);
cartSouth.add(clear, BorderLayout.CENTER);
cartSouth.add(checkOut, BorderLayout.EAST);
cartCenter.add(cartSouth, BorderLayout.SOUTH);
cartCenter.add(cartGoods, BorderLayout.CENTER);
cartCenter.add(cartGoods, BorderLayout.CENTER);
cartGoodsPanel.setLayout(new GridLayout(0, 3));
cartGoods.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
cartGoods.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
showCartGoods(cartGoodsPanel);
//按钮监听器
addToCart.addActionListener(e -> addToCartButton());
delete.addActionListener(e -> deleteButton());
clear.addActionListener(e -> clearButton());
checkOut.addActionListener(e -> checkOutButton());
mainPanel.add(mallPanel, "Shop");
mainPanel.add(cartPanel, "Cart");
CardLayout cardLayout = (CardLayout) mainPanel.getLayout();
shopButton.addActionListener(e -> cardLayout.show(mainPanel, "Shop"));
cartButton.addActionListener(e -> cardLayout.show(mainPanel, "Cart"));
buttonPanel.add(shopButton);
buttonPanel.add(cartButton);
frame.add(mainPanel, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
按钮监听器方法
分别为商城和购物车总共四个按钮设计了方法
public void addToCartButton() {
JPanel panel = new JPanel(new GridLayout(2, 2));
// 向面板添加标签和文本框
panel.add(new JLabel("名称:"));
JTextField productName = new JTextField(10); // 输入商品名称的文本框
panel.add(productName);
panel.add(new JLabel("数量:"));
JTextField quantity = new JTextField(5); // 输入数量的文本框
panel.add(quantity);
// 显示输入对话框
int result = JOptionPane.showConfirmDialog(null, panel, "请选择要购买的商品和数量", JOptionPane.OK_CANCEL_OPTION);
// 当点击确定按钮时
if (result == JOptionPane.OK_OPTION) {
String name = productName.getText(); // 获取商品名称
if (name.isEmpty()) {
// 商品名称为空,弹出提示框
JOptionPane.showMessageDialog(null, "请输入商品名称", "错误", JOptionPane.ERROR_MESSAGE);
return; // 终止方法
}
int num;
if (quantity.getText().matches("-?\\d+") && Integer.parseInt(quantity.getText()) >= 1) //若输入为整型数据
num = Integer.parseInt(quantity.getText()); // 获取商品数量
else {
JOptionPane.showMessageDialog(null, "请输入正确的商品数量", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
// 在这里处理获取到的商品名称和数量,可以添加到购物车中或进行其他操作
// 例如:将商品名称和数量添加到购物车中
if (mall.search(name) == null)
JOptionPane.showMessageDialog(null, "没有这个商品", "提示", JOptionPane.INFORMATION_MESSAGE);
else if (num > (mall.search(name).getInventory()))
JOptionPane.showMessageDialog(null, "商品库存不足", "提示", JOptionPane.INFORMATION_MESSAGE);
else {
mall.deleteGoods(name, num);
cart.add(mall.search(name), num);
showMallGoods(mallGoodsPanel);
showCartGoods(cartGoodsPanel);
JOptionPane.showMessageDialog(null, "成功将 " + name + " * " + num + "加入购物车!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
}
}
public void deleteButton() {
JPanel panel = new JPanel(new GridLayout(2, 2));
// 向面板添加标签和文本框
panel.add(new JLabel("名称:"));
JTextField productName = new JTextField(10); // 输入商品名称的文本框
panel.add(productName);
panel.add(new JLabel("数量:"));
JTextField quantity = new JTextField(5); // 输入数量的文本框
panel.add(quantity);
// 显示输入对话框
int result = JOptionPane.showConfirmDialog(null, panel, "请选择需要删除的商品和数量", JOptionPane.OK_CANCEL_OPTION);
// 当点击确定按钮时
if (result == JOptionPane.OK_OPTION) {
String name = productName.getText(); // 获取商品名称
if (name.isEmpty()) {
// 商品名称为空,弹出提示框
JOptionPane.showMessageDialog(null, "请输入商品名称", "错误", JOptionPane.ERROR_MESSAGE);
return; // 终止方法
}
int num;
if (quantity.getText().matches("-?\\d+") && Integer.parseInt(quantity.getText()) >= 1) //若输入为整型数据
num = Integer.parseInt(quantity.getText()); // 获取商品数量
else {
JOptionPane.showMessageDialog(null, "请输入正确的商品数量", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
Boolean b = cart.delete(name, num);
if (!b) {
JOptionPane.showMessageDialog(null, "商品不存在或数量不足", "提示", JOptionPane.INFORMATION_MESSAGE);
} else {
mall.addGoods(name,num);
JOptionPane.showMessageDialog(null, "成功将 " + name + " * " + num + "从购物车中删除!", "提示", JOptionPane.INFORMATION_MESSAGE);
showMallGoods(mallGoodsPanel);
showCartGoods(cartGoodsPanel);
}
}
}
public void clearButton(){
ArrayList<Commodity> com = cart.getItems();
ArrayList<Integer> number = cart.getNumber();
for (int i = 0; i < com.size(); i++) {
mall.addGoods(com.get(i).getName(),number.get(i));
}
cart.clear();
JOptionPane.showMessageDialog(null, "成功清空购物车!", "提示", JOptionPane.INFORMATION_MESSAGE);
showMallGoods(mallGoodsPanel);
showCartGoods(cartGoodsPanel);
}
public void checkOutButton(){
JOptionPane.showMessageDialog(null, "结算成功,共需支付:"+cart.checkout()+" 元!", "提示", JOptionPane.INFORMATION_MESSAGE);
cart.clear();
showMallGoods(mallGoodsPanel);
showCartGoods(cartGoodsPanel);
}
运行截图
1.先添加一些物品到购物车
2.购物车删除商品
3.清空购物车
4.结算购物车(重新添加500苹果和1个手机)
5.补充
在商城添加商品到购物车时商城商品数量会对应减少,在购物车删除或清空时对应的商品数量会回到商城中,结算购物车之后购物车商品会清空但不会回到商城。
总结
项目的图形界面主要是通过一个新增的GUI类实现的,对原本的购物车核心代码没有改动,核心代码可以用于控制台或者图形界面。