Java第七次作业
一、学习总结
1.写出事件处理模型中的几个关键词,并通过具体代码实例说明你对事件处理模型的理解。
(1)事件处理的步骤:
①定义和添加组件(事件源)
- 初始化:
- private JLabel Label = new JLabel("");按钮的初始化。
- private JTextField addText = new JTextField(x);文本框(x为长度)的初始化。
- private JLabel titleLabel=new JLabel(new ImageIcon("pet.jpg"));图片的初始化
- private JTextArea text=new JTextArea();文本文档的初始化
- 设置和添加组件:
- label.setBounds(a,b,x,y);this.add(label);设置按钮位置、大小并加入窗口(a,b为按钮位置;x,y为按钮大小)。
- addText.setBounds(a,b,x,y);this.add(addText);设置文本框按钮位置、大小。
- this.setIconImage(kit.createImage(titleIconPath));设置添加图片
- text.setBounds(50, 300, 300, 200); this.add(text);设置文本文档大小并添加
②添加监听器
- 在内部类中调用方法来设置对应按钮对应的方法。如下:
Btn.addActionListener(new ActionListener(){//Bth是初始化的按钮
public void actionPerformed(ActionEvent e){
A(); //调用A方法
}
});
③写按钮执行的方法
- 及在此类中写对应执行方法。如上调用的A()方法。
(2)其他关键字
- this.setVisible(false);关闭当前窗口。
- new Frame().setVisible(true);打开Frame窗口。
- this.setTitle(str);设置窗口标题。
- this.setSize(width,height);设置窗口大小。
- text.append(str);在文本文档中输出str
(3)简单的理解事件处理机制也就是:事件源将事件传给事件监听器的处理方式。(事件源是事件的对象)
- 实例:
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Test extends JDialog{
//定义界面使用的组件
private JLabel Label = new JLabel("测试");
private JTextField Text = new JTextField(6);
private JButton Btn = new JButton("测试按钮");
//构造方法
public Test(){
this(null,true);
}
public Test(Frame owner,boolean modal){
super(owner,modal);
this.init(); //初始化
this.addComponent(); //添加组件
this.addListener(); //添加监听器
}
//初始化操作
private void init() {
this.setTitle("测试窗口标题");
this.setSize(500,500);
this.setResizable(false);
}
//添加组件
private void addComponent() {
this.setLayout(null);
Label.setBounds(50, 50, 70, 25);
this.add(Label);
Text.setBounds(50,150,70,25);
this.add(Text);
Btn.setBounds(50, 200, 100, 50);
this.add(Btn);
}
//添加监听器
private void addListener() {
Btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
test(); //弹出测试成功窗口方法
}
});
}
public void test(){
JOptionPane.showMessageDialog(null, "测试成功!");
}
public static void main(String[] args){ //测试
new Test().setVisible(true);
}
}
2.其他需要总结的内容。
- 在实体类中:
- 类中的属性不允许使用基本数据类型,必须使用基本数据类型的包装类(基本数据类型的默认值是0,包装类的默认值是null)。
- 类中的属性必须使用private封装,封装后的属性必须提供setter、getter方法
- 类中可以定义有多个构造方法,但必须保留一个无参构造方法- String类型转化为Double类型的转化: Double a=Double.parseDouble(str);
二、实验总结:
1.使用GUI,编写一个宠物商店管理系统实现对宠物信息的统一管理。假设宠物种类有猫、狗,宠物信息包括:编号、品种、年龄、数量、价格。系统启动进入登录界面,登录成功进入管理界面,否则提出错误信息后退出系统。
在管理界面实现以下功能:
(1)显示所有宠物列表
(2)添加宠物到列表
(3)删除宠物
(4)对宠物信息进行修改
(5)退出
功能扩展:
用户分为管理员和普通用户两种,增加普通用户注册功能,增加普通用户界面。
实现以下功能:
(1)显示所有宠物
(2)能够按照品种对宠物进行查找
(3)购买宠物
(4)显示购买清单
(5)退出
完成实验内容,代码上传到码云,在随笔中分析程序设计思路,用PowerDesigner画出类图结构,并对完成实验内容过程中遇到的问题、解决方案和思考等进行归纳总结,注意代码中必须有必要的注释。
- 程序设计思路:
- 设计实体类、数据Data类、实现基础方法Dao类、实现具体方法的服务类、设置窗口的Tools类、视图类、和主方法测试类。
- 实体类:有宠物类、用户信息类、购买宠物类三个实体类;分别存放各自的私有成员和getter、setter、toString方法
- Data类:分别有宠物、用户信息、购买宠物对应的三个Data类。在Data类中,设置一个三个实体类对应的静态集合,来获取数据并用静态块将数据初始化。
- Dao类:分别有管理、用户注册的两个实现基本方法Dao类;管理Dao类中有实现宠物的添加、查询、删除、修改和购买宠物的添加、显示的基础方法;用户注册Dao类中有实现添加、查询用户的基础方法。
- 服务类:分别有管理员、用户注册、用户购买对应的三个服务类;三个类中分别实现各自需要的具体方法。
- 工具类:实现了设置窗口居中和设置窗口图标的方法。
- 视图类:分别有宠物店首页窗口、管理员窗口、用户注册窗口、用户登录窗口、用户购买窗口。①将宠物店首页窗口放进四个按钮并监听,按钮分别为:管理系统、用户注册、用户登录、退出系统。按下按钮分别打开对应的窗口(退出系统按钮除外)。②管理员管理界面有添加宠物、删除宠物、修改宠物、返回主页按钮选项。③用户注册界面检验注册信息,注册成功后自动跳回主页。④用户登录页面登录成功有提示消息并且进入用户购买页面。
- 问题1:在用户注册时用户不输入用户名和密码也能注册成功,
- 原因:没有考虑用户名和密码都为空的情况
- 解决方案:给用户名和密码为空时一个判断提示
else if(addUserName.equals("")){
JOptionPane.showMessageDialog(null, "用户名不能为空!");
addUserNameText.setText("");
addUserNameText.requestFocus();
}
else if(addPassword.equals("")){
JOptionPane.showMessageDialog(null, "密码不能为空!");
addPasswordText.setText("");
addPasswordText.requestFocus();
}
- 问题2:购买宠物时,需删除一只宠物列表中相对应的宠物,在执行删除后修改操作时出错。
- 原因:因为删除后,仍用了查找此位置的信息进行修改,此位置信息早已被删除。
- 解决方案:删除之前将信息先存放起来再进行修改。
- 问题3:在购买完一类宠物后,仍能进行购买,宠物列表中的数量变成负值。
- 原因:因为没有判断宠物数量买完的情况
- 解决方案:添加此情况的判断返回false。部分代码如下:
public boolean buyPet(String no){
ArrayList<Pet> data=queryPet();
//找出要购买的编号存放购买信息,对应删除宠物列表
for(int i=0;i<data.size();i++){
if(data.get(i).getNo().equals(no)){
String variety=data.get(i).getVariety();
Double price=data.get(i).getPrice();
Integer age=data.get(i).getAge();
Integer sum=data.get(i).getSum();
if(data.get(i).getSum()==0){
adminDao.delPet(no);
return false;
}else{
adminDao.delPet(no);
Pet thisPet=new Pet(no,variety,age,sum-1,price);
UserBuy thisBuy=new UserBuy(variety,price);
adminDao.addPet(thisPet);
adminDao.addUserBuy(thisBuy);
return true;
}
}
}
return false;
}
- 宠物商店首页窗口:
- 管理员管理窗口:
- 用户注册窗口:
- 用户登录窗口:
- 用户购买窗口:
三、代码托管(务必链接到你的项目)
- 码云commit历史截图
上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。
- 代码托管
- 截图