Java 注册监听器的方法总结(自身类this+外部类+内部类+匿名内部类+适配器Adapter+一个组件注册多个监听器)

Java 使用接口回调技术实现处理事件的过程,在Java中能触发事件源的对象,都调用addXXXListener(XXXListener  listener)方法将某个对象注册为自己的监听器,参数listener是个接口,listener可以引用任何实现了该接口的类的所创建的对象,当事件源发生时,接口listener 立刻回调类实现的接口方法(接口的实现类包含了接口方法和非接口方法,接口只能调用接口方法,不能调用非接口方法)。


以下是注册监听器的几种常用方法:

1.自身类(this作为监听器)

[java]  view plain  copy
 print ?
  1. package listener_This;  
  2. /* 
  3.  * 自身类作为事件监听器 
  4.  * 说明:点击按钮,程序退出 
  5.  */  
  6.   
  7. import java.applet.Applet;  
  8. import java.awt.event.ActionEvent;  
  9. import java.awt.event.ActionListener;  
  10. import javax.swing.JButton;  
  11. public class ThisClassEvent extends Applet implements ActionListener{  
  12.   
  13.     public  ThisClassEvent(){  
  14.         JButton jButton = new JButton("Exit");  
  15.         add(jButton);  
  16.         setVisible(true);         
  17.         jButton.addActionListener(this);   //将自身类作为事件监听器绑定到jButton上,  
  18.                     <span style="white-space:pre">  </span>   //注意这里 this 不能写成 new ThisClassEvent()   
  19.         }  
  20.   
  21.     @Override  
  22.     public void actionPerformed(ActionEvent e) {  
  23.         // TODO Auto-generated method stub  
  24.         System.exit(0);  //程序正常退出  
  25.     }  
  26. }  

2.外部类作为监听器

[java]  view plain  copy
 print ?
  1. package listener_Outer;  
  2. /* 
  3.  * 外部类作为事件监听器 
  4.  * 说明:创建外部监听器类OuterClassListener, 
  5.  *     将OuterClassListener的实例对象作为jButton的监听器 
  6.  * 注意:使用外部类是值得推荐的,其优点是可以处理事件的代码和创建GUI的代码分离, 
  7.  *     缺点是在监听器类中无法之间访问组件(外部类可以与主类可以在同一个源文件) 
  8.  */  
  9. import java.applet.Applet;  
  10. import javax.swing.JButton;  
  11.   
  12. public class OuterClassEvent extends Applet{  
  13.   
  14.   
  15.     public OuterClassEvent(){  
  16.         JButton jButton = new JButton("Exit");  
  17.         add(jButton);  
  18.         setVisible(true);         
  19.         jButton.addActionListener(new OuterCalssListener());//将OuterClassListener的实例对象作为jButton的监听器  
  20.     }  
  21. }  
[java]  view plain  copy
 print ?
  1. /***********外部类*************/  
[java]  view plain  copy
 print ?
  1. package listener_Outer;  
  2. import java.awt.event.ActionEvent;  
  3. import java.awt.event.ActionListener;  
  4. public class OuterCalssListener implements ActionListener{  
  5.   
  6.     @Override  
  7.     public void actionPerformed(ActionEvent e) {  
  8.         // TODO Auto-generated method stub  
  9.         System.exit(0);  
  10.     }  
  11.   
  12. }  

3.内部类作为监听器

[java]  view plain  copy
 print ?
  1. package listener_Inner;  
  2. /* 
  3.  * 内部类作为监听器 
  4.  * 说明:内部类作为监听器和外部类作为监听器在实现上并无太大差异,只是将监听器类定义在主类外部和内部的差别 
  5.  */  
  6. import java.applet.Applet;  
  7. import java.awt.event.ActionEvent;  
  8. import java.awt.event.ActionListener;  
  9. import javax.swing.JButton;  
  10.   
  11. public class InnerCalssEvent extends Applet{  
  12.   
  13.       
  14.     public InnerCalssEvent(){  
  15.         JButton jButton = new JButton("Exit");  
  16.         add(jButton);  
  17.         setVisible(true);         
  18.         jButton.addActionListener(new InnerClassListener());  //内部类InnerClassListener的对象作为监听器  
  19.     }  
  20.       
  21.     class InnerClassListener implements ActionListener{  
  22.   
  23.         @Override  
  24.         public void actionPerformed(ActionEvent e) {  
  25.             // TODO Auto-generated method stub  
  26.             System.exit(0);  
  27.         }  
  28.           
  29.     }  
  30.   
  31. }  


4.匿名内部类作监听器

