《Java语言中的事件及其处理.docx》由会员分享,可在线阅读,更多相关《Java语言中的事件及其处理.docx(10页珍藏版)》请在第一文库网上搜索。
1、Java语言中的事件及事件处理在GU1界面程序中,为了使程序能够接收用户的命令,系统应该能够识别这些鼠标和键盘的操作(事件)并做出响应。在此将讨论事件的产生和响应。8.1 事件处理通常每一个键盘或鼠标操作会引起一个系统预先定义好的事件,程序只需要定义每个特定事件发生时应该做出的响应。在JaVa中,除了键盘和鼠标操作外,系统的状态改变、标准图形界面元素等都可以引发事件。8.1.1 事件事件处理对GU1界面的程序设计是必不可少的。程序等候用户执行一些操作,用户通过GU1界面控制程序执行操作的顺序。例如,在例7.3中创建了一个选课的GU1界面,使用鼠标选中所要的课程之后,单击按钮执行按钮事件处理程序
2、,将选中的课程在文本框中显示。这种方法就称为事件驱动程序设计。1 .事件组件一个事件包含以下3个组件:(1)事件对象在JaVa中,每一个事件(EVent)都是对象。Javazti1EventObjrct是所有事件对象的根类。这里只介绍的事件对象只属于其中的一类。这一类事件对象的根类是java.awt.AWTEvent,它是EventObject的直接子类。从名称上可以看出这一类事件对象都是与用户界面有关的。在java的定义中,每一个事件对象都有其事件发起者和事件使用者。事件发起者对应了将要介绍的事件源,而事件使用者对应事件监听器。同时,为了在使用事件时能够访问到事件源,在每一个事件对象中都保存
3、了一个指向事件源的引用。由于用户对组件的操作有所不同,因此java为这些不同类型的操作定义了相应的事件:当用户通过按键或单击鼠标与应用程序交互时,一个事件便产生了。操作系统捕获该事件及与其相关的数据,例如,事件发生的时间和事件类型(按键、单击鼠标)。然后,数据被传递给事件所属的应用程序处理。(2)事件源顾名思义,事件源就是事件的源头,即事件产生的地方。Java中的事件源种类很多,在此介绍的事件源指的是组件。事件源是产生事件的对象。例如,单击一个命令按钮时,就会生成一个ACtionEVent对象。ActionEvent对象包含有事件的信息。(3)事件处理程序事件处理程序就是处理事件的代码(方法)
4、。它将事件对象作为一个参数接收过来。2 .事件模型Java处理事件有两种模型:基于继承的事件模式和基于代理的事件模型。(1)承的事件模式在AwT1O中,为了让程序俘获并处理GU1事件,必须扩展GU1组件并覆盖actionO方法或hand1eEventO方法。如果从这些方法中返回true,则将捕获事件:否则,将在GU1层中继续向上传播该事件,直到事件被捕获或到最顶层为止。这种模型的主要缺点是事件必须由启动事件或它的容罂的组件处理,这和面向对象程序设计的标准不同,它们的机能必须驻留在适当的类中;另一个缺点是在通过容器的分层结构上传递不重要的事件,而无法忽略它,造成CPU资源的浪费。(2)基于代理的
5、事件模型现在处理事件的方法是基于授权事件模型(DeIegatiOnEVemMOde1)的,这种模型定义了标准一致的机制去产生和处理事件。它的概念十分简单:一个源(SoUrCe)产生一个事件(Event),并把它送到一个或多个监听器(1istener).在这种方案中,监听器简单地等待,直到它收到一个事件。一旦事件被接收,监听器将处理这些事件,然后返回。这种设计的优点是:处理事件的应用程序可以明确地和用来产生事件的用户接口程序分开。一个用户接口程序可以授权一段特定的代码处理一个事件。在授权事件模型中,监听器为了接受一个事件通知而必须注册。这样有一个重要的好处:通知只被发送给哪些想接受它们的监听器。
6、这是一种比JDK1.0版本设计的方法更有效的处理事件的方法。以前,一个事件按照封装的层次被传递,直到它被一个组件处理。这需要组件接受哪些它们不处理的事件,所以浪费了宝贵的时间,而授权事件模型则避免了这个开销。在AWTI.1版本的JDK中,对原来的事件模型进行了改进,采用了基于代理的方式。在该模型中,当一个特定事件发生时,必须指定被通知对象,即事件处理是从一个事件源授权到一个或者多个事件监听器。如果事件与监听器之间没有关系,它被丢失。这种代理模型是基于事件类、事件监听、事件处理和适配器4个组件。【例8.1在一个框架中加入一个命令按钮,当用户单击按钮时,即发生了一个单击事件,这时按钮上的文本被改变
7、。importjava.swing.*;importjava.awt.event.*;c1assButtonEventDemoextendsJFrame3Buttonbtn;pub1icButtonEventDemoO构造函数super(,WindowTit1e);btn=newJButton(,C1ickhere);getContentPane().add(Center,btn);Button1istener1isten=newButton1istenerO;btn.addAction1istener(1isten);SetSiZe(200,300);setVisib1e(true);set
8、Defau1tC1oseOperation(FXI710A/_C/.0S);c1assButton1istenerimp1ementsAction1istenerpub1icvoidactionPerformed(ActionEvente)JButtonsource=(JButton)e.getSource();source.setTet(Buttonc1icked);)pub1icstaticvoidmain(Stringargs)newButtonEventDemoO;)该应用程序是任何工作的呢?从mainO方法开始执行,在main()方法中创建BUttOnEVentDemO类的对象:(1
9、) SUPer()方法调用基类(Frame)的构造方法、并设置窗口标题;(2)创建按钮对象,并将其放在窗口中间;(3)创建监听者对象;(4)执行按钮的addAction1iStener()方法注册按钮的监听对象;(5)SetVisib1e()方法显示窗口。对象创建之后,显示用户界面,应用程序等待用户与其交互。当用户单击按钮时:(1)产生ActionEvent事件,创建ActionEveM对象并将其授权给注册监听对象处理:(2)监听对象调用actionPerformed()方法,它处理ACtiOnEVem事件:(3)在actionPerfOrmed()方法中,用getSource()方法检索对事
10、件源的引用;用SetTeXt()方法改变按钮的标签。第9章图形用户界面(GUD设计9.1 图形用户界面(GU1)设计概述9.1.1 GUI支持包和简单GUI程序举例1. Java.awt包JaVa语言在javaawt包中提供了大量进行GU1设计所使用的类和接I1包括绘制图形、设置字体和颜色、控制组件、处理事件等内容,AWT是java语言进行GU1程序设计的基础。Java.awt包中主要的类及其层次关系如下所示:Java.1ang.ObjectFontCo1orGraphicsComponent1abe1ButtonTextComp(t1istContainerCheckboxCheckboxG
11、roupMenuComponentMenuBarMenuitemFIow1ayoutBorder1ayoutJava所有类的超类字体类颜色类图形类组件类文本组件类单行文本组件类)ne单行文本组件类TextFieId单行文本组件类TextArea多行文本组件类列表类容器类Pane1面板类IApp1et小程序类Window窗口类Frame框架类Dia1og对话框类单选按钮与复选按钮类按钮组合类菜单组件类菜单条类菜单项类流式布局管理类边界布局管理类2. Java.swing包SWing包是java基础类库(JavaFoundationdasses,JFO的一部分。SWing提供了从按钮到nJ分拆面板
12、和表格的所有组件。SWing组件是JaVa语言提供的第二代GU1设计工具包,它以AWT为基础,在AWT内容的基础上新增或改进了一些GU1组件,使得GU1程序功能更强大,设计更容易、更方便。“Swing”是开发新组件的项目代码名,现在,这个名字常用来引用新组件和相关的API。Swing包首先出现在JDK1.1中。以前的版本中使用AWT组件,在现在新的Java版本中仍然支持AWT组件,但几乎所有的AwT组件都有对应的新的、功能更强的SWing组件,所以现在开发GUI程序时,一般建议用Swing组件代替AWT组件。AWT组件和对应的Swing组件,从名称上很容易记忆和区别。例如,WAT的框架类、面板
13、类、按钮类和菜单类,被命名为Frame、ParIeI、BUttOn和menu,而SWing对应的组件类被命名为JFrame、JPane1JBUtton和JmenUo与AWT组件相比,SWing组件的名前多一个J字母。另外,AWT组件在java.awt包中,而Swing组件在javax.swing包中。3. 一个javaGUI简单程序【例9.1一个简单的SWingGU1应用程序,在一个框架窗口中显示两个标签和一个按钮;上面的标签显示一串固定的文字信息,选择按钮后在下面的标签上显示系统现在的时间。/SwingDemoimportjava.awt.*;importjava.awt.event.*;i
14、mportjavax.swing.*;importjava.uti1.*;pub1icc1assSwingDemoextendsJFrameimp1ementsAction1istenerJButtonb1;31abe111,12;SwingDemo()SUPer(Swing应用程序的例);11=newJ1abe1(“一个GU工应用程序的例子/1abe1.CENTER);12=newJ1abe1();b1=newJBUttOn(现在时间T);b1.SetMnemonic(KeyEvent,VK_T);b1.SetActionCommand(,tume);b1.addActio1istener(
15、this);getContentPane().add(11,Border1ayout./VORTH);getContentPane().add(12,Border1ayout.CENTER);getContentPane().add(b1,Border1ayout.SOUTH);)pub1icvoidactionPerformed(ActionEvente)Ca1endarC1=Ca1endar.get1nstnce();if(e.getActionCommand().equa1s(,tume,)12.setText(现在时间是+c1.get(CaIendar./。/_。_。4丫)+”时“+c1.get(CaIendar.MI7VUTE)+“分”);12.SetHorizonta1A1ignment(J1abe1XENTER);e1seSystem.exit(0);)pub1icstaticvoidmain(Stringargs)JFrameframe=newSwing