任何支持GUI的操作都会不断地监视敲打键盘、单击鼠标等事件,操作环境会把这些事件报告给正在运行的程序,程序会决定如何响应这些事件。

 

事件源拥有自己的方法,允许我们向其注册事件监听器。当事件源产生某个事件时,事件源会向注册在那个事件上的所有事件监听器对象发送通知。

在像Java这样的面向对象语言中,关于事件的信息被封装在一个事件对象中。所有的事件对象都是从Java.util.EventObject派生出来的。

 

AWT中事件处理机制的概览:

  • 一个监听器对象是一个实现了专门的监听器接口的类的实例。
  • 一个事件源是一个能够注册监听器对象并向它们发送事件对象的对象。
  • 事件发生时,事件源会把事件对象发生给所有的注册监听器。
  • 监听器对象随后会使用事件对象中的信息来决定对事件的反应。

 

对于ActionListener接口,它可用于多种情况:

  •  当通过双击来选择列表框的一项时。
  • 当选择一菜单项时。
  • 当在文本域中按下ENTER键时。
  • 对于Timer组件来说,当指定时间达到时。

使用ActionListener接口的方法在所有的情况下都一样:actionPerformed方法(ActionListener接口中唯一的方法)只有一个参数,是一个ActionEvent类型的对象。该事件对象给出了所发生事件的详细信息。

 

在Java中,类实现一个接口意味着它要实现该接口中所有方法。

每个具有不止一个方法的AWT监听器接口都有一个实现其所有方法,但方法中什么也不做的适配器类。

 

一个想接收某一事件的类必须实现一个监听器接口。这个类要在事件源中注册自己,然后,接收所需的事件对象。并通过监听器接口中的方法做出相应的处理。

 

AWT明确区分语义事件和底层事件。  语义事件是用于表达用户动作(如“点击按钮”)的事件;底层事件是使这些成为可能的事件。类似地,调整滚动条是个语义事件,而拖动鼠标则是一个底层事件。

 

事件源是用户界面组件、窗口和菜单。操作系统会把用户的动作(如鼠标移动和击键操作)通知给感兴趣的事件源。事件源在一个事件对象中描述事件的特征。事件源还保持有一组监听器——当事件发生时需要调用的对象。当事件发生时,事件源调用监听器接口中的适当方法把事件信息传递给多个监听器。事件源是通过把适当的事件对象传递给监听器类的方法来实现这一点的。监听器通过分析事件对象以找出关于这个事件更多的信息。

 

Swing包提供了一个非常有用的机制,用来封装命令,并把它们连接到多个事件源。这种机制就是Action接口,一个动作是一个对象。它封装了:

  • 命令的说明(用字符串或可选图标表示)。
  • 执行命令需要的参数。

 

所有的AWT事件源都支持一种对应监听器的多点传递模型。这意味着同一事件被传递到不止一个监听器对象。

API不对向事件源注册的一组监听器传递事件的次序作任何保证。因此,不要编写依赖传递次序的逻辑。

 

当操作环境响应用户动作(如鼠标点击)生成事件时,同操作环境通信的AWT部分会收到一个通知,并把它转化为一个AWT事件。接着,AWT把这个事件添加到一个事件队列中。AWT中把事件分派到监听器的部分会:

  • 从事件队列中提取事件。
  • 为事件定位监听器对象。
  • 为事件调用正确的监听器过程。