我想寫一個代碼對鼠標點擊作出反應。但似乎唯一的方法是聆聽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應用程序中是不可能的。