Java任务:完成商品购买并显示购物车详细信息
前情回顾
上节课我们主要实现了商品信息的查看页面,分为客户端和管理端。
客户端:
管理端:
任务描述
这节课我们在此基础上实现按钮的监听器
以客户端为例,一点击购买按钮,效果如下图所示:
以客户端为例,一点击查看详情标签,,效果如下图所示:
以下操作均以客户端为例,管理端与之类似。
初始任务:添加事件监听器
客户端:
现在我们先尝试为窗体上的按钮添加最基本的事件处理程序。
为查询按钮添加事件处理程序
查询按钮:
btnQuery.addActionListener(new QueryAction());
查询按钮的监听器(内部类):
/** * * QueryAction:查询按钮的事件监听器 * */ private class QueryAction implements ActionListener{ public QueryAction(){ } @Override public void actionPerformed(ActionEvent e) { // 获取用户输入的账号和密码 String gName = textGoodsName.getText(); JOptionPane.showMessageDialog(null, gName, "信息", JOptionPane.INFORMATION_MESSAGE); } }
为购买按钮添加事件处理程序
购买按钮:
btnBuy.addActionListener(new BuyAction());
购买按钮的监听器:
/** * * BuyAction:购买按钮的事件监听器 * */ private class BuyAction implements ActionListener{ public BuyAction(){ } @Override public void actionPerformed(ActionEvent e) { String gName = textGoodsName.getText(); JOptionPane.showMessageDialog(null, gName, "信息", JOptionPane.INFORMATION_MESSAGE); } }
任务进阶:关联业务逻辑层(MVC)
下面,我们对刚才这个基本的查询事件监听器改造一下,里面加上调用业务逻辑层代码的内容
这一步,需要把以前编写的dao包、entity包、service等包复制到当前工程内。
创建业务逻辑层对象
为了后台查询的方便,在窗体类的成员变量位置,创建业务逻辑层对象GoodsService和CartService,如果是管理端,光创建一个GoodsService就行了。
设置初始化窗口时,加载所有数据
在刚才写好的在initial函数中添加如下代码,以便在窗口初始化时,加载所有数据:
//展示所有商品 ArrayList<Goods> goods=gs.queryGoods(); showBooks(goods);
showBooks的作用就是展示从数据库中查询到的数据:代码如下:
private void showBooks(ArrayList<Goods> goods){ //在表格中显示数据 DefaultTableModel dt=(DefaultTableModel) tblGoods.getModel(); dt.setRowCount(0); for(int i=0;i<goods.size();i++) { Goods g=goods.get(i); dt.insertRow(i, new Object[] { g.getId(),g.getName(),g.getNumber(),g.getPrice(), g.getTag().toString() }); } }
改写查询按钮的事件处理程序
/** * * QueryAction:查询按钮的事件监听器 * */ private class QueryAction implements ActionListener{ public QueryAction(){ } @Override public void actionPerformed(ActionEvent e) { // 获取用户输入的账号和密码 String gID = textGoodsID.getText(); //JOptionPane.showMessageDialog(null, gID, "信息", JOptionPane.INFORMATION_MESSAGE); Goods mygoods =gs.queryGoods(gID); ArrayList<Goods> goods=new ArrayList<>(); goods.add(mygoods); showBooks(goods); } }
在上面的代码中,调用了显示书籍数据的函数showBooks:
private void showBooks(ArrayList<Goods> goods){ //在表格中显示数据 DefaultTableModel dt=(DefaultTableModel) tblGoods.getModel(); dt.setRowCount(0); //判断是否查询到了满足条件的书籍信息 if(goods==null||goods.size()==0) { JOptionPane.showMessageDialog(frame, "没有满足条件的书籍信息","警告信息",JOptionPane.WARNING_MESSAGE); return; } for(int i=0;i<goods.size();i++) { Goods g=goods.get(i); dt.insertRow(i, new Object[] { g.getId(),g.getName(),g.getNumber(),g.getPrice(), g.getTag().toString() }); } }
改写购买按钮的事件处理程序
下面我们为下方的购买按钮加上调用业务逻辑层代码的内容,业务逻辑如下:
- 获取用户在商品表格(JTable)中选取的商品(书籍)信息。
- 如果用户没有选取任何商品,则弹出提示框:请选择您需要购买的商品。
- 把用户选取的商品(书籍)添加入购物车。
- 如果购买数量大于库存数,则弹出提示框:书籍:《x》仅剩x本,无法满足您的购买需要。(该信息来自于购物车的购买异常CartyException)
- 购买成功后将商品加入购物车。
/** * * BuyAction:购买按钮的事件监听器 * */ private class BuyAction implements ActionListener{ public BuyAction(){ } @Override public void actionPerformed(ActionEvent e) { // 获取用户输入的账号和密码 //String gID = textGoodsID.getText(); //JOptionPane.showMessageDialog(null, gID, "信息", JOptionPane.INFORMATION_MESSAGE); //获取用户在商品表格中选择的行 int selectRow = tblGoods.getSelectedRow(); //当用户没有选择商品时 if(selectRow<0) { JOptionPane.showMessageDialog(frame, "请选择你所需要购买的商品","错误信息",JOptionPane.WARNING_MESSAGE); return; } //获取用户购买的商品 Goods g=null; String id=tblGoods.getModel().getValueAt(selectRow, 0).toString(); g=gs.queryGoods(id); //询问顾客购买商品数量 int quantity=Integer.parseInt(JOptionPane.showInputDialog("你需要购买"+g.getName()+" 数量是:")); try { cs.addToCart(g, quantity); }catch(Exception e1) { JOptionPane.showInternalMessageDialog(frame, e1.getMessage(),"错误信息",JOptionPane.WARNING_MESSAGE); } //购买后获取购物车种商品数量 int goodsQuantity=cs.getNum(); //显示购物车中的数据 lblQuantity.setText(goodsQuantity+"件"); } }
为“查看详情”标签添加事件
最后,我们为“查看详情”添加事件,单击鼠标左键弹出购物车详细信息: 查看详情标签:
btn_Check.addMouseListener(new CheckMouse());
相应的鼠标监听器:
/*CheckAction:查看详情的监听器 * */ private class CheckMouse implements MouseListener{ public CheckMouse(){ } @Override public void mousePressed(MouseEvent e){} public void mouseClicked(MouseEvent e){ if(e.getButton()==MouseEvent.BUTTON1) { JOptionPane.showMessageDialog(frame, cs.getCart(),"购物车信息",JOptionPane.INFORMATION_MESSAGE); } } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} }
管理端设计概要
管理端:
管理端主要实现商品的上架、下架、查询和修改功能,和客户端略有不同。
设计管理端窗体的界面
为各按钮添加基本的事件监听器
像客户端一样,为管理端的每个按钮添加基本的事件监听器,能弹出对话框就OK了!
如:
查询按钮:
btnQuery.addActionListener(new QueryAction());
查询按钮的监听器(内部类):
/** * * QueryAction:查询按钮的事件监听器 * */ private class QueryAction implements ActionListener{ public QueryAction(){ } @Override public void actionPerformed(ActionEvent e) { // 获取用户输入的账号和密码 String gName = textGoodsName.getText(); JOptionPane.showMessageDialog(null, gName, "信息", JOptionPane.INFORMATION_MESSAGE); } }
创建业务逻辑层对象
下面,我们对刚才这个基本的查询事件监听器改造一下,里面加上调用业务逻辑层代码的内容
这一步,需要把以前编写的dao包、entity包、service等包复制到当前工程内。 为了后台查询的方便,在窗体类的成员变量位置,创建业务逻辑层对象GoodsService和CartService,如果是管理端,光创建一个GoodsService就行了。
为上架按钮添加数据库操作
类似于客户端的购买按钮,
用户点击之后,监视器弹出对话框,询问上架的商品的名称、数量、售价等信息。
调用业务逻辑层,完成商品信息在数据库中的储存。
private class AddAction implements ActionListener{ public AddAction(){ } @Override public void actionPerformed(ActionEvent e) { inputBooks(); } } private Goods inputBooks(){ Goods g= new Goods(); try{ String id=JOptionPane.showInputDialog("请输入商品编号:"); g.setId(id); String name= JOptionPane.showInputDialog("请输入商品名称:"); g.setName(name); int n= Integer.parseInt(JOptionPane.showInputDialog("请输入商品数量:")); g.setNumber(n); Float p = Float.parseFloat(JOptionPane.showInputDialog("请输入商品价格:")); g.setPrice(p); JOptionPane.showMessageDialog(null, "商品信息录入成功!", "信息", JOptionPane.INFORMATION_MESSAGE); Tag t= inputTags();//调用视图层,为该商品选择一种标签 g.setTag(t); gs.addGoods(g);//调用业务逻辑层,添加商品到数据库 //此处加入更新表格的代码 }catch(NumberFormatException e){ JOptionPane.showMessageDialog(frame, e.toString(),"警告信息",JOptionPane.WARNING_MESSAGE); } return g; } public Tag inputTags() { String type_id=JOptionPane.showInputDialog("请输入类别编号(1-4):\r\n" + "1.纸质书籍, 软件编程\r\n" + "2.纸质书籍, 软件编程\r\n" + "3.电子产品, 学习工具\r\n" + "4.其他标签\r\n" + "*******************************"); //根据用户的选择创建相应标签对象 Tag t =null; try { int choise = Integer.parseInt(type_id); switch(choise) { case 1: t= new Tag(1, "纸质书籍", "软件编程"); break; case 2: t= new Tag(1, "纸质书籍", "文学经典"); break; case 3: t= new Tag(1, "电子产品", "学习工具"); break; default:t= new Tag(2, "其他", "其他"); }//显示管理员输入的菜单序号 //System.out.println(MessageFormat.format("您选择的是:{0}", t.toString())); JOptionPane.showMessageDialog(null, "您选择的是:"+ t.toString(), "信息", JOptionPane.INFORMATION_MESSAGE); } catch (NumberFormatException e) { // 转换失败,对外返回-1,表示输入无效 JOptionPane.showMessageDialog(null, e.toString(),"警告信息",JOptionPane.WARNING_MESSAGE); } return t; }
为下架按钮添加数据库操作
管理员输入ID号,并点击该按钮后
监视器调用业务逻辑层函数,进行实际下架。
下架成功后,弹出对话框,告诉管理员下架成功,效果类似于:
为查询按钮添加数据库操作
管理员输入ID号,并点击该按钮后
监视器调用业务逻辑层函数,进行实际查询。
查询成功后,在下方的表格中显示商品信息。
为修改按钮添加数据库操作
管理员输入ID号,并点击该按钮后
监视器调用业务逻辑层函数,进行实际修改。
修改成功后,弹出对话框,告诉管理员修改成功。
为查看详情按钮添加数据库操作=
一点击查看详情按钮,在中间的表格中会显示库存中的所有商品信息。
private class QueryallAction implements ActionListener { public QueryallAction() { } public void actionPerformed(ActionEvent e) { //展示所有商品 ArrayList<Goods> goods=gs.queryGoods(); showBooks(goods); } }
showBooks的作用就是展示从数据库中查询到的数据:代码如下:
private void showBooks(ArrayList<Goods> goods){ //在表格中显示数据 DefaultTableModel dt=(DefaultTableModel) tblGoods.getModel(); dt.setRowCount(0); for(int i=0;i<goods.size();i++) { Goods g=goods.get(i); dt.insertRow(i, new Object[] { g.getId(),g.getName(),g.getNumber(),g.getPrice(), g.getTag().toString() }); } }
返回 Java程序设计