(一)学习总结
1.写出事件处理模型中的几个关键词,并通过具体代码实例说明你对事件处理模型的理解。
- 面向对象的软件系统是"事件驱动"的
事件
对一个组建的状态发生了变化,基本上任意一个组件都有对应的事件,如果想对这些事件进行处理,就需要不断地对时间监听。- 事件类有个getSource()方法去的时间的源对象
• 事件对象(Event object):事件发生时所携带的信息
• 事件源(Event Source):能够产生事件的GUI组件对象,如按钮、文本框等。
• 事件监听器(Event Listener):当事件发生时,事件监听器对象会得到通知,它所事先准备好的事件处理方被调用。这些事件处理方法的参数中,将引用到相应的事件对象。
三者之间的相互协作关系称为“事件委托模型”
事件适配器:实现某一特定事件接口的所有方法,只不过方法为空。
例:
frame.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
if (user agrees)
System.exit(0);
}
});
四种编写事件处理方法:
1 . 顶级类:创建一个独立的类,实现特定的事件,监听接口,很少用。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ButtonDemo extends JFrame
{
JPanel jp = new JPanel();
JButton jb = new JButton("Create Button");
public ButtonDemo()
{
this.add(jp);
jb.addActionListener(new MyListener(this));
jp.add(jb);
this.setTitle("Demo");
this.setBounds(300,100,400,300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new ButtonDemo();
}
}
class MyListener implements ActionListener //实现监听接口的自定义类
{
private int count = 0;
private ButtonDemo d;
MyListener(ButtonDemo d)
{
this.d = d;
}
public void actionPerformed(ActionEvent e)
{
d.jp.add(new JButton("Button: " + (count++)));
d.setVisible(true);
}
}
2 . 让事件源组件自身实现特定的事件监听接口,不推荐使用。
3 . 使用内部类,推荐(多个组件需要复用)。
4 . 使用匿名类,推荐(仅特定组件需要使用)。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ButtonDemo extends JFrame
{
JPanel jp = new JPanel();
JButton jb = new JButton("JButton");
private int count = 0;
public ButtonDemo()
{
this.add(jp);
jb.addActionListener(new ActionListener(){ //匿名内部类
public void actionPerformed(ActionEvent e)
{
jp.add(new JButton("The " + (count++)));
ButtonDemo.this.setVisible(true);
}
});
jp.add(jb);
this.setTitle("Demo");
this.setBounds(300,100,400,300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new ButtonDemo();
}
}
2.其他需要总结的内容。
JTable用法-实例 - pzy4447 - 博客园
http://www.cnblogs.com/pzy4447/p/5229289.html
Swing - 标签 - pzy4447 - 博客园
http://www.cnblogs.com/pzy4447/tag/Swing/
JOptionPane的提示框的一些用法
http://847353020-qq-com.iteye.com/blog/954532
ArrayList取出每个对象的方法
for(int i=0;i<arrayL.size();i++){
System.out.println(arrayL.get(i).toString());
}
(二)实验总结
实验内容:
基本要求:
使用GUI,编写一个宠物商店管理系统实现对宠物信息的统一管理。假设宠物种类有猫、狗,宠物信息包括:编号、品种、年龄、数量、价格。系统启动进入登录界面,登录成功进入管理界面,否则提出错误信息后退出系统。
在管理界面实现以下功能:
(1)显示所有宠物列表
(2)添加宠物到列表
(3)删除宠物
(4)对宠物信息进行修改
(5)退出
功能扩展:
用户分为管理员和普通用户两种,增加普通用户注册功能,增加普通用户界面。
实现以下功能:
(1)显示所有宠物
(2)能够按照品种对宠物进行查找
(3)购买宠物
(4)显示购买清单
(5)退出
完成实验内容,代码上传到码云,在随笔中分析程序设计思路,用PowerDesigner画出类图结构,并对完成实验内容过程中遇到的问题、解决方案和思考等进行归纳总结,注意代码中必须有必要的注释。
格式如下:
程序设计思路:
创建一个主方法类,宠物包,用户包,数据包,图片资源包,工具类,视图包(用户界面,管理员界面,注册界面,登录界面)
类图结构:
问题1:图片资源使用问题
解决方案:在res包中存放图片,创建图片对象方法如下
private ImageIcon img = new ImageIcon("src/res/jiemian.jpg");
问题2:内存占用过大问题
解决方案:JFrame创建的面板关闭按钮未真正实现
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
注:JDialog不适用
问题3:设置背景图片问题
解决方案:
private ImageIcon img = new ImageIcon("src/res/jiemian.jpg");
private JLabel lab = new JLabel(img);
this.add(this.lab, BorderLayout.NORTH);
lab.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
// 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
JPanel imagePanel = (JPanel) this.getContentPane();
imagePanel.setOpaque(false);
// 内容窗格默认的布局管理器为BorderLayout
imagePanel.setLayout(null);
// 把背景图片添加到分层窗格的最底层作为背景
this.getLayeredPane().add(lab, new Integer(Integer.MIN_VALUE));
问题4:ArrayList转化二维数组问题
private void visibel() {//显示table方法
String[] title = {"编号","品种","年龄","数量","价格"};
ArrayList<Pet> pet = useData.getData();
String[][] tbody = listToArray(pet);
TableModel dataModel = new DefaultTableModel(tbody,title);
table.setModel(dataModel);
String[][] buyBody =listToArray(buyP);
TableModel buyDataModel = new DefaultTableModel(buyBody,title);//二维数组,标题数组
buytable.setModel(buyDataModel);//将tablemodel放入table
}
private String[][] listToArray(ArrayList<Pet> list) {//转化方法
String[][] tbody = new String[list.size()][5];
for(int i = 0; i < list.size();i++){
Pet p = list.get(i);
tbody[i][0] = p.getNo();
tbody[i][1] = p.getType();
tbody[i][2] = p.getAge();
tbody[i][3] = p.getNumber();
tbody[i][4] = p.getMoney();
}
return tbody;
}
问题5:ArrayList集合不能多类同时使用,和初始化集合问题
解决方案:
public static ArrayList<Pet> data=new ArrayList<Pet>();
static{
data.add(new Pet("1","腊肠","5","20","100"));
data.add(new Pet("2","泰迪","1","23","110"));
};