Java第七次作业--图形用户界面


(一)学习总结


1.写出事件处理模型中的几个关键词,并通过具体代码实例说明你对事件处理模型的理解。

addActionListener接口用于监听器,例如以下添加监听器的函数:

	private void addListener(){
		btn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				showAdminDialog();
			}
		});
	}
private void showAdminDialog(){
	this.setVisible(false);
	new AdminDialog().setVisible(true);
}

showAdminDialog函数表示显示管理者的窗口。其他的操作基本和这个类似。

1.1 WindowListener监听器,用于windows系统下的处理窗体时间的监听器。

1.2 actionPerformed关键字是用于处理按钮的动作时间,例如注册的按钮,当点击下去就出现一个Frame,和上述代码基本相似。

1.3键盘事件及监听事件,使用KeyListener接口使用。

1.4鼠标事件及监听器,常用于鼠标按下松开,使用MouseListener接口

1.5鼠标拖拽事件及监听器,使用MouseMotionListener

1.6其他的事件例如单选按钮JRadioButton事件处理,JCheckBox事件处理,JList事件处理等,都需要各自的接口实现,其基本方法跟 addActionListener类似。

实验中使用的都是 addActionListener的事件处理。


2.其他需要总结的内容。

实验总结进行总结。


(二)实验总结

1
实验内容:
基本要求:
使用GUI,编写一个宠物商店管理系统实现对宠物信息的统一管理。假设宠物种类有猫、狗,宠物信息包括:编号、品种、年龄、数量、价格。系统启动进入登录界面,登录成功进入管理界面,否则提出错误信息后退出系统。
在管理界面实现以下功能:
(1)显示所有宠物列表
(2)添加宠物到列表
(3)删除宠物
(4)对宠物信息进行修改
(5)退出

程序设计思路:1,创建一个动物类;
2,创建一个库,用来存宠物的数据,因为要存数据,所有要使用static关键字进行封装;
3,创建一个Dao文件,用于对数据的各种操作,增删改查等操作;
4,AdminServiceDao中的数据进行更新;
5,设置欢迎界面,Welcome对面板进行设计;
6,AdminDialog设计各种功能,包括显示所有宠物列表,添加,修改等。



需要注意的问题:1,在写Welcome类的时候需要继承Object的JFrame,否则无法使用setVisible进行显示。

2,将图形设置好之后,设置按钮同时并为按钮设置监听器,然后添加相应的方法来响应按钮的事件操作。以添加动物来举例(部分代码):

private JButton addBtn=new JButton("添加");
public void addComponent(){
		addIdText.setBounds(50, 280, 80, 25);
		addKindText.setBounds(150, 280, 80, 25);
		addAgeText.setBounds(250,280,80,25);
		addNumberText.setBounds(350,280,80,25);
		addPriceText.setBounds(450,280,80,25);
		this.add(addIdText);
		this.add(addKindText);
		this.add(addAgeText);
		this.add(addNumberText);
		this.add(addPriceText);
}
public void addListener(){
		//“添加”按钮的监听器
		addBtn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				addItem();  //调用添加方法
			}
		});
public void addItem(){
	String addId=addIdText.getText();
	String addKind=addKindText.getText();
	String addAge=addAgeText.getText();
	String addNumber=addNumberText.getText();
	String addPrice=addPriceText.getText();
	boolean addSuccess = adminService.addAnimalItem(addId, addKind, addAge, addNumber,addPrice);
	if(addSuccess){
		queryItem();				//添加后刷新表格
		addIdText.setText("");
		addKindText.setText("");
		addAgeText.setText("");
		addNumberText.setText("");
		addPriceText.setText("");
	}else{
		JOptionPane.showMessageDialog(this, "编号重复,请查看编号后进行添加");		//没有添加成功弹窗错误提示
	}
}

其中需要调用adminService的addAnimalItem方法来进行添加

public boolean addAnimalItem(String id,String kind,String age,String number,String price){
		ArrayList<AnimalItem> data = queryItem();
		Iterator<AnimalItem> iterator = data.iterator();
		while(iterator.hasNext()){
			AnimalItem animal = iterator.next();
			//如果存在重复编号则添加不成功
			if(animal.getId().equals(id)){
				return false;
			}			
		}
		AnimalItem thisAnimal = new AnimalItem(id,kind,Double.parseDouble(age),number,Double.parseDouble(price));
		adminDao.addFruitItem(thisAnimal);  //添加成功
		return true;
	}

其他的按钮也是相似,只不过是Service中的方法不一样。

3,方法必须在构造方法中进行显示调用。


2
功能扩展:
用户分为管理员和普通用户两种,增加普通用户注册功能,增加普通用户界面。
实现以下功能:
(1)显示所有宠物
(2)能够按照品种对宠物进行查找
(3)购买宠物
(4)显示购买清单
(5)退出

设计思路:基本上跟实验一没什么区别,区别在与新增了用户类,用户界面,和Service中的用户界面需要显示的方法。
新增用户注册和登录,默认账户和密码在新建一个DataBase中存储。

package userEnroll;
import java.util.ArrayList;
public class DataBase {
	public static ArrayList<User> data = new ArrayList<User>();
	static{
		data.add(new User("chen","123"));		
	}
}

重写Dao文件,和Service,基本和实验一一样,还不过访问的数据是用户类的数据。


