窗口编程之面向事件编程-实例解释
此处不解释面向事件编程的具体定义,以及其中涉及到的术语,类似事件源、事件处理,侦听器等概念,只介绍实现.
面向事件编程三大步骤:
此处若无法理解,请向下看例子
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. 实现监听器接口
在在窗口添加一个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()中此方法空操作,所以不会输出任何东西
});
}
}
运行结果: