码迷,mamicode.com
首页 > 编程语言 > 详细

JavaSE学习56:GUI编程之事件模型(一)

时间:2016-06-21 06:44:41      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

        一事件概述

       事件监听示意图:

技术分享

       (1)事件

       用户对程序的某一种功能性操作。Java中的事件类都包含在JDK的Java.awt.event包中。

       Java中的事件主要有两种: 

       1)组件类事件:componentEvent、ContainerEvent、WindowEvent、FocusEvent、PaintEvent、MouseEvent共

六大类, 它们均是当组件的状态发生变化时产生。 

       2)动作类事件:ActionEvent、TextEvent、AdjustmentEvent、ItemEvent共四类。 它们均对应用户的某一种功能

性操作动作。 

       (2)事件编程 

       用户编程定义每个特定事件发生时程序应做出何种响应,并且这些响应代码会在对应的事件发生时由系统自动调

用。 

       (3)事件委托授权处理模型

       JDK1.1以上版本实现了事件委托授权处理模型的机制。 

       1)事件源:产出事件的组件。 

       2)监听器:对组件所产生的事件作出具体响应的代吗,即事件产出与处理分别由两个不同类(它们可以分别放在不

同的程序中)加以编程实现。 

       3)事件处理机制:AWT组件自身不编程处理相应的事件,面是交由事件监听器(它可以是组件所在的容器类或另外

的Java程序类,只要它们实现了相关的事件监听器接口即可)处理(事件授权处理模型)。

       4)事件处理的包

       java.awt.event包,它提供AWT事件所需的类和接口

       ActionEvent类对应ActionListener接口; 

       MouseEvent类对应MouseMotionListener接口和MouseListener接口; 

       WindonEvent类对应WindonListener接口---即发生了XXXEvent类型的事件,那么处理该事件的接口为

XXXListener);它们的父类为EventObject类。

       各个事件类的说明:

       EventObject:所有事件类的超类 

       最重要的方法-- getSource(),返回产生某事件的对象 

       AWTEvent:所有AWT事件类的超类 

       最重要的方法-- getID(),返回某事件的ID号,事件的ID是一个整数,它指定事件的类型,例如按钮事件或鼠标点

击事件 

       ActionEvent:激活组件时发生的事件

       AdjustmentEvent:调节可调整的组件(如移动滚动条)时发生的事件 

       ComponentEvent:操纵某组件时发生的一个高层事件 

       ContainerEvent:向容器添加或删除组件时发生 

       InputEvent:由某输入设备产生的一个高层事件 

       ItemEvent:从选择项,复选框或列表中选择时发生 

       KeyEvent:操作键盘时发生 

       MouseEvent:操作鼠标时发生 

       PaintEvent:描绘组件时发生的一个事件

       TextEvent:更改文本时发生 

       WindowEvent:操作窗口时发生的事件,如最大化或最小化某一窗口。 

       (5)事件编程的基本原则

       事件处理的类代码要对某一类事件加以处理,则应实现它们所对应的接口,并且给出该接口中定义的全部事件响

应函数的功能实现(重写其函数体);然后在创建组件时注册该事件的监听器(响应者)。 

       (6)事件注册

      事件源通过对特定的事件进行注册,以指定该事件的监听器(响应者)是谁。 

       (7)事件注册函数

       函数名由“add + 事件类型对应的监听器接口名称”组成;函数参数为监听器对象(实现事件响应 的类的对象,如容

器组件自身响应该事件,则监听器对象应用this代表)。 

public void add<listenerType>(<listenerType> ListenerObj) {
       //函数体
 }

       (8)事件编程步骤

       1)实现某一事件的监听器接口(定义事件处理类并实现监听器接口)。 

       2)在事件处理类中重写(实现)其事件处理的函数体。 

       3)在创建AWT组件时注册事件处理代码以指定该事件的监听器(响应者)是谁。

       二ActionEvent类和ActionListener接口

       (1)ActionEvent类

       ActionEvent指示发生了组件定义的动作的语义事件。当特定于组件的动作(比如被按下)发生时,由组件(比如

 Button)生成此高级别事件。事件被传递给每一个ActionListener对象,这些对象是使用组件的addActionListener()方法

注册的,用以接收这类事件。

       实现ActionListener接口的对象在发生事件时获取此ActionEvent。因此,侦听器不必处理个别鼠标移动和鼠标单

击的细节,而是可以处理像“按下按钮”这样的“有意义”(语义)事件。

       ActionEvent类的构造方法和方法:

技术分享
       (2)ActionListener接口

       用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组

