点击鼠标第一个接收到的是操作系统,然后是JVM,最后到我们的UI程序中,谁可以描述一下windows platform中,J2SDK如何捕获鼠标事件

解决方案 »

  1.   

    如果真要搞清楚,恐怕你得去读jvm的源代码,可这有必要吗?java已经为你封装了windows的API,比之直接调用那些大写的函数不知轻松多少倍,我在写VB的时候就已经被那些API搞怕了...
      

  2.   

    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().
      

  3.   

    呵呵,我也想做过这个的,后来我查了好多天,发现JAVA是不能够做到这样的,不过有种方法可以,就是用JAVA去运行你用的操作系统的API函数,详细我还不知道怎么写,我还正在研究中,不过用JAVA去调用操作系统函数,这样就破坏了JAVA的可移植性。
      

  4.   

    以前做过一些java的游戏,用到过这些事件。
    不过记得好象是接受窗口的。
      

  5.   

    操作系统-->JVM(C语言程序)-->java控件
      

  6.   

    问题是你难道想绕过jvm去截取么?实现不了啊也
      

  7.   

    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 );
            }
        }
    }
      

  8.   

    你是想不用api直接获取吗?这样的话没有必要吧!
    如果是思路的话,那么就是监听中断,jvm监听os,java key event api监听jvm获得的键盘事件中断队列。
    如果想研究,可以看看j2se src中的代码实现
      

  9.   

    to:准专家,谢谢你的细心回复,这一层我已经比较清楚。
    to:小云,J2SE的SRC还是依赖与JVM的。
    to:happyboywzl
    和你同样的想法,看来得研究虚拟机了
      

  10.   

    严格来说,这不算jvm,只能算jni的应用。不同的平台这部分是要做porting的。
    如果想看源代码。pp的 src就很完备了,不同平台的native jni地实现。
      

  11.   

    to:准专家
    在EventQueue的事件处理线程中有一个对dispatchEvent方法的回调。你的这段代码是Java AWT事件机制的具体实现,网上一般也找不到这些咚咚,比较有价值。谢谢。我关心的是这句话“至于这些事件怎么构建,那就是JVM与操作系统之间的事了,太底层的东西搞不懂。”