Как соответствующие методы MouseMotionListener в Java Swing?

Учти это 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 событие?

2 ответа

Решение

Короче говоря...

Ядро AWT запускает собственный "цикл обработки событий". Этот цикл в основном принимает события от ОС и обрабатывает их. Если событие представляет интерес для текущего контекста приложения, оно обрабатывается и добавляется в очередь событий.

Очередь событий обрабатывается потоком диспетчеризации событий, который отправляет событие соответствующему слушателю на основе того, для кого предназначено событие.

Это значительное упрощение процесса.

Тем не менее, когда событие входит в собственный "цикл событий", его свойства проверяются и генерируется соответствующее событие AWT. То, как это определяется, во многом зависит от того, как ОС передает свою информацию о событиях, но в основном, если ОС обнаруживает перетаскивание, MouseEvent имеет это ID свойство установлено в MouseEvent.MOSUE_DRAGGEDэто позволяет Component просеять через события и определить лучшего слушателя, которого он должен уведомить, который оказывается MouseMotionListener.mouseDragged(MouseEvent)

Например, это processMouseMotionEvent метод взять из Component

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;
        }
    }
}

mouseDragged а также mouseMoved События различаются в зависимости от того, нажата ли кнопка мыши или нет. Вот описание обоих методов:

mouseDragged (MouseEvent)
Вызывается в ответ на перемещение пользователя мышью, удерживая кнопку мыши нажатой. Это событие вызывается компонентом, который вызвал самое последнее нажатие мыши, даже если курсор больше не находится над этим компонентом.

mouseMoved (MouseEvent)
Вызывается в ответ на перемещение пользователя мышью без нажатия кнопок мыши. Это событие вызывается компонентом, который в данный момент находится под курсором.

Вот отличное руководство по обработке событий мыши:

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

Другие вопросы по тегам