还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
单元事件处理15swing JWI.)计算器事件处理单元目标♦理解Java委托事件处理机制;了解常用的事件类、处理事件的接口及接口中的方法;♦掌握编写事件处理程序的基本方法;♦♦熟练掌握对按钮的Action Event动作事件的处理学习任务
1.任务描述实现计算器的计算功能在上个任务的基础上,添加用户操作响应代码即事件处理代码,完成计算功能
2.运行结果知识准备
15.1Java事件事件是Eventobject子类的对象,描述在某个时间,某个对象上,a.)计算器事件处理发生了某件事情通过鼠标、键盘与GUI界面直接或间接交互都会生成事件如按下一个按钮、通过键盘输入一个字符、选择列表框中的一项、点击一下鼠标等事件不局限于界面操作,比如网络连接或断开等都可看作是事件事件源是生成事件对象的对象,用事件对象来描述自身状态的改变,即在某时刻,其上发生了什么事情可以通过回调规定接口对象,将事件发送给其他对象,以使其他对象对事件作出反应成为可能监听器是对某类事件感兴趣,并希望做出响应的对象,必须实现规定接口,此类接口称为监听器接口事件处理的关键步骤
1.实现监听器接口,定义监听器类,在接口规定方法内实现事件处理逻辑;
2.创建监听器对象,将监听器添加到事件源;
3.出发事件,事件源回调监听器中相关方法例如,当用户用鼠标点击一个按钮jb(JButton的对象)时,就会产生一个Action Event事件,此时按钮jb就是事件源如果要在计算器窗口类中响应按钮点击事件,计算器窗口就是监听器为了能够作为ActionEvent事件的监听器,Calculator类要实现接口ActionListener,添力口public void图立即注册信息合法4-3-2当用户输入完成后单击立即注册,判断密码和确认密码是否一致,如果不一致在立即注册按钮的上方显示“密码不正确”,运行结果如图4-3-3所示图立即注册信息不合法4-3-3利用Java Swing技术设干|-一个Email注册页面,要求不管是否调整窗口大小,最终的运行界面效果一致运行结果如图所示actionPerformedActionEvent e{}方法,并在该方法中编写按钮点击后要执行的代码接口ActionListener定义如下Interface ActionListener{void actionPerformedActionEvent e;然后将监听器添加到事件源,这里this代表的是Calculator类的当前对象,就是计算器窗口对象Action Event的主要方法String getActionCommand;获取事件的命令字符串,对按钮而言,该方法返回按钮上显示的文字通过getActionCommand返回结果可以知道用户点击了哪一个按钮public ObjectgetSource;该方法获取事件源对象引用如果界面中有多个按钮,通过将getSource结果和每一个按钮对象引用比较,可以知道用户点击了哪一个按钮引发的本次事件Java事件处理机制要理解事件处理机制,必须学会站在组件开发者和组件使用者这两个不同的角度来思考问题事件处理机制的任务是当组件发生某种事件时,要设法通知组件使用者,并允许组件使用者做出个性化的处理定义组件的目的就是在组件设计完成后到处可以重复使用此组件因此,组件设计在前,组件使用在后在定义组件类时,我们并不知道将来谁要使用此组件,从而也就无法确定谁要接收并处理此组件产生的事件现在的任务就是要找一种办法,将事件消息正确的传递给将来的不确定的组件使用者如图4-11所示图事件处理示意图4-11事件处理机制需要考虑的问题,有以下三个方面
1.要接收消息的对象消息的接收者在使用组件时,先向该组件进行注册为此,组件应实现注册方法比如JTextField类的addActionListener方法
2.消息传递方法向消息接收对象传递消息最根本的方法就是调用消息接收对象的一个方法,并通过方法参数将事件相关数据传递给消息接收对象而不管消息接收对象是何种类型,组件调用的方法必须是一致的,因为组件无法针对每一个消息接收对象进行特殊的方法调用对组件来说,最好所有消息接收对象看起来都是一样的,都是同一种类型,都支持相同的方法那么现在的问题就变成如何保证所有消息接收对象都都是同一种类型而又能进行各自不同的事件处理呢?如何约束消息接收者的行为?要保证所有消息接收对象都是同一种类型,一种方法就是定义一个类,要求所有消息接收对象都由此类的子类创建,这不是一个好办法,因为这限制了消息接收对象的继承层次更好的解决方案是使用接口即将事件处理方法,也就是组件向消息接收对象传递消息要调用的方法,定义在一个接口里然后强制注册对象必须实现此接口事先规定对象方法的形式,而不关心其具体实现,这正是接口的优势所在这种方法,不管注册对象是从哪个类派生的,从而保证了消息接收对象类层次定义的自由
3.传递数据的方法一种方法是直接通过传递方法的参数另一种方法,也是现在Java采用的面向对象的方法一一定义一个类来描述事件,当具体事件产生时,则创建一个此事件类的对象,将该对象作为参数进行传递以上事件处理机制实际上采用了一种应用非常普遍的接口回调思想其基本过程是规定回调接口;实现回调接口;回调接口对象注册;接口回调定义回调接口的对象,往往是要提供某种服务,但接受服务的对象又不能事先确定而要实现这种服务,服务对象又必须调用客户对象的方法一旦遇到这种情况,就可使用接口回调接口回调的应用不局限于事件处理比如,网络通讯中就经常使用现实生活中这样的例子也有很多,比如企业要先注册,然后实现一些标准接口如账目,然后工商税务就可对其进行税收管理等Java事件体系结构Java事件体系结构如图4-12所示,所有事件共同的父类是EventObject0Java把事件类大致分为两种语义事件semantic events与底层事件low-level evems语义事件直接继承自AWTEvent,如Action EventsAdjustmentEvent与ComponentEvent等底层事件则是继承自ComponentEvent类,如ContainerEvent FocusEventWindowEvent与KeyEvent等Java事件类的说明详见表4-5o图事件类体系图4-12表事件类的相关说明4-5Java事件类说明事件源通常按下按钮,双击列表项或选中一个菜单项、Button ListMenuitemActionEvent时,就会生成此事件TextField操纵滚动条时会生成此事件Adj ustmentEventScrollbar当一个组件移动、隐藏、调整大小或成为可见ComponentEvent Component时会生成此事件单击复选框或列表项时,或者当一个选择框或CheckboxItemEvent一个可选菜单的项被选择或取消时生成此事CheckboxMenuItem、件ChoiceList组件获得或失去键盘焦点时会生成此事件FocusEvent Component接收到键盘输入时会生成此事件KeyEvent Component拖动、移动、单击、按下或释放鼠标或在鼠标MouseEvent Component进入或退出一个组件时,会生成此事件将组件添加至容器或从中删除时会生成此事ContainerEvent Container件在文本区或文本域的文本改变时会生成此事TextEvent TextFieldTextArea件当一个窗口激活、关闭、失效、恢复、最小化、WindowEvent Window打开或退出时会生成此事件Java事件监听器和监听方法j如表4-6所示,每个接口内部包含了若干处理相关事件的抽象方法一般说来,每个事件类都有一个监听者接口与之相对应,而事件类中的每个具体事件类型都有一个具体的抽象方法与之相对应,当具体事件发生时,这个事件将被封装成一个事件类的对象作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件例如ActionListener,这个接口定义了抽象方法:public voidactionPerformedActionEvente凡是要处理Action Event事件的类都必须实现ActionListenero接口,并重写相应的actionPerformed方法表事件监听器和监听方法4-6Java事件监听器方法ActionListener actionPerformedAdjustmentListener adjustmentValueChanged、、componentResized componentMovedComponentListenercomponentShowncomponentHiddenContainerListener componentAddedcomponentRemovedFocusListener focusLostfocusGainedItemListener itemStateChanged、KeyListener keyPressedkeyReleased keyTyped、、、mouseClicked mouseEnteredmouseExitedMouseListenermousePressed mouseReleased、MouseMotionListener mouseDraggedmouseMovedTextListener textChanged、、window ActivatedwindowDeactivatedWindowListener windowClosedwindowCiosingwindowTconified windowDeiconifiedwindowOpened焦点事件焦点事件FocusEvento任何GUI对象的获得或失去焦点都被视为焦点事件,并且事件源必须向事件监听器通知事件对象已失去或已获得焦点焦点监听器需要实现两个方法focusGained和focusLosto对组件输入数据要进行错误检查或范围校验时,对焦点的捕捉就显得尤其重要其特有方法如下Component getOppositeComponent返回焦点变化事件中的另一组件boolean isTemporary说明此事件是临时还是永久的String paramString获取说明此事件的一字符串----------------------------------------------
15.
4.2窗口事件计算器事件处理窗口事件WindowEvent当一个窗口被激活、禁止、关闭、正在关闭、最小化、恢复、打开时将生成窗口事件窗口事件WindowEvent有七种类型,在WindowEvent类中定义了用来表示它们的整数常量,意义如下所示WINDOW_ACTIVATED窗口被激活;WINDOW_CLOSED窗口已经被关闭;WINDOW_CLOSING用户要求窗口被关闭;WINDOVV_DEACTIVATED窗口被禁止;WINDOW_DEICONIFIED窗口被恢复;WINDOWJCONIFIED窗口被最小化;WINDOW_OPENED窗口被打开使用接口WindowListener对相应的事件进行监听处理需要实现的方法如下window Activated、windowDeactivated、windowclosing、windowClosed、windowDeiconified、windowlconified windowOpenedoWindowListener接口对WindowEvent作监听处理,在这个接口中定义了七个方法当一个窗口被激活或禁止时,windowActivated方法和windowDeactivated方法将相应地被调用;如果一个窗口被最小化,windowlcon币ed方法将被调用;当一个窗口被恢复时,windowDelconified方法将被调用;当一个窗口被打开或关闭时,windowOpened方法或windowClosed方法将相应地被调用;当一个窗口正在被关闭时,windowClosing方法将被调用WindowEvent的特有方法如下int getNewStateWINDOW_STATE_CHANGED事件的新状态int getOldStateWINDOW_STATE_CHANGED事件的原状态Window getOppositeWindow焦点或激活事件的另一影响窗口Window getWindow事件创建窗口
15.
4.3文字事件文字事件使用类TextEvent来表示,使用接口TextListener对相应的事件进行监听处理TextEvent文字事件,当组件对象中的文字内容改变时,便会触发此事件TextEvent事件会发生在JTextField和JTextArea两种对象上TextListener接口对TextEvent作监听处理,当单行文本框JTextField或多行文本框JTextArea中的文本发生变化时,textValueChanged方法将被调用键盘事件键盘事件处理方法为public voidKeyPressedKeyEvent e处理按下键public voidKeyReleasedKeyEvent e处理松开键public voidKeyTypedKeyEvent e处理敲击键盘KeyEvent事件类的主要方法有public chargetKeyChar用来返回一个被输入的字符public StringgetKeyText用来返回被按键的键码public StringgetKeyModifiersText用来返回修饰键的字符串KevListener接口对KevFvent作监听处理,在这个接口中定义了三个方法:当一个键被按下和释放时,kevPressed方法和keyReleased方法将被调用;当一个字符被输入时,keyTyped方法将被调用public intgetKeyCode返回与此事件中的键相关联的整数keyCode□KeyEvent类包含用来表示按下或点击的键的常量键码keyCode是每个按键的编码,JDK帮助中可以查到每个按键对应的键码常量,如A对应于VK_A
15.
4.5鼠标事件任何时候移动、单击、按下或释放鼠标,都会生成鼠标事件MouseEvent鼠标事件对应两个接口MouseListener和MouseMotionListener MouseListener共有五个方法,主要用来实现鼠标的单击事件用于处理组件上的鼠标按下、释放、单击、进入和离开事件;接口MouseListener中的方法为:public voidmousePressedMouseEvent e处理按下鼠标左键public voidmouseClickedMouseEvent e处理鼠标单击public voidmouseReleasedMouseEvent e处理鼠标按键释放public voidmouseEnteredMouseEvent e处理鼠标进入当前窗口public voidmouseExitedMouseEvent e处理鼠标离开当前窗口MouseMotionListener有两个方法public voidmouseDraggedMouseEvent e处理鼠标拖动public voidmouseMovedMouseEvent e处理鼠标移动对应上述接口,对应的注册监听器的方法是addMouseListener和addMouseMotionListener□MouseEvent事件类中,有四个最常用的方法♦int getx返回事件发生时,鼠标所在坐标点的x坐标♦int gety返回事件发生时,鼠标所在坐标点的y坐标♦intgetclickCount返回事件发生时,鼠标的点击次数♦intgetButton返回事件发生时,哪个鼠标按键更改了状态当鼠标在同一点被按下并释放单击时,mouseClicked方法将被调用;当鼠标进入一个组件时,mouseEntered方法将被调用当鼠标离开组件时,mouseEx让ed方法将被调用当鼠标被按下和释放时,相应的mousePressed方法和mouseReleased方法将被调用当鼠标被拖动时,mouseDragged方法将被连续调用;当鼠标被移动时,mouseNloved方法将被连续调用MouseEvent的特有方法:int getButton用于获取鼠标按键信息;int getXint getY用于获取鼠标坐标位置按键常量定义BUTTON1,BUTTON
2.BUTTON3分别代表鼠标的三个按键有的鼠标只有两个按键例如public voidmouseClickedMouseEvent m{〃获得点击鼠标时鼠标指针的x及y坐标〃确定单击和双击ifclickCount==2{Graphics g=getGraphics;j}一计算器事件处理任务实施
1.实现思路修改Calculator类定义使其实现ActionListener接口,在actionPerformed方法中添加事件处理代码,并且为每个按钮添加this代表当前窗口对象作为监听器在任务二中Calculator类的代码上,做如下修改1导入事件处理相关包2修改Calculator类使其实现接口ActionListener3增加actionPerformed方法,编写按钮点击处理代码,实现计算功能4为每一个按钮对象添加当前Calculator类对象this作为监听器
2.程序代码//省略任务二中的相关代码public classCalculator extendsJFrame implementsActionListener{Calculator{//构造方法增加橙色代码JButton jb;forint i=1;i=9;i++{计算器事件处理,H,jb=new JButton+i;n Hjb=new JButtonO;jb=new JButton清空jb=new JButton“退格”;H Hjb=new JButton.;public voidactionPerformedActionEvente{〃按钮点击处理代码calculate;任务拓展常用事件举例加点说明,其他时间
1.鼠标产生的事件计算器事件处理public classCountClickextendsApplet{int CurrentMarks=O;public booleanmouseDownEventevt,intx inty{CurrentMarks++;Jrepaint;return true;public voidpaintGraphics g
2.键盘产生的事件例显示用户按下的字母键内容{char Presskey;yj”计算器事件处理public booleankeyDownEvent evt,int key{Presskey=charkey;repaint;return true;public voidpaintGraphics g任务实训
1.实训目的♦理解Java委托事件处理机制;了解常用的事件类、处理事件的接口及接口中的方法;♦掌握编写事件处理程序的基本方法;♦♦熟练掌握ActionEvent事件的处理
2.实训内容=二
①计算器事件处理利用Java Swing技术设iH■■一个Email邮箱地址注册的图形用户界面应用程序,运行结果如图4-3-1所示图注册4-3-1Email当用户输入完成后单击立即注册,判断密码和确认密码是否一致,如果一致在立即注册按钮的上方显示用户输入的邮件地址,运行结果如图4-3-2所示。
个人认证
优秀文档
获得点赞 0