第四节:事件处理
一个图形界面完的成只是程序开发中起步的工作,因为要想让每一个组件都发挥其作用,就必须对所有的组件进行事件处理。那么什么是事件处理,所谓事件就表示一个对象发生状态变化。例如,每当按下一个按钮时,实际上按钮的状态就发生了变化,而如果要想处理此事件,就需要监听者不断地进行监听事件的变化,并根据时间进行相应的处理。事件要想被处理,必须使用事件监听器,所有的事件监听器都是以接口的形式出现的,处理时只要实现此接口就行。整个事件处理流程如下图所示:
下面通过几个事件来进一步说明事件的处理流程。
窗体事件
WindowsListener是专门处理窗体的事件监听接口,一个窗体的所有变化,如窗体的打开,关闭等都可以使用这个接口进行监听。此接口定义的方法如下:
public void windowOpened(WindowEvent e)//窗口打开时触发
public void windowClosing(WindowEvent e)//窗口正在关闭时触发
public void windowIconified(WindowEvent e)//窗口最小化时触发
public void windowDeiconified(WindowEvent e)//窗口从最小化恢复到正常状态时触发
public void windowActivated(WindowEvent e)//将窗口变为活动窗口时触发
public void windowDeactivated(WindowEvent e)//将窗口变为不活动窗口时触发
建立一个监听器
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class MyWindowEventHandle implements WindowListener{
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowOpened-->窗口被打开");
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowClosing-->窗口关闭");
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowClosed-->窗口被关闭");
System.exit(1);//系统退出
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowIconifed-->窗口最小化");
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowDeiconified-->窗口最小化恢复");
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowActivated-->窗口被选中");
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("windowDeactivated-->窗口被选中");
}
}
单单只有一个监听器是不够的,还需要在组件上注册监听,这样才可以处理,直接使用窗体的addWindowListener(监听对象)方法即可注册。
import java.awt.Color;
import javax.swing.JFrame;
public class MyWindowEventJFrame01 {
public static void main(String args[]){
JFrame jFrame=new JFrame("Welcome to MichaelLee!");
//将此窗口加入到一个窗口监听器中,这样监听器就可以根据时间进行处理
jFrame.addWindowListener(new MyWindowEventHandle());
jFrame.setSize(400,300);
jFrame.setBackground(Color.black);
jFrame.setLocation(500,300);
jFrame.setVisible(true);
}
}
程序运行结果:
windowActivated-->窗口被选中
windowOpened-->窗口被打开
windowIconifed-->窗口最小化
windowDeactivated-->窗口被选中
windowDeiconified-->窗口最小化恢复
windowActivated-->窗口被选中
windowClosing-->窗口关闭
windowDeactivated-->窗口被选中
程序运行后会显示一个窗体,此时对窗体进行相应的状态变化,则在后台会打印出以上的信息。
监听适配器:
大致了解事件处理的基本流程后,大家可能会有这样一个疑问,如果现在只需对关闭窗口的事件进行监听,其他的操作根本就不关心,那末还有必要覆写那么多的方法吗?能不能只根据个人的需要来进行覆写?答案是肯定的。要想解决这个问题,可以使用Adapter(适配器)类。以WindowAdapter为例,用户只要继承了此类,就可以根据自己的需要覆写方法。比如现在我们只关心关闭窗口和打开窗口。
通过WindowAdapter实现监听
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyWindowAdapterHandler extends WindowAdapter{
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
super.windowOpened(e);
System.out.println("窗口被打开!");
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
super.windowClosed(e);
System.out.println("窗口关闭!");
}
}
注册事件监听
import java.awt.Color;
import javax.swing.JFrame;
public class MyWindowEventJFrame02 {
public static void main(String args[]){
JFrame jFrame=new JFrame("Welcome to MichaelLee!");
jFrame.addWindowListener(new MyWindowAdapterHandler());
jFrame.setSize(500,400);
jFrame.setLocation(300,400);
jFrame.setBackground(Color.BLUE);
jFrame.setVisible(true);
}
}
程序运行结果:
窗口被打开!
窗口关闭!
此时只监听窗口被打开以及被关闭事件,但是这样一来又会出现一个新的问题,如果此监听处理只需操作一次,那末就没必要将其设置成一个单独的类,此时就可以利用匿名内部类来完成。
使用匿名内部类:
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
public class MyWindowEventJframe03 {
public static void main(String args[]){
JFrame jFrame=new JFrame("Welcome to MichaelLee!");
//此时直接使用WindowAdapter的子类完成监听的处理
jFrame.addWindowListener(new WindowAdapter() {
//覆写窗口的关闭方法
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
super.windowOpened(e);
System.out.println("窗口被打开!");
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
super.windowClosed(e);<