件的addActionListener()方法向该组件注册。在发生操作事件时,调用该对象的actionPerformed()方法。 

       ActionListener接口只有一个方法:

技术分享

       实例代码:

       TestActionEvent.java源代码:

import java.awt.*;
import java.awt.event.*;

/*  范例名称:Java事件处理举例
 *  源文件名称:TestActionEvent.java
 *  要  点:
 *  1. Java事件处理机制
 *  2. 事件源、事件监听器概念及作用
 *  3. 如何在一个现有组件上注册监听器
 */
public class TestActionEvent{
    public static void main(String args[]){
		Frame f = new Frame("Java窗口");
		Button b = new Button("点击我!");
		Monitor bh = new Monitor();

		b.addActionListener(bh);
		f.add(b,BorderLayout.CENTER);
		f.pack();
		f.setVisible(true);
    }
}

class Monitor implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("a button has been pressed");    
    }
}

       运行结果:

技术分享

       TestActionEvent2.java源代码:

import java.awt.*;
import java.awt.event.*;

/*	范例名称:Java事件处理举例
 * 	源文件名称:TestActionEvent2.java
 *	要  点:
 *  	1. 一个事件源组件上可以同时注册多个监听器
 *	2. 一个监听器对象可以同时注册到多个事件源组件上
 *	3. 事件源的信息可以随它所触发的事件自动传递到所有注册过的监听器
 */
public class TestActionEvent2{
    public static void main(String args[]){
	        Frame f = new Frame("Java窗口");
		
		Button b1 = new Button("开始");
		Button b2 = new Button("结束");
		Monitor2 bh = new Monitor2();
		
                //一个监听器对象监听了两个按钮对象
		b1.addActionListener(bh);       
		b2.addActionListener(bh);
		b2.setActionCommand("game over");
		
		f.add(b1,"North");       
		f.add(b2,"Center");	
		f.pack();        		
		f.setVisible(true);
    }
}

class Monitor2 implements ActionListener{
    public void actionPerformed(ActionEvent e){
    	System.out.println("被点击," + "我是: " + e.getActionCommand());    
	}
}

       运行结果:

技术分享

       三TextFiled类

       java.awt.TextFiled类用来创建文本框对象。TextField对象是允许编辑单行文本的文本组件。

      TextFiled类的构造方法:

技术分享

      TextFiled类的常用方法:

技术分享

技术分享

技术分享

技术分享

      TextFiled对象可能发生Action(光标在文本框内敲回车)事件。与该事件对应的事件类是

java.awt.event.ActionEvent。

       用来处理ActionEvent事件是实现了java.awt.event.ActionListener接口的类的对象。ActionListener接口定义有方

法:

public void actionPerformed(ActionEvent e){
     //方法体
}

       实现该接口的类要在该方法中添加处理该事件(Action)的语句。

       使用addActionListener(ActionListener l)方法为TextFiled对象注册一个ActionListener对象,当TextFiled对象发生

Action事件时,会生成一个ActionEvent对象,该对象作为参数传递给ActionListener对象的actionPerformed()方法在方

法中可以获取该对象的信息,并做相应的处理。 
       实例代码:

       TFActionEvent.java源代码:

import java.awt.*;
import java.awt.event.*;

public class TFActionEvent{
	public static void main(String[] args){
		new TFFrame();
	}
}

class TFFrame extends Frame{
	//构造方法
	TFFrame(){
		TextField tf = new TextField();
		add(tf);
		tf.addActionListener(new TFActionListener());
		pack();
		setVisible(true);
	}
}

class TFActionListener implements ActionListener{
	public void actionPerformed(ActionEvent e){
		TextField tf = (TextField)e.getSource();
		System.out.println(tf.getText());
		tf.setText("");
	}
}

       运行结果:

技术分享

       TFPassword.java源代码:

import java.awt.*;
import java.awt.event.*;

public class TFPassword {
	public static void main(String[] args) {
		new TFFrame2();
	}
}

class TFFrame2 extends Frame{
	TFFrame2(){
		TextField tf = new TextField();
		add(tf);
		tf.addActionListener(new TFActionListener2());
		//设置回显字符
		tf.setEchoChar('*');
		pack();
		setVisible(true);
	}
}

class TFActionListener2 implements ActionListener{
	public void actionPerformed(ActionEvent e){
		TextField tf = (TextField)e.getSource();
		System.out.println(tf.getText());
		tf.setText("");
	}
}

       运行结果:

技术分享

       上述



JavaSE学习56:GUI编程之事件模型(一)

标签:

原文地址:http://blog.csdn.net/erlian1992/article/details/51723386

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!