还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
语言中的事件及事件处理Java在界面程序中,为了使程序能够接收用户的命令,系统应该能够识别这些鼠标和键盘的操作事件并GUI做出响应在此将讨论事件的产生和响应事件处理
8.1通常每一个键盘或鼠标操作会引起一个系统预先定义好的事件,程序只需要定义每个特定事件发生时应该做出的响应在Java中,除了键盘和鼠标操作外,系统的状态改变、标准图形界面元素等都可以引发事件事件
8.
1.1事件处理对界面的程序设计是必不可少的程序等候用户执行一些操作,用户通过界面控制程序GUI GUI执行操作的顺序例如,在例
7.3中创建了一个选课的GUI界面,使用鼠标选中所要的课程之后,单击按钮执行按钮事件处理程序,将选中的课程在文本框中显示这种方法就称为事件驱动程序设计
1.事件组件一个事件包含以下个组件31事件对象在Java中,每一个事件Event都是对象是所有事件对象的根类这里只介绍的事件对象只属于其中的一类这一类事件对象的根类是它是java.awt.AWTEvent,的直接子类从名称上可以看出这一类事件对象都是与用户界面有关的Eventobject在java的定义中,每一个事件对象都有其事件发起者和事件使用者事件发起者对应了将要介绍的事件源,而事件使用者对应事件监听器同时,为了在使用事件时能够访问到事件源,在每一个事件对象中都保存了一个指向事件源的引用由于用户对组件的操作有所不同,因此为这些不java同类型的操作定义了相应的事件当用户通过按键或单击鼠标与应用程序交互时,一个事件便产生了操作系统捕获该事件及与其相关的数据,例如,事件发生的时间和事件类型按键、单击鼠标然后,数据被传递给事件所属的应用程序处理事件源2顾名思义,事件源就是事件的源头,即事件产生的地方Java中的事件源种类很多,在此介绍的事件源指的是组件事件源是产生事件的对象例如,单击一个命令按钮时,就会生成一个对象ActionEventActionEvent对象包含有事件的信息3事件处理程序事件处理程序就是处理事件的代码方法它将事件对象作为一个参数接收过来
2.事件模型处理事件有两种模型基于继承的事件模式和基于代理的事件模型Java承的事件模式1语言中的匿名类没有类名的内部类Java匿名类是一种没有类名的内部类,多用在事件处理的程序中有时用户需要定义一个类,Anonymouse Class且只想在程序中定义该类的一个对象,并把它作为参数传递给一个方法只要该类是一个现有类的派生或实现一个接口,就可以使用匿名类匿名类定义短而简单且使用方便,但不易过多使用,它会引起程序代码的复杂化而不易理解下面通过一个简单示例,说明匿名类的实现情况例如,关闭窗口单击关闭按钮、单击鼠标等18]8]匿名类的使用import java.applet.*;importpublic classExample5_18extends Appletstatic intcounter;public voidinit{counter=0;addMouseListenernew MouseAdapter{public voidmousePressedMouseEvent me{counters;showStatus你单击了+cou“ter+”次鼠标!”;}};},巴小程序—…小程序你单击了3次鼠标!Example8_18程序运行界面在上面程序中,类定义出现在表达式中,该式生成要传递给addMouseListener方法的参数,该方法要求类型的一个引用类的详细定义出现在“{}”中,匿名类中可以包含数据成员和方法,在本类中MouseAdapter它包含一个实现接口的方法MouseListener mousePressed在中,为了让程序俘获并处理事件,必须扩展组件并覆盖方法或AWT
1.0GUI GUIaction方法如果从这些方法中返回则将捕获事件;否则,将在层中继续向上传播handleEventtrue,GUI该事件,直到事件被捕获或到最顶层为止这种模型的主要缺点是事件必须由启动事件或它的容器的组件处理,这和面向对象程序设计的标准不同,它们的机能必须驻留在适当的类中;另一个缺点是在通过容器的分层结构上传递不重要的事件,而无法忽略它,造成资源的浪费CPU基于代理的事件模型2现在处理事件的方法是基于授权事件模型的,这种模型定义了标准一致Delegation EventModel的机制去产生和处理事件它的概念十分简单一个源产生一个事件并把它送到一个或多个监听器Source Event,Listenero在这种方案中,监听器简单地等待,直到它收到一个事件一旦事件被接收,监听器将处理这些事件,然后返回这种设计的优点是处理事件的应用程序可以明确地和用来产生事件的用户接口程序分开一个用户接口程序可以授权一段特定的代码处理一个事件在授权事件模型中,监听器为了接受一个事件通知而必须注册这样有一个重要的好处通知只被发送给哪些想接受它们的监听器这是一种比JDK
1.0版本设计的方法更有效的处理事件的方法以前,一个事件按照封装的层次被传递,直到它被一个组件处理这需要组件接受哪些它们不处理的事件,所以浪费了宝贵的时间,而授权事件模型则避免了这个开销在AWT
1.1版本的JDK中,对原来的事件模型进行了改进,采用了基于代理的方式在该模型中,当一个特定事件发生时,必须指定被通知对象,即事件处理是从一个事件源授权到一个或者多个事件监听器如果事件与监听器之间没有关系,它被丢失这种代理模型是基于事件类、事件监听、事件处理和适配器个组件4【例
8.1]在一个框架中加入一个命令按钮,当用户单击按钮时,即发生了一个单击事件,这时按钮上的文本被改变import javax.swing.*;importclass ButtonEventDemoextends JFrame□Button btn;public ButtonEventDemo//构造函数{superWindow Title;btn=new3ButtonClick here;getContentPane・addCenterbtn;ButtonListcncr Listcn=new ButtonListcncr;btn.addActionListenerListen;setSize200^300;setVisibletrue;setDefaultClose0peration5XI7^0/V_CL0S£;class ButtonListenerimplements ActionListener{public voidactionPerformedActionEvent e{JButton source=3Buttone.getSource;source.setTextButtonclicked;}public staticvoid mainStringargs[]{new ButtonEventDemo;,国Window回I—「Button clicked例
8.1程序运行界面该应用程序是任何工作的呢?从main方法开始执行,在main方法中创建ButtonEventDemo类的对象19]super方法调用基类Frame的构造方法、并设置窗口标题;2创建按钮对象,并将其放在窗口中间;3创建监听者对象;4执行按钮的addActionListener方法注册按钮的监听对象;5setVisible方法显示窗口对象创建之后,显示用户界面,应用程序等待用户与其交互当用户单击按钮时产生事件,创建对象并将其授权给注册监听对象处理;1ActionEvent ActionEvent监听对象调用方法,它处理事件;2actionPerformedActionEvent在方法中,用方法检索对事件源的引用;用方法改变按钮的标3actionPerformedgetSourcesetText签第9章图形用户界面GUI设计菜单组件类MenuComponent菜单条类MenuBar菜单项类Menuitem流式布局管理类FlowLayout图形用户界面设计概述
9.1GUI边界布局管理类BorderLayout支持包和简单程序举例
9.
1.1GUI GUI
1.Java.awt包语言在包中提供了大量进行设计所使用的类和接口,包括绘制图形、设置字体和Java java.awt GUI颜色、控制组件、处理事件等内容,AWT是java语言进行GUI程序设计的基础Java.awt包中主要的类及其层次关系如下所示所有类的超类JavaFont字体类Color颜色类图形类GraphicsComponent组件类Label文本组件类Button单行文本组件类TextCompone单行文本组件类TextField单行文本组件类TextArea多行文本组件类List列表类Container容器类Panel面板类小程序类Applet窗口类WindowFrame框架类Dialog对话框类Checkbox单选按钮与复选按钮类CheckboxGroup按钮组合类包
2.Javax.swingSwing包是java基础类库Java Foundationclasses,JFC的一部分Swing提供了从按钮到可分拆面板和表格的所有组件Swing组件是Java语言提供的第二代GUI设计工具包,它以AWT为基础,在AWT内容的基础上新增或改进了一些GUI组件,使得GUI程序功能更强大,设计更容易、更方便“Swing”是开发新组件的项目代码名,现在,这个名字常用来引用新组件和相关的APISwing包首先出现在JDK
1.1中以前的版本中使用AWT组件,在现在新的Java版本中仍然支持AWT组件,但几乎所有的AWT组件都有对应的新的、功能更强的Swing组件,所以现在开发GUI程序时,一般建议用Swing组件代替AWT组件AWT组件和对应的Swing组件,从名称上很容易记忆和区别例如,WAT的框架类、面板类、按钮类和菜单类,被命名为、和而对应的组件类被命名为、Frame PaneLButton menu,Swing JFrameJPaneK和与组件相比,组件的名前多一个字母另外,组件在包中,而JButton JmenuAWT Swing“J”AWT java.awt Swing组件在包中javax.swing一个简单程序
3.javaGUI【例
9.1]一个简单的SwingGUI应用程序,在一个框架窗口中显示两个标签和一个按钮;上面的标签显示一串固定的文字信息,选择按钮后在下面的标签上显示系统现在的时间//SwingDemoimport java.awt.*;import java.awt.event import javax.swing.*;importjava.util.*;public classSwingDemo extendsDFrame implementsActionListener{[Button bl;DLabel11,12;SwingDemo{super“Swing应用程序的例;ll=new JLabel“一个GU工应用程序的例子“/Label.CENTER;12=new3LabelIin;bl=new:JButton现在时间[T]”;bl・setMnemonicKeyEvent.VK_T;bl・setActionCommandtume;bl・addActionListenerthis;getContentPane.addll,,BorderLayout./VORTH;getContentPane.add12^BorderLayout.CENTER;getContentPane.addbl BorderLayout.SOL/TH;J}public voidactionPerformedActionEvent e{Calendar cl=Calendar.getInstance;ife.getActionCommand.equalstume{
12.set Text现在口寸间是+c
1.get Calendar.HOUR_OF_DAY+时+cl・getCalendar・M工M7TE+分;
12.setHorizontalAlignment3Label.CE/VTE/;}else System.exit0;public staticvoid mainStringargs[]IFrame frame=new SwingDemo;frame.pack;frame.setVisibletrue;}一个GUI应用程伟的一子现在时间是21时32分现在时间CD II图
9.1例
9.1的运行界面这是SwingGUI应用程序的最简单的例子语句不多,但说明了Java.SwingGUI应用程序中的基本代码
(1)引入合适的包和类一般的SwingGUI应用程序应包含程序中的前三个引入语句,它们分别表示引入awt包、awt事件处理包和swing包例中的第四个引入语句引入的util包是程序中类Calender所需要的由于Swing组件使用AWT的结构,包括AWT的事件驱动模式,所以,使用swing组件的程序一般需要使用包awt
(2)使用默认的观感设置自己的观感(Look andFeel)本程序使用了默认的观感
(3)使用一个顶层的容器木程序的顶层容器为JFrame框架
(4)根据需要,使用默认的布局管理器或设置另外的布局管理器本程序使用JFrame的默认布局管理器BorderLayouto
(5)定义组件并将它们添加到容器本程序使用两个标签(Jlabel类的对象)和一个按钮(JFrame类的对象)
(6)对组件或事件编码本程序对按钮事件进行了注册和捕获,对按钮事件的处理编写了代码容器、组件、布局和观感一般地,从一个程序的外貌,可以见到一些对界面起到装饰美化作用的圆、矩形等几何图形和图像,GUI也可以见到如按钮、列表等一些可进行人机交互的组件在javaGUI程序中,这些界面元素应处于一个容器中,其中组件在容器中的摆放位置和大小,由容器的布局管理器决定设置不同的观感,可得到不同的组件外观和形态
1.容器(Container)和组件(Component)一个的图形用户界面的最基本元素是组件,组件是可以以图形化的方式显示在屏幕上并能与用户进行Java交互的对象,如一个按钮、一个文本框等在java语言中,通常将组件放在一定的容器内使用容器实际上是一种具有容纳其他组件和容器的功能的组件°抽象类Container是所以容器的父类,其中包含了很多有关容器的功能和方法而类Container又是Java语言的组件类Component的子类在类Container中包含了将组件加入容器的方法add、将组件移出容器的方法remove和方法removeAII,以及获得组件的方法getComponent等Container可以引发ContainerEvent类代表的容器事件当容器中加入和移出组件时,容器将引发COMPONENT_ADDED和COMPONENT_REMOVED两种容器事件若要编写响应容器事件的程序,应实现容器事件的监听器接口ContainerListener,并在监听器内部实现该接口中的两个抽象方法向容器加入组件时被调用•Void componentAddedContainerEvent e当组件从容器移出时被调用•Void componentRemoveContainerEvent e在这俩方法内部,可以调用类的实际参数的有关方法ContainerEvent e返回引发事件发生的组件•Component getChild返回引发事件的容器•Container getContainer•String paramString返回标识该事件的参数字符串布局管理器
2.Layout Manager观感
3.Look andFeel事件处理
9.13在一个程序中,为了能够接收用户的输入、命令的按键和鼠标操作,程序系统首先应该能够识别这些GUI操作并做出相应的响应通常一个键盘和鼠标操作将引发一个系统预先定义好的事件,用户程序只要编写代码定义每个事件发生时应做出何种响应即可这些代码会在它们对应的事件发生时由系统自动调用,这就是GUI程序中事件和事件响应的基本原理在Java语言中,除了键盘和鼠标操作,系统的状态改变也可以引发事件可能产生事件的组件称为事件源,不同事件源上发生的事件种类是不同的若希望事件源上引发的事件被程序处理,需要将事件源注册给能够处理该事件源上那种事件类型的监听器监听器具有监听和处理某类事件的功能,它可以是包容事件源的容器,也可以是另外的对象也就是说,事件源和事件处理是分开的,一般组件都不处理自己的事件,而将事件处理委托给外部的处理实体,这种事件处理模型称为授权处理模型事件的行为多种多样,由不同的监听器处理编写事件处理程序首先应确定关注的事件属于何种监听器类型例如,选择按钮或普通菜单项引发的事件由监听器处理,选择其他组件的事件也都有相应的ActionListener监听器在中,提供种标准的监听器类型,如表所示在中,也提供了较多类型的监听器,AWT
119.1Swing请参看有关资料表标准监听器、适配器和相应的注册方法
9.1AWT监听器适配器类注册方法ActionListener addActionListenerAdjustmentListeneraddAdjustmentListenerComponentListener ComponentAdapteraddComponentListenerContainerListener ContainerAdapteraddContainerListenerFocusListener FocusAdapteraddFocusListenerItemListener addltemListenerKeyListenerKeyAdapter addKeyListenerMouseListenerMouseAdapter addMouseListenerMouseMotionListenerMouseMotionAdapter addMouseMotionListenerTextListener addTextListenerWindowListenerWindowAdapter addWindowListener在确定监听器类型后,要用事件源类的注册方法来注册一个监听器的对象这样,事件源产生的事件会传送给已注册的处理该类事件的监听器对象,该对象将自动调用相应的事件处理方法来处理该事件具体的注册方法是用监听器类的对象作为参数调用事件源本身的方法该方法的参数是一个监听器的对addXxxListener象,有多种形式例如分离的监听器类1该类通常为继承相应事件适配器类的子类,类中包含了事件处理方法参数是该类的一个对象2实现监听器接口:参数为this,表示本对象就是监听器类的对象,在本类中包含事件处理方法3有名内部类参数形式为继承事件适配器类的子类对象,在子类中包含事件处理方法匿名内部类4参数形式为用开始的一个无名的类定义,其中包含事件处理方法new在表中,也列出了与监听器类型对应的适配器类和注册方法
9.1下面利用例
9.1来说明授权处理模型的处理机制,选择按钮后,应显示现在的时间按钮时间是ActionEvent事件,由ActionListener监听器处理,实现ActionListener接口的类定义为public classSwingDemo extendsJFrame implementsActionListener{•••}即类SwingDemo实现监听器接口ActionListener,需要重写接口中惟一的actionPerformed方法来具体处理按钮引发的事件这里是显示时间方法的参数是ActionEvent对象,该对象给出了事件和事件源的信息为处理按钮事件,需要按钮注册一个监听器类的对象,例
9.1中是如下的语句bl.addActionListener this;为按钮,为类本类的实例对象bl thisSwingDemo事件处理过程如下当用户选择按钮时,按钮引发一个动作事件因为按钮注册到ActionEvent,ActionListener类的对象,所以按钮事件导致动作监听器的方法被调用,显示系统当前的时间actionPerformed若有多个事件源产生同类事件,可在事件处理方法中用getSource或getActionCommand方法判别引发事件的事件源组件可产生多种类型的事件不同的组件引发的事件也不完全相同Swing。