JAVA中handleEvent和action的區別
看程式碼中用到了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中,需要努力了。