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

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

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

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

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

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

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

}

Ответы [ 2 ]

22 голосов
/ 07 апреля 2011

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

this.addMouseListener(new mouseEventHandler()); 

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

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

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

для получения обоих типов событий.

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

3 голосов
/ 07 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...