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上,
- <span style="white-space:pre"> </span> //注意这里 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!”
- }
- });
- }
- }