




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章事件处理辽宁机电职业技术学院信息工程系软件教研室迟勇回顾简述下面UI界面使用容器嵌套构建的过程本章学习任务学习一个简单的按钮事件处理示例理解基于委托的事件处理机制了解Java中的各种事件处理类使用事件适配器类实现事件处理本章技能目标了解事件处理类型及层次学习各种事件监听器理解事件适配器的使用意义预习检查(1)--预习新单词单词释义单词释义DelegationEventHandleActionAdapterItem预习检查(2)从下面代码中找出:事件监听器接口事件源监听器注册监听器监听器接口中的方法事件类事件类的方法publicclassTextEventDemoextendsFrameimplementsTextListener{ TextFieldt1=newTextField(30); publicTextEventDemo(Stringtitle) { super(title); this.add(t1,"North"); t1.addTextListener(this);//为文本框t1注册文本监听器
}publicvoidtextValueChanged(TextEvente){ if(e.getSource()==t1)//判断是否在文本框上产生了文本事件
{ str=t1.getText(); }}}事件监听器接口事件源监听器注册监听器监听器接口中的方法事件类事件类的方法事件处理-内容目录事件处理概述事件处理示例事件适配器10.1事件处理(EventHandle)概述10.1.1Java基于委托的事件处理模型10.1.2事件处理及相关概念10.1.3Java的事件处理类10.1.4Java的事件及其监听器接口10.1事件处理(EventHandle)概述10.1事件处理(EventHandle)概述如果想要实现用户与组件的交互,就必须使用事件处理。例如,我们用鼠标点击按钮,希望界面会得到一定的反应。在这个过程中,用户在按钮上单击鼠标,按钮组件接收鼠标动作并对用户的动作做出响应,触发组件的鼠标单击事件。事件在对象间的传递是则是以消息(Message)进行传输。10.1.1Java基于委托的事件处理模型Java在事件处理的过程中,是围绕着一个称为“监听器”(Listener)的对象来进行的,事件的接收、判断和处理都是委托“监听器”来全权完成,这称为“基于委托的事件处理模型”(DelegationEventModel)。
Java的事件处理过程是这样的:程序中使用“监听器”对想要接收事件的组件进行监视,当用户动作触发事件时,“监听器”会接收到它所监听组件上的事件,然后根据事件类型,自行决定该使用什么方法来处理。在整个事件处理过程中,“监听器”都是关键的核心。事件处理的相关概念
事件处理及相关概念大致有:事件、事件接口、监听器、注册(添加)监听器、事件类、事件接口中的方法、事件类的方法。
事件是组件对用户的动作的响应。而响应用户动作并产生事件的组件就是事件源。如果组件有监听器监听,组件产生的事件就会以消息的形式传递给监听器。监听器根据监听到的事件类型,调用相应的方法去执行用户的需求。而事件类和事件类的方法的应用则在事件接口方法中体现。第9章示例9-9就是一个事件处理的例子。例10-1:简单的事件处理示例importjava.awt.*;importjava.awt.event.*;//导入事件处理类所在的类包//类EventHandle实现了事件监听器接口publicclassEventHandleextendsFrameimplementsActionListener{ TextFieldt1=newTextField(20); Buttonb1=newButton("登录");publicEventHandle(Stringtitle){ super(title); this.setLayout(newFlowLayout()); this.add(t1); this.add(b1); b1.addActionListener(this);//为按钮b1注册监听器this this.setSize(200,90); this.setVisible(true);}publicvoidactionPerformed(ActionEvente)//实现接口里的方法
{ if(e.getSource()==b1)//判断事件源是否是按钮b1 { t1.setText("大家好!"); }}publicstaticvoidmain(String[]args){ newEventHandle("事件处理简单示例");}}【运行结果】(显示如图所示的窗口,当单击“登录”按钮时,文本框显示字符串“大家好!”。)图10-1Java基于委托的事件处理模型流程下面我们把例10-1涉及的相关概念再对比列出,参照图10-1彻底掌握这些概念相关概念再对比概念相应代码段事件监听器接口ActionListener事件源b1监听器this注册监听器addActionListener(this);监听器接口中的方法actionPerformed()事件类ActionEvent事件类的方法getSource()表10-1事件相关概念对照那么什么样的对象有资格做“监听器”呢?;“监听器”对象的类需要实现指定的事件监听接口。一个监听器可以监听多个事件源,一个事件源也可以注册多个监听器注册监听器时使用addXXXlistener()方法,删除时则使用removeXXXlistener()方法(例如删除动作事件监听器可以使用removeActionlistener方法);10.1.3
Java的事件处理类Java的事件一般包括两种类型:用户事件和系统事件。用户事件:由用户动作引发的事件。例如,用户操作鼠标,按下键盘键等;系统事件:由操作系统发出的事件。例如,窗口状态变化时自动刷新窗口内容等。这里我们只探讨用户事件。图10-2AWT包的事件处理类层次AWT组件事件都是由java.awt.AWTEvent类派生得到,它也是EventObject类的子类。AWT事件共有12种类型,如图10-2所示10.1.4Java的事件及其监听器接口事件类别功能描述接口名接口中方法ActionEvent动作事件ActionListeneractionPerformed(ActionEvnete)TextEvent文本事件TextListenertextValueChanged(TextEvente)AdjustementEvent调整事件AdjustmentListeneradjustmentValueChanged(AdjustmentEvente)ItemEvent项目事件ItemListeneritemStateChanged(ItemEvente)FocusEvent焦点事件FocusListenerfocusGained(FocusEvente)focusLost(FocusEvente)ContainerEvent容器事件ContainerListenercomponentAdded(ContainerEvente)componentRemoved(ContainerEvente)ComponentEvent组件事件ComponentListenercomponentHidden(ComponentEvente)componentMoved(ComponentEvente)componentResized(ComponentEvente)componentShown(ComponentEvente)AWT事件类共有10类,相应监听器接口共有11个。它们的对应关系及功能如表10-2。事件类别功能描述接口名接口中方法WindowEvent窗口事件WindowListenerwindowActived(WindowEvente)windowClosed(WindowEvente)windowClosing(WindowEvente)windowDectivated(WindowEvente)windowDeiconified(WindowEvente)windowIconfied(WindowEvente)windowOpened(WindwEvente)MouseEvent鼠标事件MouseListenermouseClicked(MouseEvente)mouseEntered(MouseEvente)mouseExited(MouseEvente)mousePressed(MouseEvente)mouseReleased(MouseEvente)鼠标移动事件MouseMotionListenermouseDragged(MouseMotionEvente)mouseMoved(MouseMotionEvente)KeyEvent键盘事件KeyListenerkeyPressed(KeyEvente)keyReleased(KeyEvente)keyTyped(KeyEvente)表10-3部分事件类的常用方法事件类可产生事件的组件事件类的方法方法功能描述ActionEventButton,List,MenuItem,TextField等getActionCommand()返回与此动作相关的命令字符串。TextEventTextArea,TextFieldparamString()返回标识此文本事件的参数字符串。AdjustmentEventScrollbargetValue()getAdjustmentType()返回调整事件中的当前值。返回导致值更改的调整类型。ItemEventList,Choice,Checkbox,CheckboxMenuItemgetItem()getStateChange()返回受事件影响的项。返回状态更改的类型(选中或取消)。MouseEvent大部分组件getClickCount()getPoint()getX()getY()返回鼠标单击次数。返回鼠标事件相对于源组件的x、y位置。返回鼠标事件相对于源组件的水平x坐标。返回鼠标事件相对于源组件的垂直y坐标。KeyEvent大部分组件getKeyChar()getKeyCode()返回与按键相关联的字符。返回与按键相关联的键整数值。事件类的方法:包括从父类AWTEvent类中继承的方法和事件类本身特有的方法。事件类的静态整形成员属性每种事件类都有一些从父类AWTEvent类中继承下来的或是本身特有的静态整形成员属性,主要是一些描述当前组件的状态的值。如KeyEvent.VK_LEFT属性代表键盘“左箭头键”。部分成员属性会在后面的“事件处理示例”一节中提及。事件处理-内容目录事件处理概述事件处理示例事件适配器10.2事件处理示例10.2.1动作事件与项目事件10.2.2文本事件10.2.3键盘事件10.2.4鼠标事件10.2.5窗口事件10.2事件处理示例10.2.1动作事件与项目事件动作事件(ActionEvent)是由用户动作造成组件的动作(比如按下按钮)产生的,(注意:要使键盘在Button组件上触发ActionEvent,需使用空格键)。项目事件(ItemEvent)是由用户在具备项目选择能力的组件(比如列表框,选择框等)上触发。例10-2:ActionEvent与ItemEvent示例(要求:从列表框中选择项目,单击按钮时,选中的项目显示在文本框中)其中ActionEvent由ActionListener接口的actionPerformed()方法处理;ItemEvent由ItemListener接口的itemStateChanged()方法处理。MultiListener.java程序代码importjava.awt.*;importjava.awt.event.*;//类MultiListener实现了两个接口publicclassMultiListenerextendsFrameimplementsActionListener,ItemListener{Listlist=newList(4,true);TextFieldt1=newTextField(20);Buttonb1=newButton("显示");Panelp=newPanel();Strings[]={“篮球”,“足球”,“乒乓球”,“羽毛球”};//初始化爱好内容
intnum=0;//选择爱好的个数publicMultiListener(Stringtitle){ super(title); for(inti=0;i<4;i++)//向列表框中添加爱好 list.add(s[i]); p.add(newLabel("您选择的爱好是:")); p.add(t1); p.add(b1); this.add(list,"Center"); this.add(p,"South"); b1.addActionListener(this);//为按钮b1注册动作监听器 list.addItemListener(this);//为列表框list注册项目监听器 pack();//紧凑窗体 this.setVisible(true);}publicvoidactionPerformed(ActionEvente){ if(e.getSource()==b1)//判断是否单击了按钮b1 { Stringstr[]=list.getSelectedItems();//获取列表框中所有选择的项目,存入字符串数组str中 Stringstr_show="";//将要显示在文本框中的字符串 for(inti=0;i<str.length;i++) str_show=str_show+str[i]+",";//将所有爱好字符串连接到str_show字符串 t1.setText(str_show);//在文本框t1中显示爱好字符串
} }publicvoiditemStateChanged(ItemEvente){ if(e.getStateChange()==1)//判断列表框中是否有项目被选择 { num++;//爱好数加1 t1.setText("您选中了"+num+"个爱好!"); } if(e.getStateChange()==ItemEvent.DESELECTED)//判断列表框中是否有项目被取消选择 { num--;//爱好数减1 t1.setText("您取消了一个爱好!"); }}publicstaticvoidmain(String[]args){ newMultiListener("多接口示例!");}}运行结果【运行结果】(显示如图1所示的窗口,当选择列表框中的爱好时,文本框显示你选择的爱好的个数。)(图1)(当单击“显示”按钮时,显示如图2所示的窗口,文本框显示你选择的爱好。)(图2)10.2.2文本事件文本组件(如TextField,TextArea)在文本内容发生改变时(如键入,删除字符时),会产生TextEvent类型事件。处理TextEvent的接口是TextListener,接口中的方法textValueChanged(TextEvente)importjava.awt.*;importjava.awt.event.*;importjava.util.StringTokenizer;//StringTokenizer类在util包中publicclassTextEventDemoextendsFrameimplementsTextListener{ TextFieldt1=newTextField(30); Labellab=newLabel(""); Stringstr=""; StringTokenizerst; publicTextEventDemo(Stringtitle) {super(title); this.add(t1,"North"); this.add(lab,"South"); t1.addTextListener(this);//为文本框t1注册文本监听器
this.pack();//紧凑窗口
this.setVisible(true); }publicvoidtextValueChanged(TextEvente){ if(e.getSource()==t1)//判断是否在文本框上产生了文本事件
{ str=t1.getText(); st=newStringTokenizer(str,"'.?");//以空格、单引号、句号、问号做为分隔符分析str字符串有多少字符串子段
intnum=st.countTokens();//计算句子中单词的个数
lab.setText("现在单词个数:"+num+"个"); this.add(lab,"South"); }}publicstaticvoidmain(String[]args){ newTextEventDemo("实时单词计算");}}运行结果】(显示如图所示的窗口,当在文本框中输入句子时,标签中会显示句子中单词的个数。)10.2.3键盘事件当在事件源组件上按下键盘键时会发生KeyEvent。在KeyListener接口中有三个方法:keyPressed()、keyTyped()、keyReleased()。keyPressed()方法处理键盘键按下,keyReleased()方法处理键盘键释放,keyTyped()方法是keyPressed()方法与keyReleased()方法的组合,当键盘键按下后又释放就会调用keyTyped()方法。Java如何判断是那个键被按下呢?表10-4列举了部分KeyEvent类中定义的静态常量(注意:表中常量都是publicstaticfinalint型)。表10-4KeyEvent类中的静态常量键码常量对应功能键对应整形常量VK_F1~VK_F12功能键F1-F12112~123VK_LEFT向左箭头键37VK_UP向上箭头键38VK_RIGHT向右箭头键39VK_DOWN向下箭头键40VK_KP_LEFT数字键盘向左方向键226VK_HOMEHOME键36VK_ENTER回车键10VK_TAB制表位键9VK_BACK_SPACE退格键8VK_SHIFTShift键16VK_CONTROLCtrl键17VK_ALTAlt键18VK_SPACE空格键32VK_0~VK_9数字0~9键48~57VK_A~VK_Z字母a~z键65~90表10-5KeyEvent类中的方法方法功能描述getKeyChar()返回与此事件中的键相关联的字符。getKeyCode()返回与此事件中的键相关联的整数keyCode。getKeyModifiersText(intmodifiers)返回描述组合键的String,如“Shift”或“Ctrl+Shift”。getKeyText(intkeyCode)返回描述keyCode的String,如“F1”或“A”。例10-4:KeyEvent中的按键示例(要求在窗体中按下键盘键时,文本框中会显示响应的键名)importjava.awt.*;importjava.awt.event.*;publicclassKeyEventDemoextendsFrameimplementsKeyListener{ TextFieldt1=newTextField(25); Labellab=newLabel("在窗口中按下键盘键,会显示相应键码"); Panelp=newPanel();publicvoidkeyPressed(KeyEvente){ t1.setText(""); t1.setText(e.getKeyText(e.getKeyCode()));//获取并显示按键信息}publicvoidkeyTyped(KeyEvente){}//必须重写publicvoidkeyReleased(KeyEvente){}//必须重写publicKeyEventDemo(Stringtitle){ super(title); t1.setEditable(false);//设置文本框t1为不可编辑 p.add(lab); p.add(t1); add(p); this.addKeyListener(this);//为窗体注册监听器 setSize(220,100); setVisible(true); this.requestFocus(true);//将焦点设置在窗体上,此句为必须}publicstaticvoidmain(String[]args){ newKeyEventDemo("KeyEvent中的按键示例");}}运行结果【运行结果】(显示如图所示的窗口,当焦点在当前窗口上,并按下键盘键Alt时,文本框显示你按键的键名字符串“Alt”。)10.2.4鼠标事件当鼠标按下、释放、进入、离开组件,或在组件上方移过、拖曳时都会发生鼠标事件。鼠标事件大致分为两类:普通鼠标事件(鼠标按下、释放、进入、离开)和鼠标拖动事件(鼠标移过、拖曳)。分别由两个接口处理,其中MouseListener接口处理普通鼠标事件(接口中包含5个方法),MouseMotionListener接口处理鼠标拖动事件(接口中包含2个方法),参考表10-2。例10-6:MouseListener接口示例(要求:可以记录窗口上鼠标按下、释放、进入、离开和单、双击的位置)importjava.awt.*;importjava.awt.event.*;publicclassMouseListenerDemoextendsFrameimplementsMouseListener{ Labelmessage=newLabel("这里显示鼠标动作");publicMouseListenerDemo(Stringtitle){ super(title); this.add(message,"North"); this.addMouseListener(this); this.setSize(200,150); this.setVisible(true);}例10-6:MouseListener接口示例publicvoidmousePressed(MouseEvente){//重写接口的方法
message.setText("鼠标被按下,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseReleased(MouseEvente){ message.setText("鼠标被释放,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseEntered(MouseEvente){ message.setText("鼠标已进入,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseExited(MouseEvente){ message.setText("鼠标已退出,位置在:"+e.getX()+","+e.getY()); }publicvoidmouseClicked(MouseEvente){ if(e.getClickCount()==1){//判断鼠标击键的次数是否为单击
message.setText("鼠标单击,位置在:"+e.getX()+","+e.getY()); } if(e.getClickCount()==2){//判断鼠标击键的次数是否为双击
message.setText("鼠标双击,位置在:"+e.getX()+","+e.getY()); } }publicstaticvoidmain(String[]args){ newMouseListenerDemo("鼠标MouseListener接口示例"); }}运行结果【运行结果】(显示窗口如图所示,当在窗体中鼠标键按下、释放、进入、离开和单、双击时,会显示鼠标动作的发生位置。)例10-7:MouseMotionListener接口示例importjava.awt.*;importjava.awt.event.*;publicclassMouseMotionListenerDemoextendsFrameimplementsMouseMotionListener{Buttonb1=newButton("Movehere!");publicMouseMotionListenerDemo(Stringtitle){ super(title); this.setLayout(newFlowLayout()); this.add(b1); b1.addMouseMotionListener(this);//为按钮注册监听器 this.addMouseMotionListener(this);//为窗体注册监听器 this.setSize(200,100); this.setVisible(true);}publicvoidmouseMoved(MouseEvente){//重写接口方法 /*为按钮b1设置手型鼠标光标*/ b1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));}publicvoidmouseDragged(MouseEvente){//重写接口方法 /*为当前窗体设置等待型鼠标光标*/ this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));}publicstaticvoidmain(String[]args){ newMouseMotionListenerDemo("鼠标MouseMotionListener接口示例");}}运行结果【运行结果】(当鼠标经过窗体中的按钮上方时,显示窗口如下图所示)(当鼠标在窗体中拖曳时,显示窗口如下图所示)10.2.5窗口事件窗体做为GUI界面的顶级容器,可以产生打开、关闭、激活、图标化等事件,在WindowListener接口中包含7个方法,见表10-2表10-5详细介绍了这7个方法的功能。方法功能描述windowOpened(WindwEvente)窗体首次打开时调用windowClosed(WindowEvente)窗体调用dispose而关闭时调用windowActived(WindowEvente)将窗体设置为活动窗体(焦点在此窗体)时调用windowDectivated(WindowEvente)将窗体设置为非活动窗体(焦点不在此窗体)时调用windowIconfied(WindowEvente)窗体从正常状态变为最小化图标状态时调用windowDeiconified(WindowEvente)窗体从正常状态变为最小化图标状态时调用windowClosing(WindowEvente)试图从窗体的系统菜单中关闭窗口时调用例10-8:WindowListener接口示例importjava.awt.*;importjava.awt.event.*;publicclassWindowListenerDemoextendsFrameimplementsWindowListener,ActionListener{TextAreatxtMsg=newTextArea(6,30);ButtonbtnClose=newButton("关闭窗口");WindowListenerDemo(Stringtitle){super(title);add(txtMsg,"Center");add(btnClose,"South");btnClose.addActionListener(this);//注册Action事件监听器addWindowListener(this);//注册Window事件监听器pack();setVisible(true);}publicvoidactionPerformed(ActionEvente)//按钮事件处理方法{System.exit(0);//终止JVMthis.dispose();//释放窗体占用的资源}//以下7个方法为处理WindowListener中的方法publicvoidwindowOpened(WindowEvente)//窗口打开时执行{txtMsg.append("您已经打开了窗体!"+"\n");}publicvoidwindowClosed(WindowEvente){}//未使用publicvoidwindowIconified(WindowEvente){...}//窗口图标化时执行
publicvoidwindowDeiconified(WindowEvente){...}//窗口恢复常规显示时执行publicvoidwindowActivated(WindowEvente){...}//窗口激活时执行publicvoidwindowDeactivated(WindowEvente){...}//窗口处于非活动状态执行
publicvoidwindowClosing(WindowEvente)//关闭窗口时执行{System.exit(0);dispose();}publicstaticvoidmain(String[]args){newWindowListenerDemo("窗口事件应用");}}运行结果【运行结果】(如下图所示的窗口经过了打开、失去焦点、图标化等操作)事件处理-内容目录事件处理概述事件处理示例事件适配器10.3事件适配器(EventAdapter)在很多应用中,并不是事件接口中所有的方法都会被用户使用,但是还要全
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电线电缆在数据中心和高频通信中的应用考核试卷
- 贵金属压延加工模具设计与制造考核试卷
- 车载设备智能驾驶辅助系统性能测试考核试卷
- 运输设备绿色制造与资源循环利用考核试卷
- 自行车与城市美容护肤考核试卷
- 蔬菜种植区气候适应性分析考核试卷
- 渔业资源调查方法与技巧考核试卷
- 船舶货物运输市场与供应供应链研究及企业实践案例考核试卷
- 学校秋冬季传染病防控工作指南
- 混凝土外加剂产品检测与市场推广合作协议
- 完整版江苏省政府采购专家库入库考试题库(1-4套卷)
- 高校考试制度的弊端与改革
- ERAS理念在妇科围手术期中的应用
- 《中心静脉置管术》课件
- 高级教师职称面试讲课答辩题目及答案
- 牛安全生产技术-牛常见心血管系统疾病的防治
- 2023新能源风电工程项目文档全过程控制与档案整理规定
- 口腔颌面颈部局部解剖-颈部局部解剖(口腔解剖生理学课件)
- (完整word版)口腔正畸案例分析
- 铝合金门窗工程技术规范
- 人教鄂版小学科学二年级下册10《自然世界与人工世界》
评论
0/150
提交评论