事件处理
辽宁经济职业技术学院信息系
硕士、副教授 陈英
事件驱动程序
操作系统
Java库类
事件
方法 方法 方法 方法用户程序
鼠标移
动
敲击键盘
什么是事件?
事件-描述发生了什么的对象, 即用户用于交
互而产生的键盘或鼠标动作 。
事件源-事件的产生器 ( 如按钮 ) 。
事件处理器-接收事件, 解释事件并处理用户
交互的方法 ( 响应用户的动作称为处理事件 )
如果用户在用户界面层执行了一个动作 (鼠标点
击和按键 ),这将导致一个事件的发生。事件是
描述发生了什么的对象。存在各种不同类型的
事件类用来描述各种类型的用户交互。
什么是事件源?
事件源是一个事件的产生者 。 例如, 在 Button组件
上点击鼠标会产生以这个 Button 为源的一个
ActionEvent,这个 ActionEvent实例是一个对象,
它包含关于刚才所发生的那个事件的信息的对象 。
这些信息包括:
1) getActionCommand-返回与动作相关联的命令名称 。
2) GetModifiers-返回在执行动作时持有的修饰符。
事件源拥有自己的方法,允许我们向其注册事件
监听器。
当事件源产生了一个事件后,事件源就会给为那
个 事件进行了注册的所有监听器对象发送通知。
事件监听器
要创建一个事件监听器的类,这个类必
须实现监听器接口。所有事件监听器接
口都扩充 java.util.EventObject接口。但
是这个接口没有声明任何方法,而只是
用来标志事件监听器接口,并允许
EventListener变量存储任何事件监听器
对象的引用。
AWT中的事件处理工作机制
一个监听器对象是一个实现了专门的监
听器接口的类的实例。
一个事件源是一个能够注册监听器并且
为它们发送事件对象的对象。
当事件发生时,事件源会把事件对象发
送给注册的全部监听器。
监听器对象会使用事件对象中的信息决
定对事件的反应。
事件处理过程
ActionEvent
对象
public void makeButton(String name,final Color
backgroundColor)
{ JButton button = new JButton(name);
add(button);
button.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{ setBackground(backgroundColor);
repaint();
} });
}
单
击
按
钮
OK
生
成
传递给
java.util.EventObject
在 Java这种面向对象语言中,关于事件的
信息被封装在一个事件对象中。
所有的对象都从 java.util.EventObject派生
而来。
每个事件类型都有一个子类,如
ActionEvent和 WindowsEvent.
不同的事件源能够产生不同种类的事件。
例如一个按钮能够发送 ActionEvent对象,
而一个窗口能够发送 WindowsEvent对象。
处理事件的核心是重写处理事件的方法
注册事件监听器
在事件源对象中注册监听器对象的方法如下:
eventSourceObject.addEventListener(eventListenterObject);
例如,ActionListener listener = …… ;
JButton button = new JButton(“OK”);
button,addEventListener(listener);
现在只要按钮中产生一个“动作事件(按钮被按下)”,
listener对象就会得到通知。
监听器对象所属的类必需要实现合适的接口。而实现该接口
意味着要提供接口中方法的实现。
事件通知 事件源、事件监听器和事件对象
的协作关系
addActionListener
MyPanel
JButton
MyListener
actionPerformed
new
new
javax.swing.JButton
JButton(String label)
构造一个按钮并将文本 label显示在该按钮上。
JButton(Icon icon)
构造一个按钮并将图标 icon显示在该按钮上。
JButton(String label, Icon icon)
构造一个按钮并将 label和 icon显示在该按钮上。
java.awt.Container
? Component add(Component c)
? 把组件 c添加到该容器中。
内部类
内部类,有时叫做嵌套类,被附加到
JDK1.1及更高版本中。
内部类允许一个类定义被放到另一个类
定义里。
内部类是一个有用的特征,因为它们允
许将逻辑上同属性的类组合到一起,并
在另一个类中控制一个类的可视性 。
内部类
一个内部类是定义在另一个类内部的类。
构建内部类的原因:
1) 一个内部类的对象能够访问创建它的对象的
实现 ——包括私有数据。
2) 对于同一包中的其他类来说,内部类能够隐
藏起来。
3) 匿名内部类可以很方便地定义回调。
4) 使用内部类可以非常方便地编写事件驱动程
序。
匿名内部类
如果你只需要一个内部类的一个对象,那么你就
不必给该类一个名字。这时我们称该类为匿名内
部类。
用于构造对象的任何参数都要放在跟在超类名字
后面的括号中,一般情况下,使用语句如下:
new SuperType(construction parameters)
{
inner clss methods and data
}
在这里,SuperType 可以是一个接口,例如
ActionListener,那么内部类实现该接口;
匿名内部类
匿名内部类不能有构造器,这是因为构造器
名必须同类名相同,而类根本没有名字。
构造器参数被给到超类的构造器中。
特别是,如果一个内部类实现一个接口,那
么该内部类不能有任何参数。不仅如此,你
必须按照以下语法提供一组括号来定义:
new InterFaceType() { methods and data }
如果构造参数列表的闭括号后面跟有一个开
括号,那么这表明正在定义一个匿名内部类。
使用匿名内部类简化代码
在实例 ButtonTest实例中,每个按钮需
要做以下几个同样的处理:
1) 使用标签字符串构造按扭。
2) 把按钮添加到面板。
3) 用适当的颜色构造一个动作监听器。
4) 添加该动作监听器。
我们可以使用一个 makeButton方法来
简化这些任务。
使用匿名内部类简化代码
void makeButton(String name,Color backgroundColor)
{
JButton button = new JButton(name);
add(button);
ColorAction action = new ColorAction(backgroundColor);
button.addActionListener(action);
}
public ButtonPanel()
{
makeButton(“yellow”,Color.yellow);
makeButton(“blue”,Color.blue);
makeButton(“red”,Color.red);
}
使用匿名内部类简化代码
注意到 ColorAction类其实只需要一次,因此可以把它设成匿名类:
void makeButton(String name,final Color backgroundColor)
{
JBbutton button = new JButton(name);
add(button);
button.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent event)
{ setBackground(backgroundColor);
repaint();
}
});
}
捕获窗口事件
当程序用户试图关闭一个框架窗口时,
Jframe对象是一个 WindowsEvent(窗口事件 )
的事件源。
如果需要捕获该事件,必须有一个合适的监
听器对象并把它添加到窗口监听器列表中。
WindowListener listener = …… ;
Frame.addWindowListener(listener);
窗口监听器对象必须是一个实现了
WindowListener接口的类对象。
WindowListener接口
public interface WindowListener
{
void windowOpened(WindowEvent e);
void windowClosing(WindowEvent e);
void windowClosed(WindowEvent e);
void windowIconified(WindowEvent e);
void windowDeiconified(WindowEvent e);
void windowActivated(WindowEvent e);
void windowDeactivated(WindowEvent e);
}
WindowListener接口
在 Java中,类实现一个接口意味着它要实现该接口中的
所有方法。
如果只需要 windowClosing方法,应进行如下编程:
class Terminator implements WindowListener
{ public void windowClosing(WindowEvent e)
{ System.exit(0); }
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
publicvoid windowDeactivated(WindowEvent e) {} }
其它方法
留空
适配器类
写上六个空方法是非常烦琐的。为了简化任
务,每个具有不止一个方法的 AWT监听器接
口都有一个实现了它的所有方法,但是却不
做任何工作的适配器。
例如,WindowAdapter类有七个空方法,这
意味着适配器类动态满足了 java中的实现相
关监听器类的技术要求。
可以通过扩展适配器类来实现需要的动作而
无需实现接口。
使用适配器类
class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
frame.addWindowListener(new Terminator());
继承六个空方
法,重载
windowClosin
g方法
设置窗口监听器
frame.addWindowListener( new
WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}); 1,定义一个没有名字的类来扩展 WindowAdpater类。
2,把 windowClosing方法添加到那个匿名信类中。
3,从 WindowAdapter继承剩下的六个方法。
4,创建该类的一个对象。同样这个对象也没有名字。
5,把创建的对象传递到 addWindowListener方法
事件的分类
Event
HandleEvent()
MouseUp()
MouseDown()
MouseDrag()
MouseMove()
MouseEnter()
MouseExit()
keyDown()
KeyUp()
action()
Event类的数据域?
Event
Object arg
int clickCountint id int key
int modifiers Object target
int x int y long when
辽宁经济职业技术学院信息系
硕士、副教授 陈英
事件驱动程序
操作系统
Java库类
事件
方法 方法 方法 方法用户程序
鼠标移
动
敲击键盘
什么是事件?
事件-描述发生了什么的对象, 即用户用于交
互而产生的键盘或鼠标动作 。
事件源-事件的产生器 ( 如按钮 ) 。
事件处理器-接收事件, 解释事件并处理用户
交互的方法 ( 响应用户的动作称为处理事件 )
如果用户在用户界面层执行了一个动作 (鼠标点
击和按键 ),这将导致一个事件的发生。事件是
描述发生了什么的对象。存在各种不同类型的
事件类用来描述各种类型的用户交互。
什么是事件源?
事件源是一个事件的产生者 。 例如, 在 Button组件
上点击鼠标会产生以这个 Button 为源的一个
ActionEvent,这个 ActionEvent实例是一个对象,
它包含关于刚才所发生的那个事件的信息的对象 。
这些信息包括:
1) getActionCommand-返回与动作相关联的命令名称 。
2) GetModifiers-返回在执行动作时持有的修饰符。
事件源拥有自己的方法,允许我们向其注册事件
监听器。
当事件源产生了一个事件后,事件源就会给为那
个 事件进行了注册的所有监听器对象发送通知。
事件监听器
要创建一个事件监听器的类,这个类必
须实现监听器接口。所有事件监听器接
口都扩充 java.util.EventObject接口。但
是这个接口没有声明任何方法,而只是
用来标志事件监听器接口,并允许
EventListener变量存储任何事件监听器
对象的引用。
AWT中的事件处理工作机制
一个监听器对象是一个实现了专门的监
听器接口的类的实例。
一个事件源是一个能够注册监听器并且
为它们发送事件对象的对象。
当事件发生时,事件源会把事件对象发
送给注册的全部监听器。
监听器对象会使用事件对象中的信息决
定对事件的反应。
事件处理过程
ActionEvent
对象
public void makeButton(String name,final Color
backgroundColor)
{ JButton button = new JButton(name);
add(button);
button.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{ setBackground(backgroundColor);
repaint();
} });
}
单
击
按
钮
OK
生
成
传递给
java.util.EventObject
在 Java这种面向对象语言中,关于事件的
信息被封装在一个事件对象中。
所有的对象都从 java.util.EventObject派生
而来。
每个事件类型都有一个子类,如
ActionEvent和 WindowsEvent.
不同的事件源能够产生不同种类的事件。
例如一个按钮能够发送 ActionEvent对象,
而一个窗口能够发送 WindowsEvent对象。
处理事件的核心是重写处理事件的方法
注册事件监听器
在事件源对象中注册监听器对象的方法如下:
eventSourceObject.addEventListener(eventListenterObject);
例如,ActionListener listener = …… ;
JButton button = new JButton(“OK”);
button,addEventListener(listener);
现在只要按钮中产生一个“动作事件(按钮被按下)”,
listener对象就会得到通知。
监听器对象所属的类必需要实现合适的接口。而实现该接口
意味着要提供接口中方法的实现。
事件通知 事件源、事件监听器和事件对象
的协作关系
addActionListener
MyPanel
JButton
MyListener
actionPerformed
new
new
javax.swing.JButton
JButton(String label)
构造一个按钮并将文本 label显示在该按钮上。
JButton(Icon icon)
构造一个按钮并将图标 icon显示在该按钮上。
JButton(String label, Icon icon)
构造一个按钮并将 label和 icon显示在该按钮上。
java.awt.Container
? Component add(Component c)
? 把组件 c添加到该容器中。
内部类
内部类,有时叫做嵌套类,被附加到
JDK1.1及更高版本中。
内部类允许一个类定义被放到另一个类
定义里。
内部类是一个有用的特征,因为它们允
许将逻辑上同属性的类组合到一起,并
在另一个类中控制一个类的可视性 。
内部类
一个内部类是定义在另一个类内部的类。
构建内部类的原因:
1) 一个内部类的对象能够访问创建它的对象的
实现 ——包括私有数据。
2) 对于同一包中的其他类来说,内部类能够隐
藏起来。
3) 匿名内部类可以很方便地定义回调。
4) 使用内部类可以非常方便地编写事件驱动程
序。
匿名内部类
如果你只需要一个内部类的一个对象,那么你就
不必给该类一个名字。这时我们称该类为匿名内
部类。
用于构造对象的任何参数都要放在跟在超类名字
后面的括号中,一般情况下,使用语句如下:
new SuperType(construction parameters)
{
inner clss methods and data
}
在这里,SuperType 可以是一个接口,例如
ActionListener,那么内部类实现该接口;
匿名内部类
匿名内部类不能有构造器,这是因为构造器
名必须同类名相同,而类根本没有名字。
构造器参数被给到超类的构造器中。
特别是,如果一个内部类实现一个接口,那
么该内部类不能有任何参数。不仅如此,你
必须按照以下语法提供一组括号来定义:
new InterFaceType() { methods and data }
如果构造参数列表的闭括号后面跟有一个开
括号,那么这表明正在定义一个匿名内部类。
使用匿名内部类简化代码
在实例 ButtonTest实例中,每个按钮需
要做以下几个同样的处理:
1) 使用标签字符串构造按扭。
2) 把按钮添加到面板。
3) 用适当的颜色构造一个动作监听器。
4) 添加该动作监听器。
我们可以使用一个 makeButton方法来
简化这些任务。
使用匿名内部类简化代码
void makeButton(String name,Color backgroundColor)
{
JButton button = new JButton(name);
add(button);
ColorAction action = new ColorAction(backgroundColor);
button.addActionListener(action);
}
public ButtonPanel()
{
makeButton(“yellow”,Color.yellow);
makeButton(“blue”,Color.blue);
makeButton(“red”,Color.red);
}
使用匿名内部类简化代码
注意到 ColorAction类其实只需要一次,因此可以把它设成匿名类:
void makeButton(String name,final Color backgroundColor)
{
JBbutton button = new JButton(name);
add(button);
button.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent event)
{ setBackground(backgroundColor);
repaint();
}
});
}
捕获窗口事件
当程序用户试图关闭一个框架窗口时,
Jframe对象是一个 WindowsEvent(窗口事件 )
的事件源。
如果需要捕获该事件,必须有一个合适的监
听器对象并把它添加到窗口监听器列表中。
WindowListener listener = …… ;
Frame.addWindowListener(listener);
窗口监听器对象必须是一个实现了
WindowListener接口的类对象。
WindowListener接口
public interface WindowListener
{
void windowOpened(WindowEvent e);
void windowClosing(WindowEvent e);
void windowClosed(WindowEvent e);
void windowIconified(WindowEvent e);
void windowDeiconified(WindowEvent e);
void windowActivated(WindowEvent e);
void windowDeactivated(WindowEvent e);
}
WindowListener接口
在 Java中,类实现一个接口意味着它要实现该接口中的
所有方法。
如果只需要 windowClosing方法,应进行如下编程:
class Terminator implements WindowListener
{ public void windowClosing(WindowEvent e)
{ System.exit(0); }
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
publicvoid windowDeactivated(WindowEvent e) {} }
其它方法
留空
适配器类
写上六个空方法是非常烦琐的。为了简化任
务,每个具有不止一个方法的 AWT监听器接
口都有一个实现了它的所有方法,但是却不
做任何工作的适配器。
例如,WindowAdapter类有七个空方法,这
意味着适配器类动态满足了 java中的实现相
关监听器类的技术要求。
可以通过扩展适配器类来实现需要的动作而
无需实现接口。
使用适配器类
class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
frame.addWindowListener(new Terminator());
继承六个空方
法,重载
windowClosin
g方法
设置窗口监听器
frame.addWindowListener( new
WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}); 1,定义一个没有名字的类来扩展 WindowAdpater类。
2,把 windowClosing方法添加到那个匿名信类中。
3,从 WindowAdapter继承剩下的六个方法。
4,创建该类的一个对象。同样这个对象也没有名字。
5,把创建的对象传递到 addWindowListener方法
事件的分类
Event
HandleEvent()
MouseUp()
MouseDown()
MouseDrag()
MouseMove()
MouseEnter()
MouseExit()
keyDown()
KeyUp()
action()
Event类的数据域?
Event
Object arg
int clickCountint id int key
int modifiers Object target
int x int y long when