鼠标按下时,Java MouseListener禁用MouseMotionListener

时间:2017-10-29 16:23:32

标签: java swing click mouseevent

构造函数内部:

   addMouseListener(new MouseAdapter() {

       public void mousePressed(MouseEvent e){
           //Do something
       }
       public void mouseReleased(MouseEvent e){
           //Do something
       }
   });
   addMouseMotionListener(new MouseMotionAdapter(){
       public void mouseMoved(MouseEvent evt) {
           cursorX = evt.getX();
           cursorY = evt.getY();
       }
   });

mouseMoved正在运行,而我没有点击/按任意鼠标按钮。

但是当我单击或按住鼠标按钮时,光标位置不再更新,而且mouseMoved不会被调用

我正在寻找解决方案几个小时请帮助我!

我尝试将MouseListener和MouseMotionListener实现到类中,但这也不起作用。

2 个答案:

答案 0 :(得分:2)

简单的答案是,当按钮被按住时,鼠标在组件表面上移动之间有不同之处。系统将识别这些差异并调用不同的功能。

这是通过设计完成的,大概是为了更容易管理两个场景,这两个场景可以产生不同的结果(即Drag'n'Drop)

以下示例是一个简单的演示。当您按下鼠标按钮并移动鼠标时,将调用mouseMoved,否则将调用import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { System.out.println("Pressed"); } @Override public void mouseReleased(MouseEvent e) { System.out.println("Released"); } }); addMouseMotionListener(new MouseAdapter() { @Override public void mouseMoved(MouseEvent e) { System.out.println("Moved"); } @Override public void mouseDragged(MouseEvent e) { System.out.println("Mouse Dragged"); } }); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } }

{{1}}

答案 1 :(得分:1)

我不知道为什么会发生这种情况,但您也可以在mouseMoved(MouseEvent evt) mouseDragged(MouseEvent evt)内的MouseMotionListener内使用相同的代码,这是在鼠标移动时触发的并同时按下。

如果这不起作用,这意味着MouseListener优先于MouseMotionListener,在这种情况下,我不知道你能做什么。