Как соответствующие методы 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