我想写一个代码对鼠标点击作出反应。但似乎唯一的方法是聆听Java组件的点击。直接倾听所有点击会很好。听整个系统上的鼠标点击(不是在JFrame等)
实际上是否有可能在Java中实现这一点?
在此先感谢!
更新:
发现了,它需要通过JNI钩与一些C代码。
上 http://www.jotschi.de/?p=90问候
更多信息, fnst
我想写一个代码对鼠标点击作出反应。但似乎唯一的方法是聆听Java组件的点击。直接倾听所有点击会很好。听整个系统上的鼠标点击(不是在JFrame等)
实际上是否有可能在Java中实现这一点?
在此先感谢!
更新:
发现了,它需要通过JNI钩与一些C代码。
上 http://www.jotschi.de/?p=90问候
更多信息, fnst
鸵鸟政策是这么认为的,因为沙箱you're运行的
一些耐人寻味:使用点Java来检测点击发生的位置。 http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html
无可否认,香港专业教育学院只有一次使用它之前在一个表像检测行,但似乎最接近于香港专业教育学院发现回答您的QN:
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中的表演方法..
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();
}
}
这是完全可能的,如果你愿意使用第三方库 - JNativeHook
它使用JNI提供这些功能,否则在纯java应用程序中是不可能的。