1. 程式人生 > >JAVA中handleEvent和action的區別

JAVA中handleEvent和action的區別

看程式碼中用到了handleEvent和action,都是對事件進行處理的,覺得這兩個方法可以直接合並,於是嘗試合併後,發現功能還是有問題,說明兩者還是有區別了,查了很久的資料,才基本瞭解這兩者的區別。

 

發現網上對其資料比較少,但是查詢了JDK_API1.6以後,發現這個方法已經被淘汰了,從JDK1.1開始,processEvent(AWTEvent)取代了HandleEvent, 而action從 JDK 1.1 開始,將此元件作為元件(激發動作事件)上的 ActionListener 來註冊。所以接下來的部分,可能不是很實用了,但是對其解釋還是儘可能的清晰。

JAVA中handleEvent和action的區別

首先從圖中可以看出,一個事件產生以後,都會交由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中,需要努力了。