下面是一个很简单的窗口程序,注册了一个windowsListener,
实现了一个windowClosing()来处理关闭窗口的事件.
我的疑问是为什么点窗口右上角的"X"就会产生一个事件,
而事件又是如何会传入窗口注册的windowsListener里,
接下来为什么又会调用windowClosing这个方法呢?
我在程序里丝毫看不到这些具体的实现,搞得我一头雾水,
希望明白其中机理的高人出来指点一二,谢谢了import java.awt.*;
import java.awt.event.*;
public  class Lang{
   
   public static void  main(String[] args){
    Frame f = new Frame("d");
    f.setBounds(80,200,200,200);
    f.show();
    f.addWindowListener(new java.awt.event.WindowAdapter(){
     public void windowClosing(WindowEvent e){
      System.exit(1);
     }
    });
   
   
   }
}

解决方案 »

  1.   

    这个问题要回答的话,得打好多字哦,又不能用语音,懒得打了,呵呵。
    但可以给楼主一个建议,去学习一个Design Pattern中Observer Pattern(观察者模式),你就会明白其中的机制了。
      

  2.   

    越是看似简单问题越不好回答,写了4、5百字写不下去了,汗!
    我建议你搜索“消息处理机制”和“事件处理机制”。下面是我写的,太乱,也有不准确的地方,仅供参考。----------------------------------------
    我们所谓的java编程首先是使用API编程,API由工具包SDK提供。使用API当然简化了后继的开发工作,同时隐藏了内部细节。所以,从我们一般写的代码不会看到具体实现。键盘鼠标都是输入设备,敲几下键盘,活动一下鼠标,都是在向电脑输入信息。操作系统中有一个线程(这里好像应该叫中断,不必深究)专门监控输入。在Windows系统中,每个输入都作为一个消息,然后由消息处理机制传递给应用程序,以作相应处理。这个过程可以简述为:监听-分派-处理。其它系统也可能是这种机制。关于消息的处理机制你可以参考网上的关于“Windows消息处理机制”文章。我搜到一篇--
    “http://www.yesky.com/20030304/1655040.shtml”java采用事件驱动机制,事件驱动机制与消息处理机制有很深的渊源,我对这方面了解不多。事件驱动机制中的事件可分为系统触发和应用程序触发,你的问题就是一个系统触发的事件。Frame里有一个监听器队列,执行addWindowListener就是向该队列增加一个监听对象,这个所谓的监听对象实际上是事件处理器。系统把鼠标单击的消息传递给java程序,交由“X”button处理。这几步是由native代码实现的(也可能交给button之前,消息已转成事件)。button的处理程序又会触发Frame中的某个方法,该方法遍历监听器队列,调用其中每个element的windowClosing()方法,并把封装了的WindowEvent作为参数传递给该方法。
      

  3.   

    窗口是jvm调用os的底层画出来得,jvm负责检测其中的事件。事件发生时,jvm将事件交给上层,也就是api的实现层。在这一层,内部肯定保留有注册的listener的引用,然后依次调用listener的一堆方法,例如closing等。完毕
    你的程序只是最上层,当然不会什么都看的到
      

  4.   

    windows有一个消息队列,用户的每次操作都存放在这个消息队列中,时间监听器一但监听到自己负责的消失访问,就可以执行该消息对应的操作了。
      

  5.   

    to feijianxia(佳):
    Java是跨平台的,不要老用win的思维,消息机制应该是jvm层完成的
      

  6.   

    stamp80(峰 我要升星星)的回答我比较接受,Observer模式我
    也看过,JDK里Frame,Window一些的代码我也看了,只是没发现
    具体消息是如何获得和分发的,所以有此疑惑,看来要搞清楚
    这些,是要深入到JVM了,希望大家多多发言
      

  7.   

    UnAgain() 的回答比较细致,感谢
      

  8.   

    建议LZ去看看JDK里的源代码....
      

  9.   

    呵呵,毕竟俺也移植过java me的api,至少关于listener那块原来还是认真看过的:)