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

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!”
			}
		});
		
	}
}


  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值