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