我想写一些对鼠标点击做出反应的代码。但似乎唯一的方法是听取Java组件的点击。直接聆听所有点击都会很棒。
是否有可能在Java中实现这一点?
提前致谢!
更新
发现,它需要通过JNI进行一些带有一些C编码的钩子。
更多信息 http://www.jotschi.de/?p=90
祝你好运, fnst
答案 0 :(得分:2)
如果您愿意使用第三方库,那就完全有可能 - JNativeHook
它使用JNI提供这些功能,否则在纯Java应用程序中是不可能的。
答案 1 :(得分:1)
不要这么想,因为你正在运行沙箱。
答案 2 :(得分:0)
一些值得深思的东西:使用Java中的Point来检测点击发生的位置。 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);
}
对不起,如果这不是你想要的,但除此之外,点击组件是唯一的方法。什么是替代方案 - 点击容器?好吧,这没有任何意义吗?
答案 3 :(得分:0)
据我所知,没有简单的方法可以达到你想要的效果。但是你想要的是什么......对于完成这个任务的现代方式,我建议你检查一下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();
}
}