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

解决方案 »

  1.   

    processEvent 可以理解为是所有事件处理的中枢(事件分配者),重载它的时候要相对小心;如果你不调用super.processEvent(e);的话,是可以完全取代原有事件处理的,这种情况下可能导致其它依赖于listener模式的组件出现问题。而mouseListener则仅仅是鼠标事件的监听器,相当于注册了一个函数,等待processEvent来调用。所以,一般来说不推荐直接重写processEvent()。附上JDK的源码,你看看应该能理解两者关系:    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;
                }
            }
        }
      

  2.   

    processEvent方法所有鼠标的事件应该都会调用该方法,这导致无法区分。而且是针对container的。而mouseListener是针对component的,而且能更准确的控制每个动作的不同处理