窗口编程之面向事件编程-实例解释

本文深入讲解面向事件编程的三大步骤,通过具体实例演示如何使用匿名内部类和内部类实现监听器接口或适配器,对比不同实现方式的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗口编程之面向事件编程-实例解释

此处不解释面向事件编程的具体定义,以及其中涉及到的术语,类似事件源、事件处理,侦听器等概念,只介绍实现.

面向事件编程三大步骤:

此处若无法理解,请向下看例子
1.指定一个实现监听器接口的类(如下面的实现了WindonsListener的类),或者指定一个实现了监听器接口类的类(如下面的继承了WindowAdapter的类)。例如:

class AAA implement WindonsListener(){}
class AAA extends WindowAdapter(){}

2.将1中指定的类的实例注册到一个或多个组件作为监听器。例如:

jfrmStudentView.addWindowListener(Class);
addWindowListener()为上述注册的实际操作

3.实现监听器接口中的方法。例如:

public void windowClosing(WindowEvent e) {
closeView();
}

事件处理类分为两种情况(匿名内部类和内部类都可以实现下述两种情况):

  1. 实现监听器接口
  2. 实现继承了监听器接口的类(普通类),一般为适配器

一、匿名内部类:

1. 实现监听器接口

在在窗口添加一个Windows事件消息监听器。new了一个新的匿名内部类,实现的接口是WindonsListener,必须实现该接口的所有方法,其他方法都会自动调用super()

jfrmStudentView.addWindowsListener(new WindonsListener() {
	@Override
    public void windowOpened(WindowEvent e) {}
    @Override
    public void windowIconified(WindowEvent e) {}
    @Override
    public void windowDeiconified(WindowEvent e) {}
    @Override
    public void windowDeactivated(WindowEvent e) {}
    @Override
    public void windowClosed(WindowEvent e) {}
    @Override
    public void windowActivated(WindowEvent e) {}

    @Override
    public void windowClosing(WindowEvent e) {
        closeView();
    }
});
2.实现继承了监听器接口的类(普通类),一般为适配器

在窗口添加一个Windows事件消息监听器。new了一个新的匿名内部类,该类继承了WindowAdapter,是它的子类,作为一个子类,可以选择性的覆盖父类的方法

jfrmStudentView.addWindowListener(new WindowAdapter() {
	@Override
	public void windowClosing(WindowEvent e) {
		closeView();
	}
			
});

二、内部类:

1.实现监听器接口
jfrmStudentView.addWindowListener(new AAA());
class AAA implement WindonsListener() {

	public AAA() {}
    
    @Override
    public void windowOpened(WindowEvent e) {}
    @Override
    public void windowIconified(WindowEvent e) {}
    @Override
    public void windowDeiconified(WindowEvent e) {}
    @Override
    public void windowDeactivated(WindowEvent e) {}
    @Override
    public void windowClosed(WindowEvent e) {}
    @Override
    public void windowActivated(WindowEvent e) {}

    @Override
    public void windowClosing(WindowEvent e) {
        closeView();
    }
}
		
	
		
2.实现继承了监听器接口的类(普通类),一般为适配器
jfrmStudentView.addWindowListener(new AAA());
class AAA extends WindowAdapter(){
	public AAA() {}
	
	@Override
    public void windowClosing(WindowEvent e) {
        closeView();
    }
    
}

经过比较,明显使用适配器方式比直接使用接口更加方便,可以自由的选择需要覆盖的类,不必全部实现

下面给出另一个完整的例子,来说明整个操作:
下面这个例子有四个类,SomeClass,IMyListener(接口),MyListenerAdapter(适配器)和测试类

SomeClass类

public class SomeClass {
	private String message;
	
	public SomeClass() {}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
	//模仿计算机内部操作
	public void innerDoSomething(IMyListener listener) {
		System.out.println("执行一些innerDoSomething()本身要做的一些事!");
		listener.doSomething(message);
		listener.doOtherthing(message);
		System.out.println("再执行一些innerDoSomething()本身要做的一些其它事!");
	}
	
}

IMyListener接口类:

//监听器接口
public interface IMyListener {
	void doSomething(String message);
	void doOtherthing(String message);
}

MyListenerAdapter适配器类

package com.mec.about_listener.core;

//适配器类,实现了监听器接口
public class MyListenerAdapter implements IMyListener {
	@Override
	public void doSomething(String message) {
	}

	@Override
	public void doOtherthing(String message) {
	}

}

测试类

下面测试类中均使用了匿名内部类的方式
在本类中,成员some如同上面的jfrmStudentView,innerDoSomething相当于addWindowListener

public class Test {

	public static void main(String[] args) {
		SomeClass some = new SomeClass();
		some.setMessage("abcdefg");
			
		System.out.println("接口实现方式");
		some.innerDoSomething(new IMyListener() {
			@Override
			public void doSomething(String message) {
				System.out.println("这是doSomething()方法,其参数是:" + message);
			}
			
			@Override
			public void doOtherthing(String message) {
				System.out.println("这是doOtherthing()方法,其参数是:" + message);
			}
		});
		
		System.out.println("--------------------------------------");
		System.out.println("适配器实现方式");
		some.innerDoSomething(new MyListenerAdapter() {
			@Override
			public void doSomething(String message) {
				System.out.println(this instanceof IMyListener+/t判断适配器类是接口的子类”);
				System.out.println("[" + message + "]");
			}
			//另外一个方法doOtherthing未覆盖,又由于MyListenerAdapter()中此方法空操作,所以不会输出任何东西
			
		});
	}
	
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值