Java语言中的事件及其处理.doc_第1页
Java语言中的事件及其处理.doc_第2页
Java语言中的事件及其处理.doc_第3页
Java语言中的事件及其处理.doc_第4页
Java语言中的事件及其处理.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java语言中的事件及事件处理在GUI界面程序中,为了使程序能够接收用户的命令,系统应该能够识别这些鼠标和键盘的操作(事件)并做出响应。在此将讨论事件的产生和响应。8.1 事件处理通常每一个键盘或鼠标操作会引起一个系统预先定义好的事件,程序只需要定义每个特定事件发生时应该做出的响应。在Java中,除了键盘和鼠标操作外,系统的状态改变、标准图形界面元素等都可以引发事件。8.1.1 事件事件处理对GUI界面的程序设计是必不可少的。程序等候用户执行一些操作,用户通过GUI界面控制程序执行操作的顺序。例如,在例7.3中创建了一个选课的GUI界面,使用鼠标选中所要的课程之后,单击按钮执行按钮事件处理程序,将选中的课程在文本框中显示。这种方法就称为事件驱动程序设计。1. 事件组件一个事件包含以下3个组件:(1) 事件对象在Java中,每一个事件(Event)都是对象。Java.util.EventObjrct是所有事件对象的根类。这里只介绍的事件对象只属于其中的一类。这一类事件对象的根类是java.awt.AWTEvent,它是EventObject的直接子类。从名称上可以看出这一类事件对象都是与用户界面有关的。在java的定义中,每一个事件对象都有其事件发起者和事件使用者。事件发起者对应了将要介绍的事件源,而事件使用者对应事件监听器。同时,为了在使用事件时能够访问到事件源,在每一个事件对象中都保存了一个指向事件源的引用。由于用户对组件的操作有所不同,因此java为这些不同类型的操作定义了相应的事件:当用户通过按键或单击鼠标与应用程序交互时,一个事件便产生了。操作系统捕获该事件及与其相关的数据,例如,事件发生的时间和事件类型(按键、单击鼠标)。然后,数据被传递给事件所属的应用程序处理。(2) 事件源顾名思义,事件源就是事件的源头,即事件产生的地方。Java中的事件源种类很多,在此介绍的事件源指的是组件。事件源是产生事件的对象。例如,单击一个命令按钮时,就会生成一个ActionEvent对象。ActionEvent对象包含有事件的信息。(3) 事件处理程序事件处理程序就是处理事件的代码(方法)。它将事件对象作为一个参数接收过来。2. 事件模型Java处理事件有两种模型:基于继承的事件模式和基于代理的事件模型。(1) 承的事件模式在AWT1.0中,为了让程序俘获并处理GUI事件,必须扩展GUI组件并覆盖action()方法或handleEvent()方法。如果从这些方法中返回true,则将捕获事件;否则,将在GUI层中继续向上传播该事件,直到事件被捕获或到最顶层为止。这种模型的主要缺点是事件必须由启动事件或它的容器的组件处理,这和面向对象程序设计的标准不同,它们的机能必须驻留在适当的类中;另一个缺点是在通过容器的分层结构上传递不重要的事件,而无法忽略它,造成CPU资源的浪费。(2) 基于代理的事件模型现在处理事件的方法是基于授权事件模型(Delegation Event Model)的,这种模型定义了标准一致的机制去产生和处理事件。它的概念十分简单:一个源(Source)产生一个事件(Event),并把它送到一个或多个监听器(Listener)。在这种方案中,监听器简单地等待,直到它收到一个事件。一旦事件被接收,监听器将处理这些事件,然后返回。这种设计的优点是:处理事件的应用程序可以明确地和用来产生事件的用户接口程序分开。一个用户接口程序可以授权一段特定的代码处理一个事件。在授权事件模型中,监听器为了接受一个事件通知而必须注册。这样有一个重要的好处:通知只被发送给哪些想接受它们的监听器。这是一种比JDK1.0版本设计的方法更有效的处理事件的方法。以前,一个事件按照封装的层次被传递,直到它被一个组件处理。这需要组件接受哪些它们不处理的事件,所以浪费了宝贵的时间,而授权事件模型则避免了这个开销。在AWT1.1版本的JDK中,对原来的事件模型进行了改进,采用了基于代理的方式。在该模型中,当一个特定事件发生时,必须指定被通知对象,即事件处理是从一个事件源授权到一个或者多个事件监听器。如果事件与监听器之间没有关系,它被丢失。这种代理模型是基于事件类、事件监听、事件处理和适配器4个组件。【例8.1】在一个框架中加入一个命令按钮,当用户单击按钮时,即发生了一个单击事件,这时按钮上的文本被改变。import javax.swing.*;import java.awt.event.*;class ButtonEventDemo extends JFrameJButton btn;public ButtonEventDemo()/构造函数super(Window Title);btn=new JButton(Click here);getContentPane().add(Center,btn);ButtonListener Listen=new ButtonListener();btn.addActionListener(Listen);setSize(200,300);setVisible(true);setDefaultCloseOperation(EXIT_ON_CLOSE);class ButtonListener implements ActionListenerpublic void actionPerformed(ActionEvent e)JButton source=(JButton)e.getSource();source.setText(Button clicked);public static void main(String args)new ButtonEventDemo();例8.1 程序运行界面该应用程序是任何工作的呢?从main()方法开始执行,在main()方法中创建ButtonEventDemo类的对象:(1) super()方法调用基类(Frame)的构造方法、并设置窗口标题;(2) 创建按钮对象,并将其放在窗口中间;(3) 创建监听者对象;(4) 执行按钮的addActionListener()方法注册按钮的监听对象;(5) setVisible()方法显示窗口。对象创建之后,显示用户界面,应用程序等待用户与其交互。当用户单击按钮时:(1) 产生ActionEvent事件,创建ActionEvent对象并将其授权给注册监听对象处理;(2) 监听对象调用actionPerformed()方法,它处理ActionEvent事件;(3) 在actionPerformed()方法中,用getSource()方法检索对事件源的引用;用setText()方法改变按钮的标签。第9章 图形用户界面(GUI)设计9.1 图形用户界面(GUI)设计概述9.1.1 GUI支持包和简单GUI程序举例1. Java.awt包Java语言在java.awt 包中提供了大量进行GUI设计所使用的类和接口,包括绘制图形、设置字体和颜色、控制组件、处理事件等内容,AWT是java语言进行GUI程序设计的基础。Java.awt包中主要的类及其层次关系如下所示:Java所有类的超类Java.lang.Object字体类Font颜色类Color图形类Graphics组件类Component文本组件类Label单行文本组件类Button单行文本组件类TextComponentTextField单行文本组件类多行文本组件类TextAreaList列表类容器类Container面板类Panel小程序类Applet窗口类Window框架类Frame对话框类Dialog单选按钮与复选按钮类CheckboxCheckboxGroup按钮组合类MenuComponent菜单组件类菜单项类MenuItem菜单条类MenuBar流式布局管理类FlowLayoutBorderLayout边界布局管理类2. Javax.swing包Swing包是java基础类库(Java Foundation classes,JFC)的一部分。Swing提供了从按钮到可分拆面板和表格的所有组件。Swing组件是Java语言提供的第二代GUI设计工具包,它以AWT为基础,在AWT内容的基础上新增或改进了一些GUI组件,使得GUI程序功能更强大,设计更容易、更方便。“Swing”是开发新组件的项目代码名,现在,这个名字常用来引用新组件和相关的API。Swing包首先出现在JDK1.1中。以前的版本中使用AWT组件,在现在新的Java版本中仍然支持AWT组件,但几乎所有的AWT组件都有对应的新的、功能更强的Swing组件,所以现在开发GUI程序时,一般建议用Swing组件代替AWT组件。AWT组件和对应的Swing组件,从名称上很容易记忆和区别。例如,WAT的框架类、面板类、按钮类和菜单类,被命名为Frame、Panel、Button和menu,而Swing对应的组件类被命名为JFrame、JPanel、JButton和Jmenu。与AWT组件相比,Swing组件的名前多一个“J”字母。另外,AWT组件在java.awt包中,而Swing组件在javax.swing包中。3. 一个javaGUI简单程序【例9.1】一个简单的SwingGUI应用程序,在一个框架窗口中显示两个标签和一个按钮;上面的标签显示一串固定的文字信息,选择按钮后在下面的标签上显示系统现在的时间。/ SwingDemoimport java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;public class SwingDemo extends JFrame implements ActionListenerJButton b1;JLabel l1,l2;SwingDemo()super(Swing应用程序的例);l1=new JLabel(一个GUI应用程序的例子,JLabel.CENTER);l2=new JLabel();b1=new JButton(现在时间T);b1.setMnemonic(KeyEvent.VK_T);b1.setActionCommand(tume);b1.addActionListener(this);getContentPane().add(l1,BorderLayout.NORTH);getContentPane().add(l2,BorderLayout.CENTER);getContentPane().add(b1,BorderLayout.SOUTH);public void actionPerformed(ActionEvent e)Calendar c1=Calendar.getInstance();if(e.getActionCommand().equals(tume)l2.setText(现在时间是+c1.get(Calendar.HOUR_OF_DAY)+时+c1.get(Calendar.MINUTE)+分);l2.setHorizontalAlignment(JLabel.CENTER);else System.exit(0);public static void main(String args)JFrame frame=new SwingDemo();frame.pack();frame.setVisible(true);图9.1 例9.1的运行界面这是SwingGUI应用程序的最简单的例子。语句不多,但说明了Java.SwingGUI应用程序中的基本代码。(1) 引入合适的包和类。一般的SwingGUI应用程序应包含程序中的前三个引入语句,它们分别表示引入awt包、awt事件处理包和swing包。例中的第四个引入语句引入的util包是程序中类Calender所需要的。由于Swing组件使用AWT的结构,包括AWT的事件驱动模式,所以,使用swing组件的程序一般需要使用awt包。(2) 使用默认的观感设置自己的观感(Look and Feel)。本程序使用了默认的观感。(3) 使用一个顶层的容器。本程序的顶层容器为JFrame框架。(4) 根据需要,使用默认的布局管理器或设置另外的布局管理器。本程序使用JFrame的默认布局管理器BorderLayout。(5) 定义组件并将它们添加到容器。本程序使用两个标签(Jlabel类的对象)和一个按钮(JFrame类的对象)(6) 对组件或事件编码。本程序对按钮事件进行了注册和捕获,对按钮事件的处理编写了代码。9.1.2 容器、组件、布局和观感一般地,从一个GUI程序的外貌,可以见到一些对界面起到装饰美化作用的圆、矩形等几何图形和图像,也可以见到如按钮、列表等一些可进行人机交互的组件。在javaGUI程序中,这些界面元素应处于一个容器中,其中组件在容器中的摆放位置和大小,由容器的布局管理器决定。设置不同的观感,可得到不同的组件外观和形态。1. 容器(Container)和组件(Component)一个Java的图形用户界面的最基本元素是组件,组件是可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,如一个按钮、一个文本框等。在java语言中,通常将组件放在一定的容器内使用。容器实际上是一种具有容纳其他组件和容器的功能的组件。抽象类Container是所以容器的父类,其中包含了很多有关容器的功能和方法。而类Container又是Java语言的组件类Component的子类。在类Container中包含了将组件加入容器的方法add()、将组件移出容器的方法remove()和方法removeAll(),以及获得组件的方法getComponent()等。Container可以引发ContainerEvent类代表的容器事件。当容器中加入和移出组件时,容器将引发COMPONENT_ADDED和COMPONENT_REMOVED两种容器事件。若要编写响应容器事件的程序,应实现容器事件的监听器接口(ContainerListener,并在监听器内部实现该接口中的两个抽象方法:l Void componentAdded(ContainerEvent e)向容器加入组件时被调用。l Void componentRemove(ContainerEvent e)当组件从容器移出时被调用。在这俩方法内部,可以调用ContainerEvent类的实际参数e的有关方法:l Component getChild()返回引发事件发生的组件。l Container getContainer()返回引发事件的容器。l String paramString()返回标识该事件的参数字符串。2. 布局管理器(Layout Manager)3. 观感(Look and Feel)9.1.3 事件处理在一个GUI程序中,为了能够接收用户的输入、命令的按键和鼠标操作,程序系统首先应该能够识别这些操作并做出相应的响应。通常一个键盘和鼠标操作将引发一个系统预先定义好的事件,用户程序只要编写代码定义每个事件发生时应做出何种响应即可。这些代码会在它们对应的事件发生时由系统自动调用,这就是GUI程序中事件和事件响应的基本原理。在Java语言中,除了键盘和鼠标操作,系统的状态改变也可以引发事件。可能产生事件的组件称为事件源,不同事件源上发生的事件种类是不同的。若希望事件源上引发的事件被程序处理,需要将事件源注册给能够处理该事件源上那种事件类型的监听器。监听器具有监听和处理某类事件的功能,它可以是包容事件源的容器,也可以是另外的对象。也就是说,事件源和事件处理是分开的,一般组件都不处理自己的事件,而将事件处理委托给外部的处理实体,这种事件处理模型称为授权处理模型。事件的行为多种多样,由不同的监听器处理。编写事件处理程序首先应确定关注的事件属于何种监听器类型。例如,选择按钮或普通菜单项引发的事件由ActionListener监听器处理,选择其他组件的事件也都有相应的监听器。在AWT中,提供11种标准的监听器类型,如表9.1所示。在Swing中,也提供了较多类型的监听器,请参看有关资料。表9.1 AWT标准监听器、适配器和相应的注册方法监听器适配器类注册方法ActionListeneraddActionListenerAdjustmentListeneraddAdjustmentListenerComponentListenerComponentAdapteraddComponentListenerContainerListenerContainerAdapteraddContainerListenerFocusListenerFocusAdapteraddFocusListenerItemListeneraddItemListenerKeyListenerKeyAdapteraddKeyListenerMouseListenerMouseAdapteraddMouseListenerMouseMotionListenerMouseMotionAdapteradd MouseMotionListenerTextListeneraddTextListenerWindowListenerWindowAdapteradd WindowListener在确定监听器类型后,要用事件源类的注册方法来注册一个监听器的对象。这样,事件源产生的事件会传送给已注册的处理该类事件的监听器对象,该对象将自动调用相应的事件处理方法来处理该事件。具体的注册方法是:用监听器类的对象作为参数调用事件源本身的addXxxListener()方法。该方法的参数是一个监听器的对象,有多种形式。例如:(1) 分离的监听器类:该类通常为继承相应事件适配器类的子类,类中包含了事件处理方法。参数是该类的一个对象。(2) 实现监听器接口:参数为this,表示本对象就是监听器类的对象,在本类中包含事件处理方法。(3) 有名内部类:参数形式为继承事件适配器类的子类对象,在子类中包含事件处理方法。(4) 匿名内部类:参数形式为用new开始的一个无名的类定义,其中包含事件处理方法。在表9.1中,也列出了与监听器类型对应的适配器类和注册方法。下面利用例9.1来说明授权处理模型的处理机制,选择按钮后,应显示现在的时间。按钮时间是ActionEvent事件,由ActionListener监听器处理,实现ActionListener接口的类定义为:public class SwingDemo extends JFrame implements ActionListener即类SwingDemo实现监听器接口ActionListener,需要重写接口中惟一的actionPerformed()方法来具体处理按钮引发的事件(这里是显示时间)。方法的参数是ActionEvent对象,该对象给出了事件和事件源的信息。为处理按钮事件,需要按钮注册一个监听器类的对象,例9.1中是如下的语句:b1. addActionListener(this);b1为按钮,this

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论