Подтвердить что ты не робот

Почему mouseDragged-события не принимаются при использовании MouseAdapter?

Почему mouseDragged - события, полученные только при использовании MouseMotionAdapter
а не при использовании MouseAdapter?

Java имеет два абстрактных класса адаптера для получения событий мыши.
MouseAdapter и MouseMotionAdapter.

Оба класса имеют mouseDragged(MouseEvent e) -метод, но один из MouseAdapter, похоже, не работает; mouseDragged -СОБЫТИЯ
никогда не переживай с этим.

Оба класса реализуют интерфейс MouseMotionListener, который определяет mouseDragged -event, поэтому я не понимаю, почему это так. не работают правильно на обоих из них.

Вот пример кода, который показывает эту проблему:

import java.awt.event.MouseAdapter;  
import java.awt.event.MouseEvent;  
import java.awt.event.MouseMotionAdapter;  
import javax.swing.JFrame;  

public class SwingApp extends JFrame
{
    public SwingApp()
    {   
        // No mouseDragged-event is received when using this : 
    this.addMouseListener(new mouseEventHandler()); 

    // This works correct (when uncommented, of course) :
    // this.addMouseMotionListener(new mouseMovedEventHandler());


    setBounds(400,200, 550,300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    setVisible(true);
    }   

  public static void main(String args[])
  {
    new SwingApp();
  }

  class mouseEventHandler extends MouseAdapter
  {         
    @Override
    public void mouseDragged(MouseEvent e) // Why is this method never called ?
    {
        System.out.println(String.format("MouseDragged via MouseAdapter / X,Y : %s,%s ", e.getX(), e.getY()));
    }
  } 

  class mouseMovedEventHandler extends MouseMotionAdapter
  {           
    @Override
    public void mouseDragged(MouseEvent e)
    {
        System.out.println(String.format("MouseDragged via MouseMotionAdapter / X,Y : %s,%s ", e.getX(), e.getY()));
    }
  } 

}
4b9b3361

Ответ 1

Если вы добавите его через

this.addMouseListener(new mouseEventHandler()); 

вы не будете получать связанные движения MouseEvents (Это не то, что вы зарегистрировали слушателя для!)

Вам нужно будет добавить слушателя дважды, т.е. добавить его с помощью addMouseMotionListener:

mouseEventHandler handler = new mouseEventHandler();
this.addMouseListener(handler); 
this.addMouseMotionListener(handler);

чтобы получить оба типа событий.

(Сторона node, всегда используйте первую букву для ваших классов, т.е. используйте MouseEventHandler вместо: -)

Ответ 2

вы должны добавить свой MouseAdapter как mouseListener и mouseMotionListener, и вы станете золотыми. MouseAdapter реализует как MouseListener, так и MouseMotionListener, но ваш компонент не знает передать ему события mouseDragged, если вы не вызываете addMouseMotionListener