0

考虑一下class

public class mycomponent extends JComponent {

     public mycomponent(){
       addMouseMotionListener(new MouseMotionHandler());
     }


     class MouseMotionHandler implements MouseMotionListener{
          public void mouseMoved(MouseEvent event){
           //do something
          }

          public void mouseDragged(MouseEvent event){
           //do something
          }
     }
}

现在让我们说mouse drag event发生了。怎么MouseMotionHandler知道调用哪个方法。实现的两种方法。或者当发生事件时,如何在运行时解决要调用的方法event

如果MouseEvent event传递给这些方法的是MouseDrag Event,那么它是如何mouseDragged被调用的。

它怎么知道这是一个MouseDrag事件而不是MouseMove事件?

4

2 回答 2

3

mouseDragged并且mouseMoved事件在是否按下鼠标按钮方面是不同的。以下是这两种方法的说明:

mouseDragged(MouseEvent)
调用以响应用户在按住鼠标按钮的同时移动鼠标。该事件由触发最近一次鼠标按下事件的组件触发,即使光标不再位于该组件上。

mouseMoved(MouseEvent)
调用以响应用户在未按下鼠标按钮的情况下移动鼠标。此事件由当前位于光标下的组件触发。

这是一个关于处理鼠标事件的优秀教程:

http://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html

于 2014-01-14T05:28:58.733 回答
3

它的长与短...

AWT 核心启动本机“事件循环”。这个循环基本上从操作系统接收事件并处理它们。如果当前应用程序上下文对事件感兴趣,则处理该事件并将其添加到事件队列中。

Event Queue 由 Event Dispatching Thread 处理,它根据事件的对象将事件分派给适当的侦听器。

这是该过程的显着简化。

尽管如此,当一个事件进入本机“事件循环”时,会检查它的属性并生成一个适当的 AWT 事件。这是如何确定的很大程度上取决于操作系统如何传递它的事件信息,但基本上,如果操作系统检测到拖动,MouseEvent它的ID属性设置为MouseEvent.MOSUE_DRAGGED,这允许Component筛选事件并确定它应该通知的最佳侦听器,结果是MouseMotionListener.mouseDragged(MouseEvent)

例如,这是processMouseMotionEventComponent

protected void processMouseMotionEvent(MouseEvent e) {
    MouseMotionListener listener = mouseMotionListener;
    if (listener != null) {
        int id = e.getID();
        switch(id) {
          case MouseEvent.MOUSE_MOVED:
              listener.mouseMoved(e);
              break;
          case MouseEvent.MOUSE_DRAGGED:
              listener.mouseDragged(e);
              break;
        }
    }
}
于 2014-01-14T07:44:58.463 回答