为什么在使用 MouseAdapter 时未收到 mouseDragged 事件?

2022-09-03 04:46:23

为什么 -events 仅在使用时接收,而不在使用
时接收 ?mouseDraggedMouseMotionAdapterMouseAdapter

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

两个类都有一个 -方法,但 中的
一个似乎不起作用 ;-事件
永远不会通过这个。mouseDragged(MouseEvent e)MouseAdaptermouseDragged

这两个类都实现了
定义 -event 的 -interface,所以我不明白为什么它
不能在它们两个类上正常工作。MouseMotionListenermouseDragged

下面是显示此问题的示例代码:

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

}

答案 1

如果通过以下方式添加它

this.addMouseListener(new mouseEventHandler()); 

您将不会收到与运动相关的内容(这不是您注册听众的内容!MouseEvents

您必须添加两次侦听器,即同时使用以下方式添加它:addMouseMotionListener

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

为了获得这两种类型的事件。

(侧节点,始终使用大写的首字母作为类,即改用 :-)MouseEventHandler


答案 2

你必须把你的MouseAdapter添加为mouseListener和mouseMotionListener,你就会变成金色的。MouseAdapter 同时实现了 MouseListener 和 MouseMotionListener,但您的组件不知道是否将 mouseDragged 事件传递给它,除非您调用 addMouseMotionListener