当前位置: 代码迷 >> J2SE >> java图形界面中对组件重写processEvent方法与对组件添加mouseListener有什么区别解决思路
  详细解决方案

java图形界面中对组件重写processEvent方法与对组件添加mouseListener有什么区别解决思路

热度:192   发布时间:2016-04-24 01:29:36.0
java图形界面中对组件重写processEvent方法与对组件添加mouseListener有什么区别
java图形界面中对组件重写processEvent方法与对组件添加mouseListener有什么区别,我感觉两种方式好像差不多啊,都可以对鼠标在组件上的操作进行处理,希望哪位大虾赐教一下。

------解决方案--------------------
processEvent 可以理解为是所有事件处理的中枢(事件分配者),重载它的时候要相对小心;如果你不调用super.processEvent(e);的话,是可以完全取代原有事件处理的,这种情况下可能导致其它依赖于listener模式的组件出现问题。

而mouseListener则仅仅是鼠标事件的监听器,相当于注册了一个函数,等待processEvent来调用。

所以,一般来说不推荐直接重写processEvent()。

附上JDK的源码,你看看应该能理解两者关系:
Java code
    protected void processEvent(AWTEvent e) {        if (e instanceof FocusEvent) {            processFocusEvent((FocusEvent)e);        } else if (e instanceof MouseEvent) {            switch(e.getID()) {              case MouseEvent.MOUSE_PRESSED:              case MouseEvent.MOUSE_RELEASED:              case MouseEvent.MOUSE_CLICKED:              case MouseEvent.MOUSE_ENTERED:              case MouseEvent.MOUSE_EXITED:                  processMouseEvent((MouseEvent)e);                  break;              case MouseEvent.MOUSE_MOVED:              case MouseEvent.MOUSE_DRAGGED:                  processMouseMotionEvent((MouseEvent)e);                  break;              case MouseEvent.MOUSE_WHEEL:                  processMouseWheelEvent((MouseWheelEvent)e);                  break;            }        } else if (e instanceof KeyEvent) {            processKeyEvent((KeyEvent)e);        } else if (e instanceof ComponentEvent) {            processComponentEvent((ComponentEvent)e);        } else if (e instanceof InputMethodEvent) {            processInputMethodEvent((InputMethodEvent)e);        } else if (e instanceof HierarchyEvent) {            switch (e.getID()) {              case HierarchyEvent.HIERARCHY_CHANGED:                  processHierarchyEvent((HierarchyEvent)e);                  break;              case HierarchyEvent.ANCESTOR_MOVED:              case HierarchyEvent.ANCESTOR_RESIZED:                  processHierarchyBoundsEvent((HierarchyEvent)e);                  break;            }        }    }
------解决方案--------------------
processEvent方法所有鼠标的事件应该都会调用该方法,这导致无法区分。而且是针对container的。而mouseListener是针对component的,而且能更准确的控制每个动作的不同处理
  相关解决方案