6.5 ControledBall(受控移动的小球)
当用户按下了键盘,单击了鼠标,操作了窗口等“事件”发生的时候,程序需要给出响应。
要实现对用户事件响应,需要以下两点:第一,监听到事件的发生;第二,在监听到事件发生之后,捕获事件,并根据事件给予响应处理。
Java采用“委派式”事件处理机制(如图1.6.7所示),事件源组件会先注册“监听器”对象,当监听到事件发生的时候,把事件对象发送给事件监听器,事件监听器负责调用响应方法来处理事件。
图1.6.7 Java“委派式”事件处理机制
程序的实现过程如下。
(1)定义事件监听器类。
作为事件监听器的类需要满足两个条件。
①实现某种事件监听器的接口。
要监听键盘按键事件,监听器的类需在类定义的头部加入“implements Key Listener;”,实现键盘监听器接口。例如,
这里可以先把实现接口与继承父类这两件事当作是相似的功能:一个类只要实现了Key Listener的接口,就可以有监听键盘事件的功能了。那么,实现接口和继承父类,有什么不同吗?直接的不同就是,若仅仅实现接口,则有编译错误,如图1.6.8所示。
图1.6.8 编译出错
我们看看Eclipse给的建议,如图1.6.9所示。
图1.6.9 Eclipse给的建议
②实现监听器接口中所有的事件响应方法。我们选择Eclipse给出的第一个解决方案“添加未实现的方法”,这样类里面就加入3个空的方法。
这3个方法是键盘事件的3个响应方法,要对哪个事件进行响应,就把响应的执行内容写入对应的响应方法中。当事件发生的时候,相应的响应方法就会被自动调用。
捕获到的事件对象通过响应方法的参数传递给我们。在上述代码中,参数e就是当前捕获到的事件对象,要想得到任何和当前事件相关的信息,都可以通过事件对象来获取。例如,e.get KeyCode()就可用来获得当前按下的键的键码。
有关事件和事件响应会在第9章介绍。
(2)将事件监听器对象注册在负责监听的组件上。
需求:在一个300×400的窗口中显示一个半径为20的小球,可通过键盘的上、下、左、右键控制小球的移动方向。
代码6.6-1
代码6.6-2
代码6.6-3
【代码6.6】“受控移动的小球”的参考代码
运行程序后,窗口对象就处于键盘事件监听的状态,一旦键盘按键被按下的事件发生,这个事件就会被监听到,并且public void keyPress(Key Event arg0)方法就会被调用,其中的参数arg0就是被捕获到的事件对象。
拓展:了解主要的事件监听器接口还有哪些,它们主要监听哪些事件,每种监听器对应的相应方法有哪些。