`
tzq668766
  • 浏览: 79392 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

CoreJava学习笔记10

阅读更多
awt事件模型(观察者模式)(重点)

事件模型中,包括事件源对象,事件处理者(事件监听者对象),事件对象。


事件源和事件处理者之间建立了授权关系,事件源类中有一个事件处理者的对象作为属性,也可能是一个事件处理者的集合。
      
         事件对象
事件源————————〉事件处理者

事件模型的机制,事件源对象发送一个消息(事件对象),事件处理者调用相应的方法处理事件。

事件监听器接口中定义的方法,都以事件对象为参数。

一个事件源可以注册多个同类型的监听器,也可以注册多种多个事件监听器,一个事件监听器也可以为多个事件源服务。

了解一下什么是发消息:A,B,C三个类,分别作为事件源,事件处理者,事件对象。在A类中有一个B类的属性或者是一个内容为B类对象的集合,事件源和事件处理者之间的建立了授权关系,在B类需要实现一个自定义的接口,这个自定义的接口继承了EventListener,EventListener接口中没有定义任何方法,EventListener是一个标记接口。实现在自定义接口中定义好的用于事件处理的方法,C类要继承EventObject类。这些方法是以事件对象为参数的b(C c),在A类a(C c)方法中使用B类的对象调用B类中的b(C c)方法,并把事件对象作为参数,并在main方法中用A类的对象调用了a(c)方法,叫做A类对象给B类发送了消息。

例:
public class Test{
	public static void main(String[] args){
		B bt=new B()
		A at=new A(bt);
		at.a(new c());
}
}
class A{
	private B b;
	public A(){}
	public A(B b){
		this.b=b;
}
public void a(C c){
	b.b(c);
}
}

class B{
	public void b(C c){
		System.out.println(“this is message ”+c.c())
	}
}

class C{
	public void c (){
		System.out.println(“C Object”);
}
}

事件源对象间接调用了事件监听器的方法,以事件对象为实参传到事件监听器的方法中,事件源给事件监听器的方法发了一个消息(事件对象)。

例子如下:
import java.util.*;
//事件源类
class A{
	private String test;
	private List li=new ArrayList();
	public A(String test){
		this.test=test;
	}
	public String getTest(){return this.test;}
	public void addB(B b){
		this.li.add(b);
	}
	public void removeB(B b){
		this.li.remove(b);
	}
	public void fire(){
		C c=new C(this);
		Iterator it=li.iterator();
		while(it.hasNext()){
			B b=(B)it.next();
			b.b(c);
		}
	} 	
}
//事件监听器的接口,要继承EventListener标记接口
interface Blistener extends EventListener{
	void b(C c);
}
//事件监听器,实现接口
class B implements Blistener{
	public void b(C c){
		A a=(A)c.getSource();
		System.out.println(a.getTest()+" "+c.getMessage());
	}
}
//事件对象类
class C extends EventObject{
	private String message;
	public C(Object src){
		super(src);
	}
	public void setMessage(String message){
		this.message=message;
	} 
	public String getMessage(){return this.message;}	
}
public class Test{
	public static void main(String[] args){
		A a1=new A("Event");
		B b1=new B();
		c1.setMessage("Test");
		a1.addB(b1);//注册监听器
		a1.fire();//发送事件
	}
}

以上代码只是事例,在引入包之后可以运行。

事件对象继承自EventObject类,并可以通过getSource()方法获得事件源对象,当然需要在构造事件对象时将事件源对象传入,来区分是哪个事件源发出的事件,所以要用事件对象作为参数。

事件源,事件对象,监听器接口,在java.awt包中提供了很多已经定义好的,只需要实现监听接口就好了。

在Java的图形编程中,所有动作(事件)都已经提供了相应的事件对象和事件监听接口,例如:实现窗口的关闭按钮,点击关闭按钮会发出相应的事件对象,相应的调用监听器中实现好的方法。相应的方法清参阅Java2 SE API帮助文档。

在图形界面中的添加事件监听的方法

1,组件是事件源,我们实现监听器借口
2,对组件调用addXXXListener()方法,把监听器注入进去。

在java.awt.event包中的ActionEvent类,在以下操作中会发送这个事件,
1,JButton组件,按钮被点击
2,JTextField组件,在单行文本域中按Enter键。
3,JCheckBox组件,选中了复选框。
4,JRadioButton组件,选中了单选按钮。
5,JMenu组件,选中菜单项。

例:
Xxx.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
							。。。。。。
            }
        });

缺省适配模式,通过一个抽象类实现接口,抽象类中的接口方法实现,都是一个无意义的空实现,可以继承这个抽象类,只覆盖想覆盖的方法。

注意:在java.awt.event包中,会有一些适配类,也就是把相应的XXXListener,换成XXXAdapter就是适配类。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics