Java鼠标按下 - 无事件

6

请问在 Java 中,是否有一种直接检查鼠标按钮是否按下的方法,而不需要使用事件、监听器等方式?我想要创建一个线程,在每隔 100 毫秒左右检查鼠标按钮是否按下,并执行相应操作。因此,如果用户长时间按住鼠标按钮,则会触发多个响应。

因此,我正在寻找一种方法来获取鼠标状态,而无需通过常规的事件处理系统。

谢谢

4个回答

5

我认为在Java中这是不可能的。虽然通过JNI是可以实现的,但那会让人非常头痛。

使用事件来实现并不难,并且会更好地与您的应用程序集成。以下是一个示例,在鼠标按钮按下时每100毫秒向控制台写入一次:

import javax.swing.*;
import java.awt.event.*;

public class Test {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        final JLabel label = new JLabel("Click on me and hold the mouse button down");
        label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.getContentPane().add(label);
        label.addMouseListener(new TimingMouseAdapter());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static class TimingMouseAdapter extends MouseAdapter {
        private Timer timer;

        public void mousePressed(MouseEvent e) {
            timer = new Timer(100, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Mouse still pressed...");
                }
            });
            timer.start();
        }

        public void mouseReleased(MouseEvent e) {
            if (timer != null) {
                timer.stop();
            }
        }

    }
}

修改此代码以在不同时间段后执行不同操作(例如更改画笔模式)应该很简单。

4

我不知道这是否可能 - 也许是可能的。

然而,你可以编写一个事件处理程序,其唯一工作就是跟踪当前鼠标状态。然后你的100毫秒代码只需要查询它即可。


我想过那个,但是它有点更加复杂。我想试试看是否有人知道一种直接获取鼠标状态的方法,如果没有,那就使用事件处理程序。 - user167771

2
无论是否可能,您确定要这样做吗?
在我看来,您很可能会错过点击。100毫秒是一秒钟的十分之一。许多点击并不持续那么长时间。
即使您使轮询循环更短,您所做的只是缩小了您可能错过点击的时间窗口,因此它会更少地错过点击。但仍然存在竞态条件。
我猜您对复杂性的担忧源于需要处理线程问题,但除非您提供更多信息,否则我们无法提供太多帮助。

100毫秒只是我脑海中的一个想法,我计划尝试不同的时间。你提到漏掉点击的问题很好。 我正在尝试将鼠标作为绘图程序的画笔工具,这将涉及到程序根据鼠标按下的时间等因素做出响应。 我想要找出的是是否可能进行这种低级别、直接查询鼠标状态的操作,然后我会进行实验,看看它的效果如何,然后决定使用它还是尝试使用事件处理程序。 - user167771
对于一个绘画程序,我使用了MouseMotionListener并实现了mouseDragged()方法来允许绘制。 - Sam Barnum

0

编写一个监听器来处理鼠标状态应该很容易。请参阅全局事件监听器,了解AWTEventListener的介绍,它允许您使用单个监听器监听所有鼠标事件。

然后在监听器中启动计时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接