“Java任务:完成商品购买并显示购物车详细信息”的版本间的差异

来自CloudWiki
跳转至: 导航搜索
任务进阶:关联业务逻辑层(MVC)
 
(未显示同一用户的13个中间版本)
第8行: 第8行:
 
管理端:
 
管理端:
  
[[文件:java9-21.png]]
+
[[文件:Java9-37.png]]
  
 
==任务描述==
 
==任务描述==
第22行: 第22行:
 
<h3 >以下操作均以客户端为例,管理端与之类似。</h3>
 
<h3 >以下操作均以客户端为例,管理端与之类似。</h3>
 
==初始任务:添加事件监听器==
 
==初始任务:添加事件监听器==
 
  
 
客户端:
 
客户端:
第88行: 第87行:
  
 
[[文件:java9-35.png]]
 
[[文件:java9-35.png]]
 +
 +
===设置初始化窗口时,加载所有数据===
 +
在刚才写好的在initial函数中添加如下代码,以便在窗口初始化时,加载所有数据:
 +
 +
<nowiki>//展示所有商品
 +
ArrayList<Goods> goods=gs.queryGoods();
 +
showBooks(goods);</nowiki>
 +
 +
showBooks的作用就是展示从数据库中查询到的数据:代码如下:
 +
<nowiki>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()
 +
});
 +
}
 +
    }</nowiki>
  
 
===改写查询按钮的事件处理程序===
 
===改写查询按钮的事件处理程序===
第181行: 第202行:
 
}
 
}
 
}</nowiki>
 
}</nowiki>
===设置初始化窗口时,加载所有数据===
 
最后,在initial函数中添加如下代码,以便在窗口初始化时,加载所有数据:
 
<nowiki>//展示所有商品
 
ArrayList<Goods> goods=gs.queryGoods();
 
showBooks(goods);</nowiki>
 
  
==终极任务:显示购买情况==
+
===为“查看详情”标签添加事件===
 
最后,我们为“查看详情”添加事件,单击鼠标左键弹出购物车详细信息:
 
最后,我们为“查看详情”添加事件,单击鼠标左键弹出购物车详细信息:
 
查看详情标签:
 
查看详情标签:
第215行: 第231行:
 
管理端:
 
管理端:
  
[[文件:java9-21.png]]
+
[[文件:Java9-37.png]]
  
 +
管理端主要实现商品的上架、下架、查询和修改功能,和客户端略有不同。
 +
===设计管理端窗体的界面===
 
===为各按钮添加基本的事件监听器===
 
===为各按钮添加基本的事件监听器===
首先,像客户端一样,为管理端添加基本的事件监听器,能弹出对话框就OK了!
+
像客户端一样,为管理端的每个按钮添加基本的事件监听器,能弹出对话框就OK了!
 +
 
 +
如:
 +
 
 +
查询按钮:
 +
<nowiki>btnQuery.addActionListener(new QueryAction());</nowiki>
 +
 
 +
 
 +
查询按钮的监听器(内部类):
 +
<nowiki>/**
 +
    *
 +
    * 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);
 +
}
 +
}</nowiki>
 +
 
 +
 
 +
===创建业务逻辑层对象===
 +
下面,我们对刚才这个基本的查询事件监听器改造一下,里面加上调用业务逻辑层代码的内容
 +
 
 +
这一步,需要把以前编写的dao包、entity包、service等包复制到当前工程内。
 +
为了后台查询的方便,在窗体类的成员变量位置,创建业务逻辑层对象GoodsService和CartService,'''如果是管理端,光创建一个GoodsService就行了。'''
 +
 
 +
[[文件:java9-35.png]]
  
===在监听器中加入调用业务逻辑层的内容===
+
===为上架按钮添加数据库操作===
====上架按钮====
 
 
类似于客户端的购买按钮,
 
类似于客户端的购买按钮,
  
第230行: 第282行:
 
[[文件:Java9-24.png]]
 
[[文件:Java9-24.png]]
  
====下架按钮====
+
<nowiki>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;
 +
   
 +
}
 +
   
 +
</nowiki>
 +
 
 +
===为下架按钮添加数据库操作===
 
管理员输入ID号,并点击该按钮后
 
管理员输入ID号,并点击该按钮后
  
第238行: 第358行:
  
 
[[文件:Java9-25.png]]
 
[[文件:Java9-25.png]]
====查询按钮====
+
===为查询按钮添加数据库操作===
 
管理员输入ID号,并点击该按钮后
 
管理员输入ID号,并点击该按钮后
  
第245行: 第365行:
 
查询成功后,在下方的表格中显示商品信息。
 
查询成功后,在下方的表格中显示商品信息。
  
====修改按钮====
+
===为修改按钮添加数据库操作===
 
管理员输入ID号,并点击该按钮后
 
管理员输入ID号,并点击该按钮后
  
第252行: 第372行:
 
修改成功后,弹出对话框,告诉管理员修改成功。
 
修改成功后,弹出对话框,告诉管理员修改成功。
  
====查看详情====
+
===为查看详情按钮添加数据库操作====
 
一点击查看详情按钮,在中间的表格中会显示库存中的所有商品信息。
 
一点击查看详情按钮,在中间的表格中会显示库存中的所有商品信息。
 +
 +
<nowiki>    private class QueryallAction implements ActionListener {
 +
    public QueryallAction() {
 +
   
 +
    }
 +
    public void actionPerformed(ActionEvent e) {
 +
    //展示所有商品
 +
ArrayList<Goods> goods=gs.queryGoods();
 +
showBooks(goods);
 +
    }
 +
    }</nowiki>
 +
 +
showBooks的作用就是展示从数据库中查询到的数据:代码如下:
 +
<nowiki>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()
 +
});
 +
}
 +
    }</nowiki>
  
  
 
返回 [[Java程序设计]]
 
返回 [[Java程序设计]]

2018年6月15日 (五) 03:33的最新版本

前情回顾

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

客户端:

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程序设计