下面是一个很简单的窗口程序,注册了一个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);
}
});
}
}
实现了一个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);
}
});
}
}
但可以给楼主一个建议,去学习一个Design Pattern中Observer Pattern(观察者模式),你就会明白其中的机制了。
我建议你搜索“消息处理机制”和“事件处理机制”。下面是我写的,太乱,也有不准确的地方,仅供参考。----------------------------------------
我们所谓的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作为参数传递给该方法。
你的程序只是最上层,当然不会什么都看的到
Java是跨平台的,不要老用win的思维,消息机制应该是jvm层完成的
也看过,JDK里Frame,Window一些的代码我也看了,只是没发现
具体消息是如何获得和分发的,所以有此疑惑,看来要搞清楚
这些,是要深入到JVM了,希望大家多多发言