在Swing事件模型中由三个分离的对象完成对事件的处理,分别为事件源、事件以及监听程序。事件源触发一个事件,它被一个或多个“监听器”接收,监听器负责处理事件,监听器也就是事件处理对象。
所谓事件监听器,实质上就是一个“实现特定类型监听器接口”的类对象。具体地说,事件几乎都以对象来表示,它是某种事件类的对象,事件源(如按钮)会在用户作出相应的动作(如按钮被按下)时产生事件对象,如动作事件对应ActionEvent类对象,同时需要编写一个监听器的类必须实现相应的接口,如ActionEvent类对应的是ActionListener接口,需要获取某个事件对象就必须实现相应的接口,同时需要将接口中的方法一一实现。最后事件源(按钮)调用相应的方法加载这个'实现特定类型监听器接口"的类对象,这样就可以为组件添加或移除相应的事件监听器。
下面,我们介绍一个具体事例,这个实例是这样的,当我们按下“黑色”按钮时,窗体背景显示的是黑色;当我们按下“红色”按钮时,窗体背景显示的是红色。如图所示:
在这个实例中,两个按钮是事件源,我们要将这个事件类实现相应的接口ActionListener,我们把接口的处理方法根据需要重写,即按下黑色按钮显示黑色,按下红色按钮显示红色。并在两个按钮上注册监听。代码如下:
/*
*功能:讲解事件处理机制
*第34讲
*按下按钮改变颜色
* */
package com.test3;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo9_3 extends JFrame implements ActionListener{
//定义一个Panel
JPanel mp=null;
//定义两个按钮
JButton jb1=null;
JButton jb2=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo9_3 demo9_3=new Demo9_3();
}
public Demo9_3()
{
mp=new JPanel();
jb1=new JButton("黑色");//按钮显示的内容为“黑色”
jb2=new JButton("红色");//按钮显示的内容为“红色”
this.add(jb1,BorderLayout.NORTH);//设定jb1在窗体的顶端
mp.setBackground(Color.BLACK);//把面板mp的背景设置为黑色
this.add(mp);//把mp加入到JFrame中
this.add(jb2,BorderLayout.SOUTH);//把jb2放置在窗体的底端
Cat myCat1=new Cat();
//注册监听
jb1.addActionListener(this);
//从jb1.addActionListener(myCat1),就可以推出
//事件源对象是jb1,事件监听对象就是myCat1
jb1.addActionListener(myCat1);
//指定action命令
jb1.setActionCommand("aa");
//注册监听
jb2.addActionListener(this);
jb2.addActionListener(myCat1);
//指定action命令
jb2.setActionCommand("bb");
this.setSize(200, 150);//设置窗体大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
//对事件处理的方法
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//判断是哪个按钮被点击
if(e.getActionCommand().equals("aa"))
{
System.out.println("你点击黑色按钮");
mp.setBackground(Color.black);
}else if(e.getActionCommand().equals("bb"))
{
System.out.println("你点击红色按钮");
mp.setBackground(Color.red);//把面板mp的背景换成红色
}else
{
System.out.println("不知道");
}
}
}
//任何一个类,只要他实现了 相应的接口,就可以去监听事件源
class Cat implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("aa"))
{
System.out.println("猫猫也知道你按下黑色按钮");
}
else if(e.getActionCommand().equals("bb"))
{
System.out.println("猫猫也知道你按下红色按钮");
}
}
}
/*
* 1.一个类要实现监听的步奏
* a.实现相应的接口[KeyListener,MouseListener,ActionListener,WindowListener]
* b.把接口的处理方法根据需要重新编写(Override)
* c.在事件源上注册监听
* d.事件传递是靠事件对象的
*/