Java MouseListener 在按下鼠标时禁用 MouseMotionListener

标签 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,但这也不起作用。

最佳答案

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

这是设计使然,大概是为了更容易管理这两个场景,这两个场景可以生成不同的结果(即拖放)

下面的例子是一个简单的演示。当按下鼠标按钮并移动鼠标时,mouseDragged将被调用,否则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);
        }

    }

}

关于Java MouseListener 在按下鼠标时禁用 MouseMotionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002488/

相关文章:

java - 使用 java Apache POI 3.9 Eclipse 从 excel 文件 .xlsx 读取

java - 使用抽象方法时定义的 var 为 null

Java - 线程 "AWT-EventQueue-0"java.lang.NumberFormatException : create a URL from User Input using JComboBox 中的异常

java - 如何画一条有方向、固定长度的线

javascript - html5 Canvas 点击贝塞尔路径形状检测

Java创建实例数组

java - SUM 函数和 GROUP BY 的列索引无效

java - 无法阻止 JTextField 获取默认焦点

javascript - 单击工具提示中的链接时,Tooltipster 插件不会触发 jquery 函数

javascript - 当我按下 1 个其他 div 时,如何更改 2 个 div 的背景颜色?