使用MouseAdapter时为什么没有收到mouseDragged-events?

时间:2011-04-07 07:44:42

标签: java mouseevent

为什么mouseDragged - 仅在使用MouseMotionAdapter时收到事件 而不是在使用MouseAdapter时?

Java有两个用于接收鼠标事件的抽象适配器类;
MouseAdapterMouseMotionAdapter

两个班级都有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()));
    }
  } 

}

3 个答案:

答案 0 :(得分:22)

如果您通过

添加
this.addMouseListener(new mouseEventHandler()); 

您将不会收到与动议有关的MouseEvents(这不是您为聆听者注册的内容!)

您必须添加两次侦听器,即使用addMouseMotionListener添加它:

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

以获得两种类型的事件。

(一个副节点,总是为你的班级使用大写第一个字母,即改为使用MouseEventHandler: - )

答案 1 :(得分:3)

你必须将你的MouseAdapter添加为mouseListener和mouseMotionListener,你才会变得金色。 MouseAdapter同时实现MouseListener和MouseMotionListener,但除非您调用addMouseMotionListener

,否则您的组件不知道将mouseDragged事件传递给它

答案 2 :(得分:0)

此问题的最高答案现在已经很旧了。对于使用Java JDK 8或更高版本的任何人,请确保签出https://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html

总而言之,您的侦听器类必须从MouseInputAdapter而不是MouseMotionAdapterMouseAdapter扩展。您将使用addMouseMotionListeneraddMouseListener来添加您的侦听器类,如下所示:

MyMouseHandler myMouseHandler = new MyMouseHandler ();
addMouseMotionListener(myMouseHandler);
addMouseListener(myMouseHandler);