图形用户界面设计(2)事件模型课件_第1页
图形用户界面设计(2)事件模型课件_第2页
图形用户界面设计(2)事件模型课件_第3页
图形用户界面设计(2)事件模型课件_第4页
图形用户界面设计(2)事件模型课件_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

AWT事件模型 Contents 1 AWT事件处理模型 为学生信息管理管理系统设计一个登陆界面 接受用户输入的账号和密码 界面如图所示 所需要的知识点常用组件和容器的使用方法及功能AWT事件处理模型 例 AWT事件模型 设计一个图形界面 不仅仅需要画出窗口并添加组件 更重要的是为组件设计相应程序 使组件能够响应并处理用户的操作 例如单击按钮 等等当Java程序运行时 如果用户在界面上进行某种操作 系统捕获这些操作会引发相应的事件 Event 然后执行相应的事件处理程序 Java中定义了许多事件类 用来描述不同的用户行为 事件与事件处理 事件 就是发生在用户界面上的用户交互行为而产生的一种效果 如鼠标的各种动作 键盘的操作以及发生在组件上的各种动作 每发生一个事件 程序都需要作出相应的响应 这称为事件处理 AWT事件模型 事件的来源事件的来源是用户的操作每当用户在AWT组件上进行某种操作 例如用鼠标单击按钮 敲击键盘等 AWT事件处理系统会生成一个相应的事件对象事件对象描述的是用户所执行的操作 用户操作不同 事件对象的内容也会不同 AWT事件模型 事件的处理事件的处理由事件处理程序完成每个AWT组件都有自己的事件处理程序当事件对象生成时 AWT事件处理系统就会将这个事件对象传递给所涉及的组件 由它们的事件处理程序进行相应处理 AWT事件模型 事件的模型事件处理模型 是指事件产生后事件对象的传递模型JDK1 0使用的是层次模型 hierarchal JDK1 1使用的是委托模型 delegation 层次模型 JDK1 0使用的层次事件处理模型主要基于容器和组件的包含关系一个事件对象产生之后 首先被传递给直接相关的组件 该组件可以对事件进行处理 也可以忽略 若组件没有对事件进行处理 则AWT事件处理系统会将事件对象继续向上传递给组件所在的容器若容器将事件忽略 则AWT事件处理系统会将事件再继续向上传递给容器所在的容器 层次模型 示例 Frame Panel Button1 Button2 层次事件处理模型中的事件都用Event描述 Event是java awt中定义的一个类 它有如下几个成员变量 Objecttarget事件涉及的组件longwhen事件发生的时间intid事件的类型intx y事件产生的坐标位置Objectarg与具体事件有关的参数 事件类型包括 窗口事件 移动窗口 关闭窗口等 鼠标事件 移动鼠标 按下鼠标键等 焦点事件 获得焦点 失去焦点 键盘事件 按下或松开键 ACTION事件 按动按钮等 列表框事件 在列表框中进行选择 滚动条事件 按动其中的向上或向下按钮 为了区分事件类型 需要用其事件分类标志变量id来判断事件是否属于动作事件 if Ev id ACTION EVENT 层次模型 示例 Frame Panel Button1 Button2 生成Event的一个实例 组件都继承了Component类中的handleEvent 方法 handleEvent根据事件的类型调用不同的方法 如果对事件进行了处理 就返回true 否则返回falsepublicbooleanhandleEvent Eventevt switch evt id caseEvent MOUSE ENTER returnmouseEnter evt evt x evt y caseEvent LOST FOCUS returnlostFocus evt evt x evt y returnfalse publicbooleanmouseEnter Eventevt intx inty returnfalse 层次模型 importjava awt publicclassMainextendsFrame LabelstatusBar newLabel publicstaticvoidmain Stringargs newMain Main super Example add South statusBar resize 200 200 show 层次模型 publicclassMainextendsFrame publicbooleanhandleEvent Eventevt switch evt id caseEvent MOUSE MOVE returnmouseMove evt evt x evt y caseEvent MOUSE DRAG returnmouseDrag evt evt x evt y caseEvent WINDOW DESTROY hide dispose System exit 0 returntrue returnsuper handleEvent evt 层次模型 publicclassMainextendsFrame publicbooleanmouseMove Eventevt intx inty Stringstatus evt x evt y if evt controlDown status C if evt shiftDown status S statusBar setText status returntrue publicbooleanmouseDrag Eventevt intx inty Stringstatus evt x evt y if evt controlDown status C if evt shiftDown status S statusBar setText status returntrue 层次模型 层次事件处理的优点有 简单 容易理解 基于面向对象的原理层次事件处理的缺点有 事件对象只能被引起该事件的组件或包含它的容器捕获 而其他组件无法处理该事件没有简单的事件过滤方法 要进行事件处理 需要创建某个组件的子类 否则就必须为最外层的容器编写复杂的handleEvent 及与之相关的方法 在JDK1 1中 事件处理模型将事件源 产生事件的组件 和对事件作出的具体处理 利用一种称为监听器 Listener 的实体来对事件进行具体的处理 分开 一般情况下 组件 事件源 都不处理自己的事件 而是将事件处理委托给外部的处理实体 监听器 这种事件处理模型称为事件的授权处理模型 不同的事件 可以交由不同类型的监听器去处理 委托模型 所有的组件都从Component类中继承了将事件处理授权给监听器的方法 addXXXListener ListenerTypelistener removeXXXListener ListenerTypelistener 用户操作引发的事件对象仍然传递给相应组件 组件注册一个事件处理程序 这种事件处理程序称为事件的监听程序 Listener 委托模型 委托模型 JDK1 1使用的委托事件处理模型的基本思想是用户操作引发的事件仍然传递给相应的组件为了接收事件对象并进行事件处理 组件必须注册一个事件处理程序 事件监听程序Listener 事件监听程序可以定义在组件所在的类中 也可以定义在其他类中 对事件的处理 由组件委托给事件监听程序所在的类来完成 事件的监听程序可以定义在组件所在的类中 也可以定义在其他的类里 而对事件的处理 则由组件委托给事件监听程序所在的类来完成 委托模型 在委托事件处理模型下 事件对象只被传递给已经注册的监听程序 根据用户操作的不同 事件也被分成不同类型 每种事件都有一个对应的监听程序类 这个监听程序类应实现了相应的监听程序接口 Listenerinterface 并且定义了事件对象的接收和处理方法 委托模型 委托模型 在委托事件处理模型中 Java根据不同的用户操作 产生不同的事件类 Event 如窗口事件类 WindowEvent 单击事件类 ActionEvent 等 并为每个事件类定义了事件监听程序 Listener 这些事件监听程序的声明在对应的监听程序接口中 例如WindowListener ActionListener等 委托模型 示例 Frame Panel Button1 Button2 Button1 addActionListener this 为按钮Button1注册了ActionEvent事件监听程序 系统捕获操作 并产生ActionEvent事件 publicvoidactionPerformed ActionEvente ActionListener接口中的Action事件处理程序 按钮委托的事件监听程序类对象 AWT事件处理模型 在事件处理的过程中 主要涉及三类对象 Event 事件 用户对界面操作在java语言上的描述 以类的形式出现 例如键盘操作对应的事件类是KeyEvent EventSource 事件源 事件发生的场所 通常就是各个组件 例如按钮Button Eventhandler 事件处理者 接收事件对象并对其进行处理的对象 AWT事件处理模型 事件处理 事件 用户对界面操作 以类的形式出现 事件源 事件发生的场所 通常就是各个组件 事件处理者 接收事件并对其进行处理的对象 Event EventSource Eventhandler 事件源 事件 事件处理者之间的关系 组件 事件源 事件对象 事件处理器 4 3 2 1 外部作用 生成事件对象 事件监听器注册 把事件对象传入事件处理器 授权处理机制 不同的事件源上可能发生不同的事件 例如一个按钮能够发生ActionEvent类型的事件 而一个窗口能够发生WindowEvent类型的事件同一个事件源上可能发生多种事件 例如在Canvas对象上既可能发生鼠标事件 也可能发生键盘事件java采取授权处理机制 DelegationModel 事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理 授权处理机制 授权模型把事件的处理委托给外部的处理实体进行处理 实现了将事件源和监听器分开的机制 事件处理者 监听器 事件处理者 监听器 通常是一个类 负责处理一类事件该类如果要能够处理某种类型的事件 就必须实现与该事件类型相对应的接口 例如下例中类ButtonHandler之所以能够处理ActionEvent事件 原因在于它实现了与ActionEvent事件对应的接口ActionListener 每个事件类都有一个与之相对应的接口 事件处理举例 importjavax swing importjava awt importjava awt event publicclassTestButton publicstaticvoidmain Stringargs JFramef newJFrame Test JButtonb newJButton PressMe b addActionListener newButtonHandler f setLayout newFlowLayout f add b f setSize 200 100 f setVisible true Button是事件源 classButtonHandlerimplementsActionListener publicvoidactionPerformed ActionEvente System out println Actionoccurred 事件 事件处理者 事件处理的实现步骤 对于某种类型的事件XXXEvent 要想接收并处理这类事件 必须定义相应的事件监听器类 该类需要实现与该事件相对应的接口XXXListener 进行授权 注册该类事件的监听器 使用addXXXListener XXXListener 方法来注册监听器 b addActionListener newButtonHandler 思考 可不可以用一个类本身实现监听器 第二节委托模型 importjava awt importjava awt event publicclassTestButton publicstaticvoidmain Stringargs Framef newFrame Test Buttonb newButton Pressme b addActionListener newButtonHandler f add Center b f pack f setVisible true 第二节委托模型 importjava awt importjava awt event publicclassTestButton publicstaticvoidmain Stringargs b addActionListener newButtonHandler classButtonHandlerimplementsActionListener publicvoidactionPerformed ActionEvente System out println Actionoccurred 输出为 第二节委托模型 importjava awt importjava awt event publicclassTestButtonimplementsActionListener publicstaticvoidmain Stringargs newTestButton go publicvoidgo b addActionListener this publicvoidactionPerformed ActionEvente System out println Actionoccurred 委托模型 AWTEvent事件类Java在java awt event包中定义了许多事件类 用来处理各种用户操作所产生的事件 它们的父类都是java awt包中的AWTEvent类 Java中的每个事件类都有一个对应的接口 接口中声明了一个或多个抽象的事件处理方法 凡是需要接收并处理事件对象的类 多需要实现相应的接口 EventObject类的主要方法publicObjectgetSource 获得产生事件的组件ActionEvent类的主要方法publicStringgetActionCommand 获得按钮的标签 委托模型 委托模型 java awt event包中的每个事件类都有一个对应的接口 接口中声明了一个或多个抽象的事件处理方法 如ActionListener中的actionPerFormed 方法 若要接收处理某一个事件类 必须实现相应的接口 第二节委托模型 importjava awt importjava awt event publicclasscal Framef Buttonb1 b2 badd bequl TextFieldtext Panelp publicstaticvoidmain Stringargs newcal display 第二节委托模型 publicclasscal publicvoiddisplay f newFrame calculator text newTextField f add text North p newPanel b1 newButton 1 b2 newButton 2 badd newButton bequl newButton p add b1 p add b2 第二节委托模型 publicclasscal publicvoiddisplay p add badd p add bequl f add p f setSize 300 200 f setLocation 300 300 f setVisible true 输出为 第二节委托模型 importjava awt importjava awt event publicclasscalimplementsActionListener publicvoiddisplay b1 addActionListener this b2 addActionListener this badd addActionListener this bequl addActionListener this 第二节委托模型 importjava awt importjava awt event publicclasscalimplementsActionListener publicvoidactionPerformed ActionEvente if e getSource b1 text setText text getText e getActionCommand 委托模型 为了进行事件处理 需要创建实现Listener接口的类在某些Listener接口中 声明了很多抽象方法 为了实现这些接口 需要一一实现这些方法 委托模型 例如 在WindowListener接口中 声明了 windowClosing WindowEvente windowClosed WindowEvente windowOpened WindowEvente windowActivated WindowEvente windowDeactivated WindowEvente windowIconified WindowEvente windowDeiconified WindowEvente 第二节委托模型 importjava awt importjava awt event publicclassFLimplementsWindowListener Framef publicstaticvoidmain Stringargs newFL go publicvoidgo f newFrame f setSize 300 200 f addWindowListener this f setVisible true 第二节委托模型 publicclassFLimplementsWindowListener publicvoidwindowClosing WindowEvente System exit 0 publicvoidwindowClosed WindowEvente publicvoidwindowOpened WindowEvente publicvoidwindowActivated WindowEvente publicvoidwindowDeactivated WindowEvente publicvoidwindowIconified WindowEvente publicvoidwindowDeiconified WindowEvente 委托模型 在实际编程中 我们经常关心的是接口中的个别方法 为了编程方便 Java为那些声明了多个方法的Listener接口 提供了一个对应的适配器 Adapter 类 委托模型 publicabstractclassWindowAdapterimplementsWindwoListener publicvoidwindowClosing WindowEvente publicvoidwindowClosed WindowEvente publicvoidwindowOpened WindowEvente publicvoidwindowActivated WindowEvente publicvoidwindowDeactivated WindowEvente publicvoidwindowIconified WindowEvente publicvoidwindowDeiconified WindowEvente 第二节委托模型 importjava awt importjava awt event publicclassFLextendsWindowAdapter Framef publicstaticvoidmain Stringargs newFL go publicvoidgo f newFrame f setSize 300 200 f addWindowListener this f setVisible true publicvoidwindowClosing WindowEvente System exit 0 事件适配器 为了进行事件处理 需要创建实现Listener接口的类 例如在MouseListener接口中 声明了下述抽象方法 mouseClicked MouseEvent mousePressed MouseEvent mouseReleased MouseEvent mouseEntered MouseEvent mouseExited MouseEvent 在实现MouseListener接口的类中 必须同时实现这五个方法 为了方便 Java为那些声明了多个方法的Listener接口提供了一个对应的适配器 Adapter 类 事件适配器 接口及适配器 接口及适配器 在适配器类中实现了相应接口的全部方法 只是方法内容为空 例如MouseListener接口的形式如下 publicinterfaceMouseListenerextendsEventListener publicvoidmouseClicked MouseEvente publicvoidmousePressed MouseEvente publicvoidmouseReleased MouseEvente publicvoidmouseEntered MouseEvente publicvoidmouseExited MouseEvente 事件适配器 与其对应的适配器为MouseAdapter publicabstractclassMouseAdapterimplementsMouseListener publicvoidmouseClicked MouseEvente publicvoidmousePressed MouseEvente publicvoidmouseReleased MouseEvente publicvoidmouseEntered MouseEvente publicvoidmouseExited MouseEvente 事件适配器 在创建新类时 可以不实现接口 而是只继承某个适当的适配器 并且覆盖所关心的事件处理方法 事件适配器 例 importjava awt importjava awt event publicclassMouseClickHandlerextendsMouseAdapter 由于只关心对单击鼠标事件的处理 因此在这里继承MouseAdapter 以避免编写其他不需要的事件处理方法publicvoidmouseClicked MouseEvente 进行有关的处理 用内部类实现事件处理 内部类 innerclass 是被定义于另一个类中的类 使用内部类的主要原因是由于 一个内部类的对象可访问外部类的成员方法和变量 包括私有的成员 实现事件监听器时 采用内部类 匿名类编程非常容易实现其功能 内部类常常在AWT的事件处理机制中应用 用内部类实现窗口的关闭事件 importjavax swing importjava awt event publicclassWindowClosing publicstaticvoidmain String args JFrameframe newJFrame classQuitWindowextendsWindowAdapter publicvoidwindowClosing WindowEvente System exit 0 frame addWindowListener newQuitWindow frame setSize 200 300 frame show 匿名类 AnonymousClass 一个内部类的类声明只是在创建此类对象时用了一次 而且要产生的新类需继承一个已有的父类或实现一个接口 才能考虑用匿名类 匿名类本身无名 因此它没有构造方法 它需要显式地调用一个无参的父类的构造方法 并且重写父类的方法 所谓的匿名就是该类连名字都没有 只是显式地调用一个无参的父类的构造方法 用匿名类实现窗口的关闭事件 publicclassWindowClosing publicstaticvoidmain String args JFrameframe newJFrame frame addWindowListener newWindowAdapter publicvoidwindowClosing WindowEvente System exit 0 frame setSize 200 300 frame show 委托事件处理模型的优点 使不相关的组件可以重复执行同样的事件监听程序 可以创建过滤器 适配器 类将事件分类处理 更有利于在不同的类间进行分工合作 委托事件处理模型的优缺点 委托事件处理模型的缺点 较为复杂和难于理解 将JDK1 0程序代码转换到JDK1 1并非易事 尽管当前的JDK在支持委托事件处理模型的同时也支持层次事件处理模型 但两者不能混用 委托事件处理模型的优缺点 事件处理举例 1 一个事件源组件上可以同时注册多个监听器2 一个监听器对象可以同时注册到多个事件源组件上3 事件源的信息可以随它所触发的事件自动传递到所有注册过的监听器 importjava awt importjava awt event publicclassTestActionEvent2 publicstaticvoidmain Stringargs Framef newFrame Test Buttonb1 newButton Start Buttonb2 newButton Stop Monitor2bh newMonitor2 b1 addActionListener bh b2 addActionListener bh b2 setActionCommand gameover f add b1 North f add b2 Center f pack f setVisible true classMonitor2implementsActionListener publicvoidactionPerformed ActionEvente System out println abuttonhasbeenpressed therelativeinfois n e getActionCommand 鼠标事件 MouseEvent 鼠标事件MouseEvent对应于接口MouseListener 鼠标事件 MouseMotionEvent 鼠标事件MouseMotionEvent对应于接口MouseMotionListener 键盘事件 键盘事件KeyEvent对应的监听器接口KeyListener importjavax swing importjava awt event importjava awt publicclassMouseAndKeyDemoextendsJFrame intlastX 0 lastY 0 publicMouseAndKeyDemo super MouseAndKey setBackground Color white setForeground Color blue addMouseListener newMouseAdapter publicvoidmouseEntered MouseEvente requestFocus 请求界面获取焦点record e getX e getY publicvoidmousePressed MouseEvente record e getX e getY addMouseMotionListener newMouseMotionAdapter publicvoidmouseDragged MouseEvente intx e getX inty e getY Graphicsg getGraphics g drawLine lastX lastY x y 画线record x y addKeyListener newKeyAdapter publicvoidkeyTyped KeyEvente Strings String valueOf e getKeyChar getGraphics drawString s lastX lastY record lastX 12 lastY setSize 300 150 setVisible true setDefaultCloseOperation JFrame EXIT ON CLOSE publicvoidrecord intx inty lastX x lastY y publicstaticvoidmain String args newMouseAndKeyDemo java lang Object java awt GraphicsGraphics类是所有图形上下文的抽象基类 允许应用程序在组件 已经在各种设备上实现 以及闭屏图像上进行绘制 Graphics对象封装了Java支持的基本呈现操作所需的状态信息

温馨提示

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

评论

0/150

提交评论