[java]  view plain  copy
 print ?
  1. package listener_Anonymity;  
  2. /* 
  3.  * 匿名内部类作为监听器 
  4.  * 说明:匿名内部类的声明格式: 
  5.  *      new 接口()  | 父类构造器(参数) 
  6.  *      { 
  7.  *          //类体 
  8.  *      } 
  9.  *  
  10.  * 注意:一般 当事件处理方法public void actionPerformed(ActionEvent e) 
  11.  *  比较简单时用匿名内部类作为监听器,否则将影响程序的可读性 
  12.  */  
  13. import java.applet.Applet;  
  14. import java.awt.event.ActionEvent;  
  15. import java.awt.event.ActionListener;  
  16. import javax.swing.JButton;  
  17.   
  18. public class AnonymityClassEvent extends Applet{  
  19.   
  20.     public AnonymityClassEvent(){  
  21.         JButton jButton = new JButton("Exit");  
  22.         add(jButton);  
  23.         setVisible(true);         
  24.         jButton.addActionListener(  
  25.             new ActionListener(){  
  26.   
  27.             @Override  
  28.             public void actionPerformed(ActionEvent e) {  
  29.                 // TODO Auto-generated method stub  
  30.                 System.exit(0);  
  31.             }             
  32.         });   
  33.           
  34.     }  
  35. }  

5.适配器作为监听器

[java]  view plain  copy
 print ?
  1. package listener_Adapter;  
  2.   
  3. import java.awt.event.WindowAdapter;  
  4. import java.awt.event.WindowEvent;  
  5.   
  6. import javax.swing.JFrame;  
  7. /* 
  8.  * 事件适配器作监听器:当实现一个监听器接口时。必须实现接口中所有的方法,否则这个类就必须声明为abstract类。 
  9.  * 有些监听器接口里面的方法比较多,如WindowListener(可以查看API),但是实际应用时往往不用实现所有的方法, 
  10.  * 这就要用到适配器Adapter,Adapter实现了监听器接口里面的所有方法,但实际上方法体都为空。所以在实际应用时可以 
  11.  * 定义一个继承Adapter的类来作为监听器,而在这个继承Adapter的 类中,只需要实现所需的方法即可。 
  12.  *  
  13.  * 下面的程序使用适配器WindowAdapter作为监听器,仅仅处理窗口关闭事件(单击窗口上的关闭按钮,程序退出,并打印“Exit”) 
  14.  */  
  15.   
  16. public class ListenerAdapter extends JFrame{  
  17.       
  18.     public ListenerAdapter(String name){  
  19.         super(name);  //调用JFrame 的构造器  
  20.         //初始化GUI  
  21.         setBounds(100100200300);  
  22.         setVisible(true);  
  23.         addWindowListener(new MyAdapter() ); // 窗口注册监听器  
  24.     }  
  25.     //  
  26.     class MyAdapter extends WindowAdapter{  
  27.         //重写 windowClosing方法(WindowAdapter还实现了WindowListener的许多方法,这里只用到了windowClosing方法)  
  28.         @Override  
  29.         public void windowClosing(WindowEvent e) {  
  30.             // TODO Auto-generated method stub  
  31.             System.exit(0);  
  32.             System.out.println("Exit!");  
  33.         }  
  34.           
  35.     }  
  36.       
  37.     public static void main(String[] args){  
  38.      new ListenerAdapter("窗口适配器");  
  39.     }  
  40. }  


6.一个组件注册多个监听器

[java]  view plain  copy
 print ?
  1. package listener_More;  
  2. /*  
  3.  * 一个组件注册多个监听器,本程序用匿名内部类作为监听器  
[java]  view plain  copy
 print ?
  1.  *当该事件被触发是,多个监听器都会响应  
  2.  */  
  3. import java.applet.Applet;  
  4. import java.awt.Color;  
  5. import java.awt.event.ActionEvent;  
  6. import java.awt.event.ActionListener;  
  7.   
  8. import javax.swing.JButton;  
  9. public class MoreListener extends Applet{  
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = 1L;  
  14.   
  15.     public MoreListener(){  
  16.         JButton jButton = new JButton("Change to Black!");  
  17.         add(jButton);  
  18.         setVisible(true);     
  19.           
  20.         jButton.addActionListener(new ActionListener() {  
  21.               
  22.             @Override  
  23.             public void actionPerformed(ActionEvent e) {  
  24.                 // TODO Auto-generated method stub  
  25.                 setBackground(Color.black);  //背景变黑  
  26.             }  
  27.         });  
  28.               
  29.         jButton.addActionListener(new ActionListener() {  
  30.               
  31.             @Override  
  32.             public void actionPerformed(ActionEvent e) {  
  33.                 // TODO Auto-generated method stub  
  34.                 System.out.println("BLACK");  //向屏幕打印“BLACK!”  
  35.             }  
  36.         });  
  37.           
  38.     }  
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值