谁来谈一谈,Java是如何捕获鼠标或者键盘事件的,谢谢 点击鼠标第一个接收到的是操作系统,然后是JVM,最后到我们的UI程序中,谁可以描述一下windows platform中,J2SDK如何捕获鼠标事件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果真要搞清楚,恐怕你得去读jvm的源代码,可这有必要吗?java已经为你封装了windows的API,比之直接调用那些大写的函数不知轻松多少倍,我在写VB的时候就已经被那些API搞怕了... runtime system traps the click event and invoke method handleEvent() of the component which is clicked .the event is regarded as a parameter transport to the handlEvent(). 呵呵,我也想做过这个的,后来我查了好多天,发现JAVA是不能够做到这样的,不过有种方法可以,就是用JAVA去运行你用的操作系统的API函数,详细我还不知道怎么写,我还正在研究中,不过用JAVA去调用操作系统函数,这样就破坏了JAVA的可移植性。 以前做过一些java的游戏,用到过这些事件。不过记得好象是接受窗口的。 操作系统-->JVM(C语言程序)-->java控件 问题是你难道想绕过jvm去截取么?实现不了啊也 Java有一个工具类Toolkit,可以提取底层操作系统的信息,去看看这个类你就会明白一些。该类有个方法:Toolkit.getDefaultToolkit ().getSystemEventQueue (),它就是用来取操作系统事件的,取出的事件将会放在一个事件队列中,这个事件队列叫EventQueue,你也可以通过如下函数把自己的事件队列放到系统事件队列中:Toolkit.getDefaultToolkit ().getSystemEventQueue ().push ( myEventQueue );我们知道,用户每一个操作(击键、点击鼠标)都会产生一个基本事件(MouseEvent、KeyEvent是AWTEvent的一种),这些事件在Java中都表示为对象,EventQueue就是存放这些Java事件对象的队列。至于这些事件怎么构建,那就是JVM与操作系统之间的事了,太底层的东西搞不懂。EventQueue类有个方法dispatchEvent( AWTEvent ae ),它会把各类事件分发到各种组件的监听器上,这就是为什么我们可以给组件加不同的Listener就可以处理来自不同的操作了。我们可以重载方法dispatchEvent( AWTEvent ae ),输出队列中的各类事件,看看结果。下面附上一个测试用的例子,有兴趣的可以回去搞搞:import javax.swing.JFrame;import java.awt.HeadlessException;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: </p> * @author lipinxin * @version 1.0 */import java.awt.*;import java.awt.event.*;import javax.swing.*;public class EventQueueTest extends JFrame implements ActionListener{ JButton button1 = new JButton (); JLabel labelForText=new JLabel("For Text"); JTextField textField1 = new JTextField (); MyEventQueue myEventQueue = new MyEventQueue (); public EventQueueTest() { try { jbInit (); } catch ( Exception e ) { e.printStackTrace (); } } public static void main( String[] args ) { EventQueueTest generateEventQueue = new EventQueueTest (); } private void jbInit() throws Exception { button1.setLabel ( "button1" ); button1.setMnemonic('B') ; button1.addActionListener ( this ); textField1.setText ( "textField1" ); labelForText.setDisplayedMnemonic('F') ; labelForText.setLabelFor(textField1) ; textField1.addKeyListener ( new KeyAdapter () { public void keyTyped( KeyEvent e ) { textField1.setText("event is :"+e.toString() ) ;// eventAction ( e ); } } ); this.getContentPane() .add(labelForText,BorderLayout.NORTH ) ; this.getContentPane().add ( button1 , BorderLayout.SOUTH ); this.getContentPane().add ( textField1 , BorderLayout.CENTER ); Toolkit.getDefaultToolkit ().getSystemEventQueue ().push ( myEventQueue );// EventQueue eq = getToolkit ().getSystemEventQueue ();// eq.postEvent ( new ActionEvent ( button1 , ActionEvent.ACTION_PERFORMED ,// "test" ) ); addWindowListener ( new WinListener () ); setBounds ( 100 , 100 , 300 , 200 ); setVisible ( true ); } public void actionPerformed( ActionEvent e ) {// eventAction ( e ); textField1.setText("event is :"+e.toString() ) ; } private void eventAction( AWTEvent e ) { myEventQueue.postEvent ( e );// myQueueEvent1 = new MyQueueEvent ( e );// EventQueue eq = Toolkit.getDefaultToolkit ().getSystemEventQueue (); } class WinListener extends WindowAdapter { public void windowClosing( WindowEvent we ) { System.exit ( 0 ); } } public class MyEventQueue extends EventQueue { //定义EventQueue的子类 private AWTEvent myEvent; public MyEventQueue( AWTEvent ae ) { super (); myEvent = ae; } public MyEventQueue() { } //在这里重载事件分发的方法 public void dispatchEvent( AWTEvent ae ) { if(!(ae instanceof MouseEvent )){ System.out.println ( ae.toString () ); } // if(ae.getSource() instanceof javax.swing.JButton) // System.out.println("My apture:"+((javax.swing.JButton)ae.getSource()).getText()) ; super.dispatchEvent ( ae ); } }} 你是想不用api直接获取吗?这样的话没有必要吧!如果是思路的话,那么就是监听中断,jvm监听os,java key event api监听jvm获得的键盘事件中断队列。如果想研究,可以看看j2se src中的代码实现 to:准专家,谢谢你的细心回复,这一层我已经比较清楚。to:小云,J2SE的SRC还是依赖与JVM的。to:happyboywzl和你同样的想法,看来得研究虚拟机了 严格来说,这不算jvm,只能算jni的应用。不同的平台这部分是要做porting的。如果想看源代码。pp的 src就很完备了,不同平台的native jni地实现。 to:准专家在EventQueue的事件处理线程中有一个对dispatchEvent方法的回调。你的这段代码是Java AWT事件机制的具体实现,网上一般也找不到这些咚咚,比较有价值。谢谢。我关心的是这句话“至于这些事件怎么构建,那就是JVM与操作系统之间的事了,太底层的东西搞不懂。” 跪求java.nio和rmi的相关视频教程 刚刚学习java请高手帮忙!!!如何将数值型字符转换为数字????急 如何使用路径来java -jar一个jar包? switch问 这是什么问题啊 Socket多线程通信中重连与socket关闭的问题 关于java中continue lable;的问题 在jbuilder7中定义class后为什么光标位置显示不对 为什么我提的问题都没有人回答 哪位大侠救命啊,我做的白板在窗口切换后画过的图形就没有了。怎么办? 请教高手们 这段程序为什么会是-1的结果 请教,eclipse的插件实现原理
不过记得好象是接受窗口的。
该类有个方法:
Toolkit.getDefaultToolkit ().getSystemEventQueue (),
它就是用来取操作系统事件的,取出的事件将会放在一个事件队列中,这个事件队列叫
EventQueue,
你也可以通过如下函数把自己的事件队列放到系统事件队列中:
Toolkit.getDefaultToolkit ().getSystemEventQueue ().push (
myEventQueue );我们知道,用户每一个操作(击键、点击鼠标)都会产生一个基本事件(MouseEvent、KeyEvent是AWTEvent的一种),这些事件在Java中都表示为对象,EventQueue就是存放这些Java事件对象的队列。
至于这些事件怎么构建,那就是JVM与操作系统之间的事了,太底层的东西搞不懂。EventQueue类有个方法dispatchEvent( AWTEvent ae ),它会把各类事件分发到各种组件的监听器上,这就是为什么我们可以给组件加不同的Listener就可以处理来自不同的操作了。我们可以重载方法dispatchEvent( AWTEvent ae ),输出队列中的各类事件,看看结果。下面附上一个测试用的例子,有兴趣的可以回去搞搞:import javax.swing.JFrame;
import java.awt.HeadlessException;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author lipinxin
* @version 1.0
*/import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class EventQueueTest
extends JFrame
implements ActionListener
{
JButton button1 = new JButton ();
JLabel labelForText=new JLabel("For Text");
JTextField textField1 = new JTextField ();
MyEventQueue myEventQueue = new MyEventQueue (); public EventQueueTest()
{
try
{
jbInit ();
}
catch ( Exception e )
{
e.printStackTrace ();
}
} public static void main( String[] args )
{
EventQueueTest generateEventQueue = new EventQueueTest ();
} private void jbInit() throws Exception
{
button1.setLabel ( "button1" );
button1.setMnemonic('B') ;
button1.addActionListener ( this );
textField1.setText ( "textField1" );
labelForText.setDisplayedMnemonic('F') ;
labelForText.setLabelFor(textField1) ;
textField1.addKeyListener ( new KeyAdapter ()
{
public void keyTyped( KeyEvent e )
{
textField1.setText("event is :"+e.toString() ) ;
// eventAction ( e );
}
} ); this.getContentPane() .add(labelForText,BorderLayout.NORTH ) ;
this.getContentPane().add ( button1 , BorderLayout.SOUTH );
this.getContentPane().add ( textField1 , BorderLayout.CENTER );
Toolkit.getDefaultToolkit ().getSystemEventQueue ().push (
myEventQueue );
// EventQueue eq = getToolkit ().getSystemEventQueue ();
// eq.postEvent ( new ActionEvent ( button1 , ActionEvent.ACTION_PERFORMED ,
// "test" ) );
addWindowListener ( new WinListener () );
setBounds ( 100 , 100 , 300 , 200 );
setVisible ( true );
} public void actionPerformed( ActionEvent e )
{
// eventAction ( e );
textField1.setText("event is :"+e.toString() ) ;
} private void eventAction( AWTEvent e )
{
myEventQueue.postEvent ( e );
// myQueueEvent1 = new MyQueueEvent ( e );
// EventQueue eq = Toolkit.getDefaultToolkit ().getSystemEventQueue ();
} class WinListener
extends WindowAdapter
{
public void windowClosing( WindowEvent we )
{
System.exit ( 0 );
}
} public class MyEventQueue
extends EventQueue
{ //定义EventQueue的子类
private AWTEvent myEvent;
public MyEventQueue( AWTEvent ae )
{
super ();
myEvent = ae;
} public MyEventQueue()
{
} //在这里重载事件分发的方法
public void dispatchEvent( AWTEvent ae )
{
if(!(ae instanceof MouseEvent )){
System.out.println ( ae.toString () );
}
// if(ae.getSource() instanceof javax.swing.JButton)
// System.out.println("My apture:"+((javax.swing.JButton)ae.getSource()).getText()) ;
super.dispatchEvent ( ae );
}
}
}
如果是思路的话,那么就是监听中断,jvm监听os,java key event api监听jvm获得的键盘事件中断队列。
如果想研究,可以看看j2se src中的代码实现
to:小云,J2SE的SRC还是依赖与JVM的。
to:happyboywzl
和你同样的想法,看来得研究虚拟机了
如果想看源代码。pp的 src就很完备了,不同平台的native jni地实现。
在EventQueue的事件处理线程中有一个对dispatchEvent方法的回调。你的这段代码是Java AWT事件机制的具体实现,网上一般也找不到这些咚咚,比较有价值。谢谢。我关心的是这句话“至于这些事件怎么构建,那就是JVM与操作系统之间的事了,太底层的东西搞不懂。”