看代码中用到了handleEvent和action,都是对事件进行处理的,觉得这两个方法可以直接合并,于是尝试合并后,发现功能还是有问题,说明两者还是有区别了,查了很久的资料,才基本了解这两者的区别。

发现网上对其资料比较少,但是查询了JDK_API1.6以后,发现这个方法已经被淘汰了,从JDK1.1开始,processEvent(AWTEvent)取代了HandleEvent, 而action从 JDK 1.1 开始,将此组件作为组件(激发动作事件)上的 ActionListener 来注册。所以接下来的部分,可能不是很实用了,但是对其解释还是尽可能的清晰。


首先从图中可以看出,一个事件产生以后,都会交由HandleEvent()处理,然后HandleEvent()会将部分事件细分给action()处理。

action()处理的是ACTION_EVENT,即由构件产生的事件;而handleEvent处理所有的小应用程序所接受的事件,由它将事件送给相对应的方法。

而原有的handleEvent如下:

public boolean handleEvent(Event evt) {
   switch(evt) {
      case Event.MOUSE_ENTER:
         return mouseEnter(evt,evt.x,evt.y);
      case Event.MOUSE_EXIT:
         return mouseExit(evt,evt.x,evt.y);
      case Event.MOUSE_MOVE:
         return mouseMove(evt,evt.x,evt.y);
      case Event.MOUSE_DRAG:
         return mouseDrag(evt,evt.x,evt.y);
      case Event.MOUSE_UP:
         return mouseUp(evt,evt.x,evt.y);
      case Event.MOUSE_DOWN:
         return mouseDown(evt,evt.x,evt.y);
      case Event.KEY_PRESS:
      case Event.KEY_ACTION:
         return keyDown(evt,evt.key);
      case Event.KEY_RELEASE:
      case Event.KEY_ACTION_RELEASE:
         return keyUp(evt,evt.key);
      case Event.ACTION_EVENT:
         return action(evt,evt.arg);
      case Event.GOT_FOCUS:
         return gotFocus(evt,evt.arg);
      case Event.LOST_FOCUS:
         return lostFocus(evt,evt.arg);
   }
   return false;
}


这里明显的说明只有一部分事务会交由action处理,这些事务一般是组建的事件产生的,因此如果不是组建的事件,但将这个事件的处理方法写在了action中,这个事件是不会被正常处理的。

同时想指出的是,e.id和e.target的问题。在handleEvent函数中,是用e.id区分不同事件的,在action中是用e.target区分事件,这样导致的结果是不同的事件,有不同的e.id,但其有相同的e.target;比如我不想写action()对一个action进行处理,那么是可以把事件的处理放在handleEvent中进行处理的,但是在handleEvent中直接写比如

if( e.target == button1 )//对按钮button1事件进行处理

恐怕是要出问题的,但是下面的写法是没有问题的:

if( e.id == Event.ACTION_EVENT  &&  e.target == button1 )

这就是关于handleEvent以及action的区别和使用需要注意的地方,表示学习落后了,JDK到了1.6了,我还在JDK1.0中,需要努力了。