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

来源:互联网 发布:淘宝卖家月退款金额 编辑:程序博客网 时间:2024/05/22 03:46

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() }@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.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{@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.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{@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.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(){@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.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 的构造器//初始化GUIsetBounds(100, 100, 200, 300);setVisible(true);addWindowListener(new MyAdapter() ); // 窗口注册监听器}//class MyAdapter extends WindowAdapter{//重写 windowClosing方法(WindowAdapter还实现了WindowListener的许多方法,这里只用到了windowClosing方法)@Overridepublic void windowClosing(WindowEvent e) {// TODO Auto-generated method stubSystem.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubsetBackground(Color.black);  //背景变黑}});jButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.out.println("BLACK");  //向屏幕打印“BLACK!”}});}}


原创粉丝点击