[疯狂Java笔记]事件处理:Java事件处理模型

1. Java事件处理三要素:

    1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;

    2) 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;

    3) 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;


2. 事件处理的机制:

    1) 首先事件是有不同的类别的,比如按钮单击、菜单项单击等事件就属于“动作事件”(Action Event),而关闭窗口、最小化窗口等事件就属于“窗口事件”(Window Event);

    2) 不同类型的事件需要用不同类型的监听器监听;

    3) 而监听器是一种类对象,这种类必须实现监听器接口(Listener),对于监听不同类型的事件AWT库准备了不同类型的监听器接口,比如要监听动作事件就必须实现ActionListener接口,监听窗口事件就必须实现WindowListener接口;

!监听器中最重要的就是事件处理方法了,监听器必须在接受事件之后进行处理(响应);

    4) 如何实现监听?

         i. 首先事件源(发生事件的组件)必须同意我身上发生的事件允许那些监听器监听;

         ii. 也就是说想监听它身上发生的事件的监听器必须到它这里注册,即组件必须调用方法addXxxListener将监听器注册到它的监听器列表中;

         iii. 当事件发生时就会将事件对象(Event)发送到所有注册过的监听器那里进行处理;

    5) 事件源、事件、监听器的对应关系:

         i. 首先一个事件源可以产生多种类型的事件,比如窗口右上角的×按钮,当单击它时就会产生两种类型的事件,一个是按钮单击事件(属于Action Event),另一个是窗口关闭事件(属于Window Event);

         ii. 监听器接口是什么类型就发送什么类型的事件:如果注册的监听器实现的是ActionEvent的接口,那么上述×按钮就只发送按钮单击事件给它而不会发送窗口关闭事件,除非监听器同时实现了两种类型的接口,那么该监听器就会同时受到两种类型的事件;

         iii. 一个事件源可以注册多个监听器:一般符合逻辑的编程思想就是不同监听器监听、处理不同类型的事件,因此对于可以产生多种类型事件的事件源会注册多种类型的监听器,分别负责处理产生的多种事件;

!!当然一个事件源也可以注册多个相同类型的监听器,即比对于同一个事件(按钮单击),事件源注册多个实现ActionListener接口的监听器,那么这些监听器都会受到该事件,可能会疑问,这不是多此一举吗?一种事件就给出一种处理不是很好吗?那是因为有些情况下可能需要一个事件触发多种动作,每个监听器负责实现一个动作;

         iv. 一个监听器可以监听多个事件源上的事件,即多个不同的组件用addXxxListener方法注册同一个监听器,那么当不同事件到来时监听器会调用其不同方法进行处理,或者在一个方法内部判断传进来的是什么事件,再进行特殊的处理;


3. 编写事件处理程序的基本流程:

    1) 首先需要实现监听器类:自己编写一个类,至少要实现一种类型的监听器接口,并实现接口中所有的事件处理方法;

    2) 创建组件,并对组件注册响应的监听器:首先需要创建监听器对象,将监听器对象作为参数传入组件的addXxxListener方法完成注册;

    3) 全部工作完成,事件的处理完全自动进行;

    4) 简单的示例:处理一个按钮的单击事件

public class AwtTest {

	Frame f = new Frame("Event Test");
	TextField tf = new TextField(30);
	Button ok = new Button("OK");
	
	class OkListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			System.out.println("OK button pushed!");
			tf.setText("Hello!");
		}
		
	}
	
	public void init() {
		f.add(tf);
		f.add(ok, BorderLayout.SOUTH);
		
		ok.addActionListener(new OkListener());
		
		f.pack();
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		
		new AwtTest().init();
	}

}
!!完全按照讲述的顺序进行;

!直接设置编辑框内文本的方法:void TextField.setText(String text);


4. 事件源-监听器多对多示例:

public class AwtTest {

	Frame f = new Frame("Multiple Event Test");
	TextArea ta = new TextArea(6, 40);
	
	Panel p = new Panel();
	Button btn1 = new Button("button1");
	Button btn2 = new Button("button2");

	class Listener1 implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			ta.append("Listener1 be activated! Event Source:" + e.getActionCommand() + "\n");
		}

	}

	class Listener2 implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			ta.append("Listener2 be activated! Event Source:" + e.getActionCommand() + "\n");
		}

	}

	public void init() {
		f.add(ta);
		p.add(btn1);
		p.add(btn2);
		f.add(p, BorderLayout.SOUTH);
		
		Listener1 l1 = new Listener1();
		Listener2 l2 = new Listener2();
		
		btn1.addActionListener(l1);
		btn2.addActionListener(l1);
		btn2.addActionListener(l2);
		
		f.pack();
		f.setVisible(true);
	}

	public static void main(String[] args) {

		new AwtTest().init();
	}

}
!可以看到按钮2可以同时触发两个监听器,输出两条消息,而监听器1同时监听并处理了两个按钮的消息;


你可能感兴趣的:(疯狂Java笔记)