Java 聆听鼠标在整个系统上的点击(而不是在JFrame等上)
我想写一个对鼠标点击做出反应的小代码。但似乎唯一的方法是倾听Java组件上的点击。一个直接收听所有点击的人会很好 实际上有可能在Java中实现这一点吗 提前谢谢 更新: 发现它需要一个通过JNI的钩子和一些C代码 更多有关 致以最良好的祝愿,Java 聆听鼠标在整个系统上的点击(而不是在JFrame等上),java,event-handling,click,mouse,listener,Java,Event Handling,Click,Mouse,Listener,我想写一个对鼠标点击做出反应的小代码。但似乎唯一的方法是倾听Java组件上的点击。一个直接收听所有点击的人会很好 实际上有可能在Java中实现这一点吗 提前谢谢 更新: 发现它需要一个通过JNI的钩子和一些C代码 更多有关 致以最良好的祝愿, fnst不要这样认为,因为您正在运行的沙箱。一些值得思考的问题:使用Java中的Point来检测单击发生的位置 诚然,我以前只使用过一次它来检测表中的行,但它似乎最接近我发现的回答问题的方法 public void mouseClicked(MouseE
fnst不要这样认为,因为您正在运行的沙箱。一些值得思考的问题:使用Java中的Point来检测单击发生的位置 诚然,我以前只使用过一次它来检测表中的行,但它似乎最接近我发现的回答问题的方法
public void mouseClicked(MouseEvent e) {
JTable target = (JTable)e.getSource();
//get the coordinates of the mouse click
Point p = e.getPoint();
//get the row index that contains that coordinate
row= target.rowAtPoint(p);
}
我很抱歉,如果这不是你要找的,但除此之外,点击组件是唯一的方法。还有什么选择——点击容器?好吧,那没有任何意义,是吗?据我所知,要想实现你的愿望,没有简单的方法。但是你想要的是可以做到的。。为了实现这个任务,我建议您检查java.awt.Dialog-show方法
package mouseclickevent;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.MenuComponent;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.lang.reflect.Method;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class FrmEvent extends JFrame {
public FrmEvent(){
JPanel panel = new JPanel();
getContentPane().add(panel);
JButton btn = new JButton("Test");
panel.add(btn);
panel.add(new JTextField("Test"));
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FrmEvent frm = new FrmEvent();
frm.setBounds(300,300, 200, 200);
frm.show();
}
});
}
private void consumeEvents() {
try {
if (Thread.currentThread().getClass().getName().endsWith(
"EventDispatchThread")) {
EventQueue eq = null;
eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
if (eq == null) {
return;
}
while (isVisible() || isShowing()) {
AWTEvent event = eq.getNextEvent();
Object src = event.getSource();
Class kActiveEvent= Class.forName("java.awt.ActiveEvent");
if (kActiveEvent != null) {
if (kActiveEvent.isInstance(event)) {
Method m;
Class types[] = {};
Object args[] = {};
m = kActiveEvent.getMethod("dispatch", types);
if (m != null) {
m.invoke(event, args);
continue;
}
}
}
dispatchEvent(src, event);
}
}
}
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private void dispatchEvent(Object src, AWTEvent event) {
if (event.getID()== MouseEvent.MOUSE_CLICKED) {
System.out.println("mouseClicked");
}
if (src instanceof Component) {
( (Component) src).dispatchEvent(event);
} else if (src instanceof MenuComponent) {
( (MenuComponent) src).dispatchEvent(event);
}
}
public void show(){
super.show();
consumeEvents();
}
public static void main(String[] args) {
FrmEvent frm = new FrmEvent();
frm.setBounds(300,300, 200, 200);
frm.show();
}
}
如果您愿意使用第三方库,
它使用JNI提供这些功能,而这在纯java应用程序中是不可能的。Perfect,你救了我一天。