You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
localhost9000/DishListFramewcy.java

314 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package view;
import dao.DishDAOwcy;
import dao.impl.DishDaoImplwcy;
import domain.Dishwcy;
import javax.swing.*;
import javax.swing.table.TableModel;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
//商品列表窗口
public class DishListFramewcy extends MyFrame{
private JTable table;
//菜品图片
private JLabel lblImage;
//列表价格
private JLabel lblListprice;
//菜品描述
private JLabel lblDescn;
//菜品价格
private JLabel lblUnitcost;
//商品列表集合
private List<Dishwcy> dishs;
///创建商品Dao对象
private final DishDAOwcy dao =new DishDaoImplwcy();
//购物车键是选择商品的Id值是商品的数量
private Map<String,Integer> cart = new HashMap<String,Integer>();
//选择的商品索引
private int selectedRow = -1;
// 构造方法,初始化窗口和界面
public DishListFramewcy(String title,int width,int height){
super(title,width,height);
this.tubiao();
//查询所有商品
dishs = dao.findAll();
//初始化界面
//添加顶部搜索面板
getContentPane().add(getSearchPanel(),BorderLayout.NORTH);
//初始化分隔面板
JSplitPane splitPane = new JSplitPane();
//设置分隔线位置
splitPane.setDividerLocation(600);
//设置左侧面板
splitPane.setLeftComponent(getLeftPanel());
//设置右侧面板
splitPane.setRightComponent(getRightPanel());
//添加分隔面板
getContentPane().add(splitPane,BorderLayout.CENTER);
}
// 获取搜索面板,包含商品类别选择和查询按钮
private JPanel getSearchPanel(){
//创建一个新的 JPanel 对象,并将其引用存储在局部变量 searchPanel 中。
JPanel searchPanel = new JPanel();
//获取 searchPanel 当前的布局管理器,并将其强制转换为 FlowLayout 类型。
FlowLayout flowLayout = (FlowLayout) searchPanel.getLayout();
//设置 FlowLayout 的垂直间隔为 20 像素。
flowLayout.setVgap(20);
//设置 FlowLayout 的水平间隔为 40 像素。
flowLayout.setHgap(40);
//创建一个新的 JLabel 对象,用于显示文本 "选择商品类别:"。
JLabel lbl = new JLabel("选择商品类别:");
//为标签 lbl 设置字体样式和大小。
lbl.setFont(new Font("微软雅黑", Font.PLAIN, 15));
//将标签 lbl 添加到 searchPanel 中。
searchPanel.add(lbl);
//定义一个字符串数组 categorys包含商品类别的名称。
String[] categorys = {"凉菜","肉类","主食","海鲜","饮料"};
//创建一个新的 JComboBox 对象,使用 categorys 数组作为下拉列表的选项。
JComboBox comboBox = new JComboBox(categorys);
//为下拉列表 comboBox 设置字体样式和大小。
comboBox.setFont(new Font("微软雅黑",Font.PLAIN,15));
//将下拉列表 comboBox 添加到 searchPanel 中。
searchPanel.add(comboBox);
//创建一个新的 JButton 对象,用于触发查询操作,按钮上显示文本 "查询"。
JButton btnGo = new JButton("查询");
//为按钮 btnGo 设置字体样式和大小
btnGo.setFont(new Font("微软雅黑",Font.PLAIN,15));
//将按钮 btnGo 添加到 searchPanel 中。
searchPanel.add(btnGo);
//创建一个新的 JButton 对象,用于重置搜索条件,按钮上显示文本 "重置"。
JButton btnReset = new JButton("重置");
//为按钮 btnReset 设置字体样式和大小。
btnReset.setFont(new Font("微软雅黑",Font.PLAIN,15));
//将按钮 btnReset 添加到 searchPanel 中。
searchPanel.add(btnReset);
//注册查询按钮的ActionEvent事件监听器
btnGo.addActionListener(e -> {
//从下拉列表 comboBox 中获取选中的商品类别。
String category = (String) comboBox.getSelectedItem();
//调用 dao 对象的 findByCategory 方法,根据选中的类别查询商品列表,并更新 dishs 变量。
dishs = dao.findByCategory(category);
//创建一个新的 DishTableModelwcy 对象,使用更新后的 dishs 列表作为数据源。
TableModel model = new DishTableModelwcy(dishs);
//更新 table 组件的数据模型为新创建的 model。
table.setModel(model);
});
//注册重置按钮的ActionEvent事件监听器
btnReset.addActionListener(e -> {
//调用 dao 对象的 findAll 方法,获取所有商品的列表,并更新 dishs 变量。
dishs = dao.findAll();
//创建一个新的 DishTableModelwcy 对象,使用 dishs 列表作为数据源。
TableModel model = new DishTableModelwcy(dishs);
//更新 table 组件的数据模型为新创建的 model。
table.setModel(model);
});
return searchPanel;
}
// 获取右侧面板,显示商品详情和操作按钮
private JPanel getRightPanel() {
//创建一个新的 JPanel 对象,这将是右侧面板。
JPanel rightPanel = new JPanel();
//设置 rightPanel 的背景颜色为白色。
rightPanel.setBackground(Color.WHITE);
//为 rightPanel 设置布局管理器为 GridLayout其参数分别为行数、列数以及行和列之间的间隙
rightPanel.setLayout(new GridLayout(2, 1, 0, 0));
//创建一个新的 JLabel 对象,用于后续显示商品图片。
lblImage = new JLabel();
//将图片标签 lblImage 添加到 rightPanel。
rightPanel.add(lblImage);
//设置 lblImage 的水平对齐方式为居中。
lblImage.setHorizontalAlignment(SwingConstants.CENTER);
//创建一个新的 JPanel 对象,用于展示商品的详细信息。
JPanel detailPanel = new JPanel();
//设置 detailPanel 的背景颜色为白色。
detailPanel.setBackground(Color.WHITE);
//将 detailPanel 添加到 rightPanel。
rightPanel.add(detailPanel);
//为 detailPanel 设置布局管理器为 GridLayout具有8行1列以及行和列之间的间隙。
detailPanel.setLayout(new GridLayout(8, 1, 0, 5));
//创建一个水平分隔线组件。
JSeparator separator_1 = new JSeparator();
//将分隔线 separator_1 添加到 detailPanel。
detailPanel.add(separator_1);
//创建一个新的 JLabel 对象,用于显示商品的列表价格。
lblListprice = new JLabel();
//将 lblListprice 添加到 detailPanel。
detailPanel.add(lblListprice);
//为 lblListprice 设置字体样式和大小。
lblListprice.setFont(new Font("微软雅黑", Font.PLAIN, 16));
//
lblUnitcost = new JLabel();
//将 lblUnitcost 添加到 detailPanel。
detailPanel.add(lblUnitcost);
//为 lblUnitcost 设置字体样式和大小。
lblUnitcost.setFont(new Font("微软雅黑", Font.PLAIN, 16));
lblDescn = new JLabel();
//将 lblDescn 添加到 detailPanel。
detailPanel.add(lblDescn);
//为 lblDescn 设置字体样式和大小。
lblDescn.setFont(new Font("微软雅黑", Font.PLAIN, 16));
JSeparator separator_2 = new JSeparator();
detailPanel.add(separator_2);
//创建一个按钮,用于将选中的商品添加到购物车。
JButton btnAdd = new JButton("添加购物车");
//为按钮 btnAdd 设置字体样式和大小。
btnAdd.setFont(new Font("微软雅黑", Font.PLAIN, 15));
//将按钮 btnAdd 添加到 detailPanel。
detailPanel.add(btnAdd);
//创建一个空的标签,用作布局占位。
JLabel lb1 = new JLabel("");
//将占位标签 lb1 添加到 detailPanel。
detailPanel.add(lb1);
//创建一个按钮,用于查看购物车。
JButton btnCheck = new JButton("查看购物车");
//为按钮 btnCheck 设置字体样式和大小。
btnCheck.setFont(new Font("微软雅黑", Font.PLAIN, 15));
//将按钮 btnCheck 添加到 detailPanel。
detailPanel.add(btnCheck);
//注册【查看购物车】按钮的ActionEvent事件监听器
btnAdd.addActionListener(e -> {
//检查是否有商品被选中如果没有选中任何商品selectedRow 为 -1则不执行任何操作。
if (selectedRow == -1) {
return;
}
//获取选中的商品对象。
Dishwcy selectdish = dishs.get(selectedRow);
//获取选中商品的ID。
String dishid = selectdish.getDishid();
//检查购物车中是否已经包含该商品ID。
if (cart.containsKey(dishid)) {
//如果购物车中已有该商品,则增加其数量。
Integer quantity = cart.get(dishid);
cart.put(dishid, ++quantity);
} else {
//如果购物车中没有该商品则添加到购物车并设置数量为1。
cart.put(dishid, 1);
}
//打印购物车的内容到控制台(调试用)。
System.out.println(cart);
});
//注册【查看购物车】按钮的ActionEvent事件监听器
btnCheck.addActionListener(e -> {
//创建一个新的 CartFrametyj 对象,传递当前的购物车和当前窗口作为参数。
CartFrametyj cartFrame = new CartFrametyj(cart, this);
//显示购物车窗口。
cartFrame.setVisible(true);
//隐藏当前窗口。
setVisible(false);
});
//返回配置好的 rightPanel 对象。
return rightPanel;
}
// 获取左侧面板,包含商品列表的滚动窗格
private JScrollPane getLeftPanel(){
//创建一个新的 JScrollPane 对象,用于提供滚动功能。
JScrollPane leftScrollPane = new JScrollPane();
//调用 getTable 方法获取 JTable 对象,并将其设置为 JScrollPane 的视图组件。
leftScrollPane.setViewportView(getTable());
//返回配置好的 JScrollPane 对象,即左侧面板。
return leftScrollPane;
}
// 定义了一个名为 getTable 的私有方法,用于创建和配置商品列表的 JTable 控件。
private JTable getTable() {
//创建一个新的 TableModel 对象,使用当前的 dishs 商品列表作为数据源。
TableModel model = new DishTableModelwcy(this.dishs);
//检查是否已经创建了 JTable 对象。如果尚未创建,将进入条件块进行初始化。
if (table == null) {
//创建一个新的 JTable 对象,使用上面创建的 model 作为其数据模型。
table = new JTable(model);
//为 JTable 设置字体样式和大小。
table.setFont(new Font("微软雅黑", Font.PLAIN, 16));
//为 JTable 的表头设置字体样式和大小。
table.getTableHeader().setFont(new Font("微软雅黑", Font.PLAIN, 16));
//设置 JTable 的行高。
table.setRowHeight(51);
//设置 JTable 的选择模式为单选。
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//获取 JTable 的选择模型。
ListSelectionModel rowSelectionModel = table.getSelectionModel();
//为选择模型添加一个列表选择监听器,用于处理表格行的选择事件。
rowSelectionModel.addListSelectionListener(e -> {
//如果选择值正在调整中,则不处理事件。
if (e.getValueIsAdjusting()) {
return;
}
//获取触发事件的选择模型,并更新 selectedRow 为当前选中的行索引。
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
selectedRow = lsm.getMinSelectionIndex();
//如果没有选中任何行,则不执行任何操作。
if (selectedRow < 0) {
return;
}
//根据选中行索引获取对应的 Dishwcy 商品对象。
Dishwcy p = dishs.get(selectedRow);
//格式化商品图片的路径。
String petImage = String.format("/images/%s", p.getImage());
//创建一个 ImageIcon 对象,用于显示商品图片。
ImageIcon icon = new ImageIcon(DishListFramewcy.class.getResource(petImage));
//更新 lblImage 标签的图标为商品图片。
lblImage.setIcon(icon);
//获取商品描述并更新 lblDescn 标签的文本。
String descn = p.getDescn();
lblDescn.setText("商品描述:" + descn);
//获取商品单位成本,格式化为字符串,并更新 lblUnitcost 标签的文本。
double unitcost = p.getUnitcost();
String slilUnitcost = String.format("商品单价%.2f", unitcost);
lblUnitcost.setText(slilUnitcost);
});
} else {
table.setModel(model);
}
return table;
}
// 设置窗口图标
public void tubiao() {
MyFrame.setTitleImage(this,"e39b4ce2ebe83d39adabb339c23a1e0.png" );
}
}