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,AdminService
对Dao
中的数据进行更新;
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
集。
(三)代码托管
点击代码托管即可查看代码