Java第五次作业--面向对象高级特性(抽象类和接口)
(一)学习总结
1 . 写出事件处理模型中的几个关键词,并通过具体代码实例说明你对事件处理模型的理解。
事件源
(1)事件源是一个产生(或触发)事件的对象。当这个事件源对象的某些状态以某种方式发生变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册。
事件
(2)事件就是承载事件源状态改变时的信息对象。java.awt.event包和javax.swing.event包中定义了各种事件类,类名以Event结尾。
(3)事件监听器接口
API对于每种事件都定义了对应的接口,接口中定义了处理该事件的方法,这些接口称为事件监听器接口。监听器接口以Listener结尾。如ActionListener接口处理ActionEvent事件。事件源产生一个事件,可以传送给事件监听者处理。事件监听者实际上就是一个类,该类实现了某个事件监听器接口,对接受到的事件进行处理。
//添加监听器
private void addListener() {
//添加按钮监听
addBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
addPet(); //调用添加方法
}
});
//修改按钮监听
updateBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
updatePet(); //调用修改方法
}
});
//删除按钮监听
delBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
delPet(); //调用删除方法
}
});
}
添加监听器:
public AdminDialog(Frame owner,boolean modal){
super(owner,modal);
this.init(); //初始化
this.addComponent(); //添加组件
this.addListener(); //添加监听器
queryPet(); //创建对象时显示数据
}
2 . javax.swing
接口 WindowConstants
EXIT_ON_CLOSE
static final int EXIT_ON_CLOSE退出应用程序默认窗口关闭操作。尝试在支持此操作的 Windows 上执行此项设置(如 JFrame)可能会根据 SecurityManager 抛出一个 SecurityException
3 . Java窗口关闭设置DISPOSE_ON_CLOSE和EXIT_ON_CLOSE 的区别
setDefaultCloseOperation();是用来设定窗口被关闭时(比如点击了右上角的”x”)的行为。参数有:DISPOSE_ON_CLOSE:隐藏当前窗口,并释放窗体占有的其他资源。在窗口被关闭的时候会dispose这个窗口。EXIT_ON_CLOSE:结束窗口所在的应用程序。在窗口被关闭的时候会退出JVM。如果程序没有其他线程在运行,当所有窗口都被dispose后,JVM也会退出。
代码举例:
import javax.swing.JFrame;
import static javax.swing.JFrame.*;//引入JFramed的静态常量
public class Example {
public static void main(String[] args) {
JFrame window1 = new JFrame("窗口A");//创建带标题的窗口
JFrame window2 = new JFrame("窗口B");
window1.setBounds(600, 100, 180, 100);//左,上,宽,高
window2.setBounds(260, 100, 180, 100);
window1.setVisible(true);
window2.setVisible(true);
window1.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
window2.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
运行结果:
单击窗口A的关闭按钮,只有窗口A被关闭。
单击窗口B的关闭按钮,两个窗口都被关闭。
(二)实验总结
实验内容:
基本要求:
使用GUI,编写一个宠物商店管理系统实现对宠物信息的统一管理。假设宠物种类有猫、狗,宠物信息包括:编号、品种、年龄、数量、价格。系统启动进入登录界面,登录成功进入管理界面,否则提出错误信息后退出系统。
在管理界面实现以下功能:
(1)显示所有宠物列表
(2)添加宠物到列表
(3)删除宠物
(4)对宠物信息进行修改
(5)退出
功能扩展:
用户分为管理员和普通用户两种,增加普通用户注册功能,增加普通用户界面。
实现以下功能:
(1)显示所有宠物
(2)能够按照品种对宠物进行查找
(3)购买宠物
(4)显示购买清单
(5)退出
完成实验内容,代码上传到码云,在随笔中分析程序设计思路,用PowerDesigner画出类图结构,并对完成实验内容过程中遇到的问题、解决方案和思考等进行归纳总结,注意代码中必须有必要的注释。
程序设计思路:创建一个宠物类,创见一个数据库,存入数据。设计管理员窗口类,实现窗口布局。设置管理员服务类,在类内实现添加,删除和修改内容。同时进行判断删除和修改是否符合数据库中已包含的内容。创建欢迎窗口类,在欢迎窗口实现后,将“进入系统”的button与管理界面进行承接,完成按钮的功能。
功能扩展思路:在还以界面分别设置三个button(管理员界面,用户注册,用户登录),模拟之前的微博注册实现用户注册,并对其进行用户可否成功注册的判断。点击注册之后,监听器实现用户注册合法的检验,并返回欢迎界面。
类图结构:
问题1:点击相应的button显示相应的界面
原因:在此dialog类内没有创建showWelcomePetStorePlus()的方法
解决方案:
方法创建:
public void showWelcomePetStorePlus() {
this.setVisible(false);
new WelcomePetStorePlus().setVisible(true);
}
方法调用:
private void addListener() {
//注册按钮监听
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
judjeUserItem(); //调用判断方法
showWelcomePetStorePlus();
}
});
}
问题2:由于要在文本框内显示数据,所以数据是String类型,在进行购买后,如何将其进行相应的变化
原因:String类型不能直接进行运算
解决方案:将其String类型的数据转化为int类型,进行计算
问题3:欢迎界面使用FlowLayout布局,图片无法显示
解决方案:使用BorderLayout布局将其NROTH进行对三个按钮的分布
实现代码:
private void addComponent() {
this.add(this.titleLabel, BorderLayout.NORTH);
JPanel btnPanel = new JPanel();
btnPanel.setLayout(null); // 清除JPanel的布局
this.add(btnPanel);
btn1.setBounds(65, 20, 100, 50); // 定义按钮边界位置
btnPanel.add(btn1);
btn2.setBounds(185, 20, 100, 50); // 定义按钮边界位置
btnPanel.add(btn2);
btn3.setBounds(305, 20, 100, 50); // 定义按钮边界位置
btnPanel.add(btn3);
}
问题4:用户登陆时,密码输入后完全显示,调用JPasswordField方法后出现错误
原因:getPassword()方法的到的是一个char型数组。
解决方案:要想将其进行密码的验证,由于用户类的密码是String类,必须将其转换为String类才能继续进行验证。
实现代码:
public void findUserItem(){
String addName = addNameText.getText();
char[] a = addKeyText.getPassword();
String addKey=String.valueOf(a);
boolean Success = UpServies.findUserData(addName,addKey);
if(Success){
showUserDialog();
}else{
JOptionPane.showMessageDialog(this, "用户名或密码错误");
}
}
欢迎界面:
管理员界面:
用户登录界面:
用户注册界面:
购买界面:
(三)代码托管
- 码云commit历史截图