一、基本概念
回顾概念:
Container类表示容器,继承了Component类。容器存放别的组件,有两种类型的容器:Window和Panel。
Window是不依赖于其他组件而独立存在的容器。Window有两个子类:Frame和Dialog。Frame带有标题,可调整大小,Dialog可以移动,但是不能改变大小。
1.Awt JDK中提供AWT和Swing两个包。
2.GUI组件可以分为两大类:基本组件个容器,分别是java.awt.Component和java.awt.Container的直接或间接子类。
二、事件处理
事件:用户对组件的一个操作
事件源:发生事件的组件
事件处理器:某个java类中的负责处理事件的成员方法。
事件的分类:
1.按产生事件的物理操作和GUI自建的表现效果进行分类
MouseEvent:包括鼠标按下,释放等
WindowEvent:窗口最小化等等
ActionEvent:对应不是具体动作是一种语义。
2.按事件的性质分类
低级事件
语义事件(又叫高级事件)
事件监听器
1.一个事件监听器对象负责处理一类事件
2.一类事件的每一种发生情况,分别由事件检同期对象中的一个方法来具体处理。
3.在事件源和事件监听器对象中进行的约定的接口类,被称为事件监听器接口。
4.事件监听器接口类的名称与事件类的名称是相对应的,例如:MouseEvent事件类的监听器接口名为MouseListener。
5.处理发生在某个GUI组件上的XXXEvent接口的事件的某种情况,其事件处理的通用编写流程:
l 编写一个实现了XXXListener接口的事件监听器类;
l XXXListener类中用于处理该事件情况的方法中,编写处理代码;
l 调用组件的addXXXListener方法,将类XXXListener创建的实例对象注册到GDI组件上。
package testframe; import java.awt.Button; import java.awt.Frame; public class TestFrame { public static void main(String[] args) { Frame f=new Frame("ligang"); f.add(new Button("按钮")); f.setSize(300,300); f.setVisible(true); f.addWindowListener(new WindowListener());//注册 //f.dispose(); } }
|
package testframe; import java.awt.Window; import java.awt.event.WindowEvent; public class WindowListener implements java.awt.event.WindowListener { public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } public void windowClosing(WindowEvent e) {//关闭窗口 // e.getWindow().setVisible(false);//(1)哪个窗口调用,并隐藏,隐藏不等于真正的关闭。 // e.getSource();得到事件源 //((Window)e.getComponent()).dispose();//(2~1)强制转换成window类型,部件//没有dispose()方法,dispose()方法是窗口专用的,比如frame // e.getWindow().dispose();//(2)dispose是window类中的方法。 System.exit(0); //(3)结束程序 /*我们可以方法结束或者直接用System.exit(0)结束程序*/ /*getSource()方法 getComponent()方法和getWindow()方法*都是访问内存中的同一个对象只是返回的类型不一样,getWindow()是不需要强制类型转换,而其他的需要类型转换。*/ /*一般步骤:先隐藏窗口,在关闭窗口,然后在退出程序。以上的3个步骤*/ } public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } }
|
注意点:
部件没有dispose()方法,dispose()方法是窗口专用的,比如window,frame
我理解的过程:
1)TextFrame类中有Frame类声明并实例化的f对象。
2)f.addWindowListener(new WindowListener())//增加一个监听器【在Frame类中有从window类中继承过来的addWindowListener()方法】
3)在类WindowListener中实现public void windowClosing(WindowEvent e)方法。
4)编写方法体e.getWindow().dispose()【WindowEvent类中有getWindow()方法,getWindow()返回的是Window类型的,因为Window类中有dispose()这个方法】
对于上述(4)还可以写成((Window)e.getComponent()).dispose()【此时需要强制类型转换,因为在WindowEvent类中有从java.awt.event. ComponenEvent继承过来的getCompinent()方法,给类方法返回的是一个Component类型的对象,因为在ComponentEvent类中没有dispose()这个方法,所以必须强制转换成Window方法才能调用dispose()方法。】