今天阅读AWT的源码,EVENT和EVENTLlistner都挺好,监听者比较完善。阅读完Componet有些糊涂,不知道AWT是如何处理事件源的,譬如鼠标的CLICK消息是由谁发出的,考虑到他可能涉及系统消息,会存在通过JNI访问C代码的问题,又特别关注了TextEvent的Textchanged,也没有找到相应的事件源判断和通知代码,请高手指导啊,甚是感谢!

解决方案 »

  1.   

    给你看个例子,我刚写的:
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    public class CallTest implements ActionListener{

    public CallTest() {
    JFrame f = new JFrame();
    JButton btn = new JButton("Click me!");
    btn.addActionListener( this );
    f.add( btn, BorderLayout.NORTH );
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize(400,300);
    f.setLocationRelativeTo( null );
    f.setVisible( true );
    }
    public void actionPerformed( ActionEvent e ) {
    StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();
    for(StackTraceElement ste : stackTraces) {
    System.out.println(ste);
    }
    } public static void main(String[] args) {
    new CallTest();
    }}在我机子上的运行结果如下:java.lang.Thread.getStackTrace(Unknown Source)
    systemTest.CallTest.actionPerformed(CallTest.java:25)
    javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    java.awt.Component.processMouseEvent(Unknown Source)
    javax.swing.JComponent.processMouseEvent(Unknown Source)
    java.awt.Component.processEvent(Unknown Source)
    java.awt.Container.processEvent(Unknown Source)
    java.awt.Component.dispatchEventImpl(Unknown Source)
    java.awt.Container.dispatchEventImpl(Unknown Source)
    java.awt.Component.dispatchEvent(Unknown Source)
    java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    java.awt.Container.dispatchEventImpl(Unknown Source)
    java.awt.Window.dispatchEventImpl(Unknown Source)
    java.awt.Component.dispatchEvent(Unknown Source)
    java.awt.EventQueue.dispatchEvent(Unknown Source)
    java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    java.awt.EventDispatchThread.run(Unknown Source)
      

  2.   

    从上面的打印情况可以很清楚的看到,首先是AWT捕获到事件(鼠标事件),
    然后,EventQueue指派事件到窗体上,在接着JFrame继续向下指派事件
    直到到了JButton,然后JButton的UI接收到了事件,对ButtonModel进行了
    一些操作,最后由ButtonModel的fireActionPerformed来通知注册到该按钮上的ActionListener。
      

  3.   

    TKS,我今天看看再研究下。研究完了就结帖
      

  4.   

    1楼的已经讲的很明白了,应该是EventDispatchThread -> EventQueue -> JFrame -> Container -> Component,在Component中,再去寻找对应的消息响应,并且执行