写注册的面板,设计好之后添加监听器,当点击确定后,事件响应并提示注册成功,同时跳转至登录界面。

登录面板,基本跟注册一样,只不过在点击登录之后进行判断是否和存的数据一样,如果不一样则提示没有进行注册,如果登录成功,则进入用户界面

用户界面的设计,用按钮来显示各种功能,然后设置监视器来进行事件响应。


对各个功能进行的阐述:
1,显示所有的宠物,将集合中存的所有的数据进行输出。访问adminSerice进行访问数据,然后进行设置成为字符串,如下:

public void queryItem(){
		//定义表头
		String []thead={"宠物编号","宠物种类","宠物年龄","宠物数量","宠物单价(/RMB)"};
		//调用adminService的查询服务
		ArrayList<AnimalItem> dataList = adminService.queryItem();
		//将查询到的集合转为数组,方便为JTable赋值
		String[][] tbody = listToArray(dataList);
		//将查询到的结果为table赋值
		TableModel dataModel = new DefaultTableModel(tbody,thead);
		table.setModel(dataModel);	
	}
	private String[][] listToArray(ArrayList<AnimalItem> list){
		String [][]tbody=new String [list.size()][5];
		for(int i=0;i<tbody.length;i++){
			AnimalItem animal=list.get(i);
			tbody[i][0]=animal.getId();
			tbody[i][1]=animal.getKind();
			tbody[i][2]=animal.getAge()+"";
			tbody[i][3]=animal.getNumber();
			tbody[i][4]=animal.getPrice()+"";
		}
		return tbody;
	}

2,按照种类进行查找宠物:所有的功能都在adminSerice中进行编写,对static修饰的data集进行迭代,然后判断是否相同,若相同则返回给now新增的List集。

	//按照宠物的种类进行查找的服务 
	public ArrayList<AnimalItem> toChaZhao(String ikind){
		ArrayList<AnimalItem> data=adminDao.queryAllData();
		ArrayList<AnimalItem> now=null;				//定义一个List集来接受传进来相同的动物类
		now=new ArrayList<AnimalItem>();			//实例化否则出现nullPoint指针为null
		Iterator<AnimalItem> itrator=data.iterator();		//对数据进行迭代
		while(itrator.hasNext()){
			AnimalItem animal=itrator.next();
			if(animal.getKind().equals(ikind)){				//判断是否相等
				now.add(animal);		//将查找出来的给了now,然后返回即可 
			}
		}
		return now;
	}

3,购买宠物:基本和查找相似,只不过将查找出来的数存进去,然后进行输出。具体操作:先在DataBase中定义static的集buy进行存储,然后在显示列表中进行使用即可。

//购买并列单
public ArrayList<AnimalItem> toBuy(String id){
	ArrayList<AnimalItem> data=adminDao.queryAllData();
	/*ArrayList<AnimalItem> ibuy=null;
	ibuy=new ArrayList<AnimalItem>();*/
	
	Iterator<AnimalItem> itrator=data.iterator();		//对数据进行迭代
	while(itrator.hasNext()){
		AnimalItem animal=itrator.next();
		if(animal.getId().equals(id)){
			DataBase.buy.add(animal);
			return DataBase.buy;
		}
	}
	return null;
}

4,显示购买的宠物:将购买后的宠物存在buy中,然后在adminDao中编写all()函数,用于返回购买的宠物所有的信息,然后在AdminService中编写列表函数

	public ArrayList<AnimalItem> all(){
		return DataBase.buy;
	}

AdminService中的函数

	//fanhui buy shuju 
	public ArrayList<AnimalItem> toList(){
		ArrayList<AnimalItem> data=adminDao.all();
		return data;
	}

5:退出:退出的方法有多种,其中最简单的一种是使用setVisible(false)方法进行退出。但是这样的方式是在电脑上程序上仍然启动着,占用内存。
代码如下:
设置exit的大小以显示exit按钮

	exit.setBounds(400,300,170,25);
	this.add(exit);

添加监听器:

public void addListener(){
		exit.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				toExit();
			}
		});
	}
public void toExit(){
		this.setVisible(false);
	}

总结:最大的问题出在购买宠物并列单:因为是采用两个面板,也就是两个类,所以按照输进去的文本信息来输出该宠物必须定义static修饰,但是一直提示存在空指针。原因:调用方法的时候没有将数据存进去集合中,设计的思路有问题。
正确的思路为:购买之后将数据存进集合中,然后在adminDao中编写得到购买的集合buy的全部元素,然后在adminService中进行调用即可。也就是上述4的过程。

public static  JTextField buyText=new JTextField(6);

public ArrayList<AnimalItem> all(){
		return DataBase.buy;
	}

AdminService中的函数

	//fanhui buy shuju 
	public ArrayList<AnimalItem> toList(){
		ArrayList<AnimalItem> data=adminDao.all();
		return data;
	}


有待解决的问题:在输入购买的时候,如果输入已经在清单列表中的元素的时候没有仍能添加。可以更换集合为不可重复添加的集合Set即在DataBase层次将ArrayList更改为Set集。


(三)代码托管

点击代码托管即可查看代码



 posted on 2017-05-11 18:52  ben跑的换行符  阅读(778)  评论(0编辑  收藏  举报