Java任务:完成商品购买并显示购物车详细信息

来自CloudWiki
跳转至: 导航搜索

前情回顾

上节课我们主要实现了商品信息的查看页面,分为客户端和管理端。

客户端:

Java9-2.png

管理端:

Java9-37.png

任务描述

这节课我们在此基础上实现按钮的监听器

以客户端为例,一点击购买按钮,效果如下图所示:

Java9-24.png

以客户端为例,一点击查看详情标签,,效果如下图所示:

Java9-25.png

以下操作均以客户端为例,管理端与之类似。

初始任务:添加事件监听器

客户端:

Java9-2.png

现在我们先尝试为窗体上的按钮添加最基本的事件处理程序。

为查询按钮添加事件处理程序

查询按钮:

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就行了。

Java9-35.png

设置初始化窗口时,加载所有数据

在刚才写好的在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()
			});
		}
    }

改写购买按钮的事件处理程序

下面我们为下方的购买按钮加上调用业务逻辑层代码的内容,业务逻辑如下:

  1. 获取用户在商品表格(JTable)中选取的商品(书籍)信息。
  2. 如果用户没有选取任何商品,则弹出提示框:请选择您需要购买的商品。
  3. 把用户选取的商品(书籍)添加入购物车。
  4. 如果购买数量大于库存数,则弹出提示框:书籍:《x》仅剩x本,无法满足您的购买需要。(该信息来自于购物车的购买异常CartyException)
  5. 购买成功后将商品加入购物车。
/**
     * 
     * 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){}
    }

管理端设计概要

管理端:

Java9-37.png

管理端主要实现商品的上架、下架、查询和修改功能,和客户端略有不同。

设计管理端窗体的界面

为各按钮添加基本的事件监听器

像客户端一样,为管理端的每个按钮添加基本的事件监听器,能弹出对话框就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就行了。

Java9-35.png

为上架按钮添加数据库操作

类似于客户端的购买按钮,

用户点击之后,监视器弹出对话框,询问上架的商品的名称、数量、售价等信息。

调用业务逻辑层,完成商品信息在数据库中的储存。

Java9-24.png

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号,并点击该按钮后

监视器调用业务逻辑层函数,进行实际下架。

下架成功后,弹出对话框,告诉管理员下架成功,效果类似于:

Java9-25.png

为查询按钮添加数据库操作

管理员输入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程序设计