Java 使用接口回调技术实现处理事件的过程,在Java中能触发事件源的对象,都调用addXXXListener(XXXListener listener)方法将某个对象注册为自己的监听器,参数listener是个接口,listener可以引用任何实现了该接口的类的所创建的对象,当事件源发生时,接口listener 立刻回调类实现的接口方法(接口的实现类包含了接口方法和非接口方法,接口只能调用接口方法,不能调用非接口方法)。
以下是注册监听器的几种常用方法:
1.自身类(this作为监听器)
package listener_This;
/*
* 自身类作为事件监听器
* 说明:点击按钮,程序退出
*/
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class ThisClassEvent extends Applet implements ActionListener{
public ThisClassEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(this); //将自身类作为事件监听器绑定到jButton上,
//注意这里 this 不能写成 new ThisClassEvent()
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0); //程序正常退出
}
}
2.外部类作为监听器
package listener_Outer;
/*
* 外部类作为事件监听器
* 说明:创建外部监听器类OuterClassListener,
* 将OuterClassListener的实例对象作为jButton的监听器
* 注意:使用外部类是值得推荐的,其优点是可以处理事件的代码和创建GUI的代码分离,
* 缺点是在监听器类中无法之间访问组件(外部类可以与主类可以在同一个源文件)
*/
import java.applet.Applet;
import javax.swing.JButton;
public class OuterClassEvent extends Applet{
public OuterClassEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(new OuterCalssListener());//将OuterClassListener的实例对象作为jButton的监听器
}
}
/***********外部类*************/
package listener_Outer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class OuterCalssListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
}
3.内部类作为监听器
package listener_Inner;
/*
* 内部类作为监听器
* 说明:内部类作为监听器和外部类作为监听器在实现上并无太大差异,只是将监听器类定义在主类外部和内部的差别
*/
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class InnerCalssEvent extends Applet{
public InnerCalssEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(new InnerClassListener()); //内部类InnerClassListener的对象作为监听器
}
class InnerClassListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
}
}
4.匿名内部类作监听器
package listener_Anonymity;
/*
* 匿名内部类作为监听器
* 说明:匿名内部类的声明格式:
* new 接口() | 父类构造器(参数)
* {
* //类体
* }
*
* 注意:一般 当事件处理方法public void actionPerformed(ActionEvent e)
* 比较简单时用匿名内部类作为监听器,否则将影响程序的可读性
*/
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class AnonymityClassEvent extends Applet{
public AnonymityClassEvent(){
JButton jButton = new JButton("Exit");
add(jButton);
setVisible(true);
jButton.addActionListener(
new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
}
}
5.适配器作为监听器
package listener_Adapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/*
* 事件适配器作监听器:当实现一个监听器接口时。必须实现接口中所有的方法,否则这个类就必须声明为abstract类。
* 有些监听器接口里面的方法比较多,如WindowListener(可以查看API),但是实际应用时往往不用实现所有的方法,
* 这就要用到适配器Adapter,Adapter实现了监听器接口里面的所有方法,但实际上方法体都为空。所以在实际应用时可以
* 定义一个继承Adapter的类来作为监听器,而在这个继承Adapter的 类中,只需要实现所需的方法即可。
*
* 下面的程序使用适配器WindowAdapter作为监听器,仅仅处理窗口关闭事件(单击窗口上的关闭按钮,程序退出,并打印“Exit”)
*/
public class ListenerAdapter extends JFrame{
public ListenerAdapter(String name){
super(name); //调用JFrame 的构造器
//初始化GUI
setBounds(100, 100, 200, 300);
setVisible(true);
addWindowListener(new MyAdapter() ); // 窗口注册监听器
}
//
class MyAdapter extends WindowAdapter{
//重写 windowClosing方法(WindowAdapter还实现了WindowListener的许多方法,这里只用到了windowClosing方法)
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
System.out.println("Exit!");
}
}
public static void main(String[] args){
new ListenerAdapter("窗口适配器");
}
}
6.一个组件注册多个监听器
package listener_More;
/*
* 一个组件注册多个监听器,本程序用匿名内部类作为监听器
*当该事件被触发是,多个监听器都会响应
*/
import java.applet.Applet;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class MoreListener extends Applet{
/**
*
*/
private static final long serialVersionUID = 1L;
public MoreListener(){
JButton jButton = new JButton("Change to Black!");
add(jButton);
setVisible(true);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
setBackground(Color.black); //背景变黑
}
});
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("BLACK"); //向屏幕打印“BLACK!”
}
});
}
}