日期:2014-05-20  浏览次数:20611 次

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的,而且能更准确的控制每个动作的不同处理