【发布时间】:2009-09-03 10:17:52
【问题描述】:
在 Java 中,有没有一种方法可以直接检查鼠标按钮是否按下而不使用事件、侦听器等?我想要一个线程,每 100 毫秒左右检查一次鼠标按钮是否按下,然后执行某些操作。因此,如果用户按住鼠标按钮一段时间,它会触发多个响应。
所以我正在寻找的是一种无需通过通常的事件处理系统即可给出鼠标状态的方法。
谢谢
【问题讨论】:
标签: java
在 Java 中,有没有一种方法可以直接检查鼠标按钮是否按下而不使用事件、侦听器等?我想要一个线程,每 100 毫秒左右检查一次鼠标按钮是否按下,然后执行某些操作。因此,如果用户按住鼠标按钮一段时间,它会触发多个响应。
所以我正在寻找的是一种无需通过通常的事件处理系统即可给出鼠标状态的方法。
谢谢
【问题讨论】:
标签: java
我相信这在 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();
}
}
}
}
修改它以在不同时间段后执行不同的操作(例如更改画笔模式)应该是直截了当的。
【讨论】:
我不知道这是否可能 - 也许是。
但是,您始终可以编写一个事件处理程序,其唯一工作就是跟踪当前鼠标状态。然后你的 100ms 代码就可以查询它了。
【讨论】:
无论是否可能,您确定要这样做吗?
在我看来,您可能会因此错过点击次数。 100 毫秒是十分之一秒。很多点击不会持续那么长时间。
即使您缩短轮询循环,您所做的只是缩小您可能错过点击的窗口,从而减少错过点击的频率。但这仍然是一个竞争条件。
我猜您对复杂性的担忧源于必须处理线程问题,但除非您向我们提供更多信息,否则我们无法为您提供太多帮助。
【讨论】:
编写一个监听器来处理鼠标状态应该很容易。有关 AWTEventListener 的介绍,请参阅 Global Event Listeners,它允许您使用单个侦听器侦听所有鼠标事件。
然后在监听器中你将启动你的计时器。
【讨论】: