【问题标题】:Java mouse pressed - without eventsJava 鼠标按下 - 没有事件
【发布时间】:2009-09-03 10:17:52
【问题描述】:

在 Java 中,有没有一种方法可以直接检查鼠标按钮是否按下而不使用事件、侦听器等?我想要一个线程,每 100 毫秒左右检查一次鼠标按钮是否按下,然后执行某些操作。因此,如果用户按住鼠标按钮一段时间,它会触发多个响应。

所以我正在寻找的是一种无需通过通常的事件处理系统即可给出鼠标状态的方法。

谢谢

【问题讨论】:

    标签: java


    【解决方案1】:

    我相信这在 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();
                }
            }
    
        }
    }
    

    修改它以在不同时间段后执行不同的操作(例如更改画笔模式)应该是直截了当的。

    【讨论】:

      【解决方案2】:

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

      但是,您始终可以编写一个事件处理程序,其唯一工作就是跟踪当前鼠标状态。然后你的 100ms 代码就可以查询它了。

      【讨论】:

      • 我想到了,但它有点复杂。我想我会尝试看看是否有人知道直接获取鼠标状态的方法,如果不知道,则使用事件处理程序。
      【解决方案3】:

      无论是否可能,您确定要这样做吗?

      在我看来,您可能会因此错过点击次数。 100 毫秒是十分之一秒。很多点击不会持续那么长时间。

      即使您缩短轮询循环,您所做的只是缩小您可能错过点击的窗口,从而减少错过点击的频率。但这仍然是一个竞争条件。

      我猜您对复杂性的担忧源于必须处理线程问题,但除非您向我们提供更多信息,否则我们无法为您提供太多帮助。

      【讨论】:

      • 100 毫微秒就在我的脑海中,我打算尝试不同的时间。关于丢失点击的好点。我试图让鼠标作为图形程序的画笔工具工作,这将涉及让程序根据鼠标按下的时间做出响应,等等。我想知道是否有可能做这种低级的,直接查询鼠标状态,然后我会做实验,看看效果如何,要么使用它,要么尝试使用事件处理程序.
      • 对于一个绘画程序,我使用了 MouseMotionListener 并实现了 mouseDragged() 以允许绘画。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-06-29
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多