【发布时间】:2011-06-05 03:37:13
【问题描述】:
我想编写一个响应鼠标点击的小代码。但似乎唯一的方法是听取对 Java 组件的点击。直接监听所有点击会很棒。
真的有可能在 Java 中实现吗?
提前致谢!
更新:
发现,它需要一个通过 JNI 和一些 C 编码的钩子。
更多信息 http://www.jotschi.de/?p=90
最好的问候, 首先
【问题讨论】:
标签: java event-handling click mouse listener
我想编写一个响应鼠标点击的小代码。但似乎唯一的方法是听取对 Java 组件的点击。直接监听所有点击会很棒。
真的有可能在 Java 中实现吗?
提前致谢!
更新:
发现,它需要一个通过 JNI 和一些 C 编码的钩子。
更多信息 http://www.jotschi.de/?p=90
最好的问候, 首先
【问题讨论】:
标签: java event-handling click mouse listener
不要这么认为,因为您正在运行沙箱。
【讨论】:
深思熟虑:使用 Java 中的 Point 来检测点击发生的位置。 http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html
诚然,我之前只使用过一次它来检测表中的行,但它似乎最接近我找到的答案。:
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();
}
}
【讨论】:
如果你愿意使用第三方库是完全可能的 - JNativeHook
它使用 JNI 提供这些功能,这在纯 Java 应用程序中是不可能的。
【讨论】: