为什么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()));
}
}
}
答案 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
而不是MouseMotionAdapter
或MouseAdapter
扩展。您将使用addMouseMotionListener
和addMouseListener
来添加您的侦听器类,如下所示:
MyMouseHandler myMouseHandler = new MyMouseHandler ();
addMouseMotionListener(myMouseHandler);
addMouseListener(myMouseHandler);