第七章( 2)事件驱动程序目标:
解释事件驱动程序的概念
了解事件、事件源和事件类
声明监听器类并编写代码处理事件
在事件源对象中注册监听器对象
理解事件处理的方式
编写程序处理行为事件 ActionEvent
编写程序处理鼠标事件 MouseEvent
编写程序处理键盘事件 KeyEvent
使用 Time类控制动画引言
所有非 GUI程序都是按过程的顺序执行
Java GUI程序设计是事件驱动的,在事件驱动程序设计中,激活一个事件时开始执行相应的代码,事件也许是点击按钮,也许是移动鼠标。
Events
事件可以定义为程序发生了某些事件的信号。
比如,外部用户行为,移动鼠标、点击鼠标和按下键盘等,都可以引发事件。操作系统,如时钟等,也可以引发事件。
事件源对象:在其上发生事件的组件。如按钮是点击按钮事件的源对象。
一个事件是事件类的对象,事件类的根类是
java.util.EventObject。事件类的层次关系如下图所示:
Event Classes
AW T E ve n t E ve n t Obj e c t
Adj us t m e n t E ve n t
C om po n e n t E ve n t
T e x t E ve n t
I t e m E ve n t
Ac t i on E ve n t
I n pu t E ve n t
W i n do w E ve n t
M ou s e E ve n t
K e yE ve n t
C on t a i n e r E ve n t
F oc us E ve n t
P a i n t E ve n t
L i s t S e l e c t i on E ve n t
注:除 ListSelectionEvent外,上面所有事件类都包含在包
java.awt.event中。 AWT事件最初是为 AWT组件设计的,但许多 Swing组件都可以触发它们。
Event Information
事件对象包含与事件相关的一切属性,可以使用 EventObject类中的实例方法 getSource()获得事件的源对象。
EventObject类的子类处理特定类型的事件,如行为事件、窗口事件等,下表列出了部分事件用户行为、源对象和事件类型用户行为 源对象 事件类型点击按钮 JButton ActionEvent
点击复选框 JCheckBox ItemEvent,ActionEvent
点击单选按钮 JRadioButton ItemEvent,ActionEvent
在文本框按下回车键 JTextField ActionEvent
选定一个新项 JComboBox ItemEvent,ActionEvent
窗口打开、关闭、最小化等 Window WindowEvent
按下、释放、点击鼠标等 Component MouseEvent
释放或按下键盘上的键 Component KeyEvent
注:如一个组件能够发生某个事件,则这个组件的任何子类都能发生同样类型的事件。
事件的监听、注册和处理
Java使用事件委托处理模型来处理事件:在源对象上的外部用户行为触发事件,监听该事件的对象自动调用相应的事件处理方法进行处理。
如何成为源对象上事件的监听器?
– 监听器对象的类必须实现相应的事件监听器接口。
Java为每一种类型的 GUI事件都提供了监听器接口。
通常事件 XEvent的监听接口命名为 XListener。监听接口包含处理事件的方法。
– 源对象必须注册监听器对象。一般来说,XEvent的注册方法名为 addXListener。一个源对象可以注册多个监听器,以对多种事件起作用。
事件、事件监听接口和监听接口方法
Event Class Listener Interface Listener Methods (Handlers)
ActionEvent ActionListener actionPerformed(ActionEvent)
ItemEvent ItemListener itemStateChanged(ItemEvent)
WindowEvent WindowListener windowClosing(WindowEvent)
windowOpened(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
ContainerEvent ContainerListener componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
MouseEvent MouseListener mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseClicked(MouseEvent)
mouseExited(MouseEvent)
mouseEntered(MouseEvent)
KeyEvent KeyListener keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTypeed(KeyEvent)
委托代理模型
so u r ce,S o u r ce Cl as s
+a d d X L i ste n e r ( X L i ste n e r l i ste n e r )
l i ste n e r,L i ste n e r Cl as s U se r
A ct i o n
T r i g g e r an e v e n t
X L i ste n e r
+ h a n d l er ( X E ve n t ev en t )
I n t e r n al f u n ct i o n o f t h e so u r ce o b j e ct
e v e n t,X E v e n t l i ste n e r 1
l i ste n e r 2

li ste n e r n
+ h a n d l er (
X E ve n t
Re g i ste r b y i n v o k i n g
so u r ce,ad d X L i ste n e r ( l i ste n e r ) ;
K e e p i t a l i st
I n v o k e
l i ste n e r 1,h an d l e r ( e v e n t )
l i ste n e r 2,h an d l e r ( e v e n t )

l i ste n e r n,h an d l e r ( e v e n t )
委托代理模型举例
so u r ce,JBu t t o n
+a d d A ct i o n L i st e n e r ( A ct i o n L i st e n e r l i st e n e r )
l i st e n e r,L i st e n e r Cl ass
Ac t i o n L i s t e n er
+ a ct i o n P erf o rm e d ( Ac t i o n Ev e n t ev en t )
Re g i st e r b y i n v o k i n g
so u r ce,ad d A ct i o n L i st e n e r ( l i st e n e r ) ;
ListenerClass listener = new ListenerClass();
JButton jbt = new JButton("OK");
jbt.addActionListener(listener);
java.awt.event.ActionEvent
事件对象包含与事件类型相关的信息。例如,事件 对象可以调用 getSource()获得事件源对象。
java.awt.event.ActionEvent
+getActionCommand(),String
+getModifier(),int
+getWhen(),long
返回与这个行为有关的命令字符串,对于按钮,它的文本就是命令串返回这一行为事件期间被按下的控制键返回这个事件发生的时间戳
java.util.EventObject
+getSource(),Object 返回最初发生该事件的源对象
java.awt.event.AWTEvent
Example 7.2.1
处理简单的行为事件
编写程序,在窗口中显示两个按钮 OK和 Cancel,
并在控制台上显示信息,指明什么时候点击哪个按钮。
TestActionEvent
Example 7.2.2
处理窗口事件
TestWindowEvent
问题,编写一个程序演示如何处理窗口事件
Example 7.2.3
单个源对象多个监听器
TestMultipleListener
问题,编写程序,修改例子 7.2.1,为 OK按钮和
Cancel按钮增加一个新的监听器。
鼠标事件
j a v a,a w t,e v e nt,Mouse E v e nt
+ g e t B ut t o n( ),i n t
+ g e t C l i c kC ou n t ( ),i n t
+ g e t P oi nt ( ),j a va,a w t,P oi n t
+ g e t X ( ),i n t
+ g e t Y ( ),i n t
指出点击的是哪一个鼠标键,
返回与这个事件相关的鼠标点击次数,
返回一个包含 x 坐标和 y 坐标的 P oi nt 对象,
返回鼠标点的 x 坐标,
返回鼠标点的 y 坐标,
j a v a,a w t,e v e nt,I npu t E v e nt
+ g e t W h e n ( ),l o ng
+ i s A l t D o w n ( ),bool e a n
+ i s C ont r ol D o w n( ),bool e a n
+ i s M e t a D o w n( ),bool e a n
+ i s S h i f t D o w n ( ),bool e a n
返回这个事件发生时的时间,
返回这个事件发生时是否按下 A l t 键,
返回这个事件发生时是否按下 C t r l 键,
返回这个事件发生时是否按下 M e t a 键返回这个事件发生时是否按下 s h i f t 键,
处理鼠标事件
Java 提供了两个鼠标监听接口
MouseListener 和
MouseMotionListener,
MouseListener 可以监听鼠标的按下、
释放、移入、移出或点击等行为。
MouseMotionListener 可以监听鼠标的拖动和移动等行为处理鼠标事件
ja v a,a w t,e v e n t,M o u s e L i s t e n e r
+ m ou s e P r e s s e d( e,M ou s e E v e nt ),v oi d
+ m ou s e R e l e as e d( e,M ou s e E v e nt ),v oi d
+ m ou s e C l i c k e d ( e,M o us e E v e nt ),v oi d
+ m ou s e E nt e r e d( e,M ou s e E v e nt ),v oi d
+ m ou s e E x i t e d ( e,M ou s e E v e nt ),v oi d
在源组件上按下鼠标键时调用。
在源组件上释放鼠标键时调用,
在源组件上点击鼠标键时调用当鼠标指针进入源组件时调用,
当鼠标移出源组件时调用,
ja v a,a w t,e v e n t,M o u s e M o tio n L i s t e n e r
+ m ou s e D r ag ge d( e,M ou s e E v e nt ),v oi d
+ m ou s e M ov e d ( e,M ou s e E v e nt ),v oi d
当按住鼠标键并进行移动时调用,
当不按住鼠标键进行移动时调用,
Example 7.2.4
使用鼠标在面板上移动信息问题:编写程序,在面板中显示一条信息,可以用鼠标移动该信息。
拖动鼠标时信息也随之移动,信息总是显示在鼠标指针处。
MoveMessageDemo
Example 7.2.5
使用鼠标画画问题:编写一个可以用鼠标涂画的程序。在面板上按住鼠标左键移动鼠标
,就可以画一些东西。按住右键移动
,就可以擦去所画的东西。
ScribbleDemo
键盘事件
j a v a,a w t,e v e nt,K e y E v e nt
+ g e t K e yC h a r ( ),c h a r
+ g e t K e yC od e ( ),i nt
返回这个事件中该键对应的字符,
返回这个事件中该键对应的键编码整数
j a v a,a w t,e v e nt,I np ut E v e nt
通过键盘事件,可以利用键来控制和执行一些操作,或从键盘上获得输入。只要按下、释放一个键或者在一个组件上打字,就会激发键盘事件。键盘事件对象描述事件的特性(即按下、松开或者击打一个键)和对应键的值。
键盘事件(续)
Java在 KeyEvent类中定义了许多键对应的常量,例如,
Home VK_HOME
End VK_End
Page Up VK_PGUP
Page Down VK_PGDN
0到 9 VK_0到 VK_9
A到 Z VK_A到 VK_Z
等等处理键盘事件
void keyPressed(KeyEvent e)
按下键时调用,
void keyReleased(KeyEvent e)
释放键时调用,
void keyTyped(KeyEvent e)
按下接着释放键时调用,
为处理键盘事件,使用 KeyListener接口方法,
Example 7.2.6
处理键盘事件问题:编写程序
,显示用户输入的字符。用户可以使用箭头键(
光标键)上、下
、左、右移动字符。
KeyboardEventDemo
Liang,Introduction to Java Programming,Fifth Edition,(c) 2005 Pearson Education,Inc,All
rights reserved,0-13-148952-6 24
处理组合键
KeyEvent对象调用从父类 InputEvent继承的方法,
public boolean isAltDown();
public boolean isControlDown();
public boolean isShiftDown();
可以检测组合键是否按下。
Liang,Introduction to Java Programming,Fifth Edition,(c) 2005 Pearson Education,Inc,All
rights reserved,0-13-148952-6 25
Example 7.2.7
处理组合键盘事件问题:修改上例程序,用户使用 ALT+箭头键(光标键)
上、下、左、
右移动字符。
CombKeyboardEventDemo
定时器 Timer 类并非所有的源对象都是 GUI组件。定时类 javax.swing.Timer就是一个按照预定频率触发 ActionEvent事件的源组件。
ja v a x,s w i n g,T i m e r
+ T i m e r ( de l a y,i nt,l i s t e n e r,
A c t i on L i s t e n e r )
+ a dd A c t i o nL i s t e n e r ( l i s t e n e r,
A c t i on L i s t e n e r ),vo i d
+ s t a r t ( ),vo i d
+ s t op ( ),vo i d
+ s e t D e l a y( de l a y,i n t ),vo i d
利用指定的时间隔毫秒数和 A c t i o nL i s t e n e r 对象创建 T i m e r
给该定时器添加 A c t i o nL i s t e n e r 对象启动定时器停止定时器设置这个定时器的新间隔值
Example 7.2.8 活动时钟在上一次实验中,我们绘制了一个静止时钟显示时间,如何才能使时钟走起来呢?
ClockAnimation