Java程序设计(第3版)课件 单元4-任务3 计算器事件处理_第1页
Java程序设计(第3版)课件 单元4-任务3 计算器事件处理_第2页
Java程序设计(第3版)课件 单元4-任务3 计算器事件处理_第3页
Java程序设计(第3版)课件 单元4-任务3 计算器事件处理_第4页
Java程序设计(第3版)课件 单元4-任务3 计算器事件处理_第5页
已阅读5页,还剩49页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

任务三计算器事件处理单元四:图形用户界面程序设计教学目标知识目标Java委托事件处理机制。常用事件类;处理事件接口;动作事件。能力目标能会使用Java委托事件处理机制完成事件处理。运用编写事件处理程序的基本方法完成程序编写;应用按钮ActionEvent动作事件的处理进行程序设计。教学内容4任务陈述123知识准备任务实施任务拓展任务实训5 1.任务陈述任务描述实现计算器计算功能。在上个任务基础上,添加用户操作响应代码即事件处理代码,完成计算器功能,运行结果如下图所示: 2.知识准备Java事件处理机制如果用户在GUI层执行了一个动作,如点击了鼠标、输入了一个字符、选择了列表框中的一项等,将导致一个事件的发生Java事件处理,采用的是事件源——事件监听器模型的委托事件处理机制,无论应用程序还是小程序都采用这一机制

2.知识准备AWT事件模型:事件是EventObject子类的对象描述在某个时间,某个对象上,发生了某件事情通过鼠标、键盘与GUI界面直接或间接交互都会生成事件。如:按下一个按钮、通过键盘输入一个字符、选择列表框中的一项、点击一下鼠标等。事件不局限于界面操作,比如网络连接或断开等都可看作是事件任务中,ActionEvent的对象就是一个事件,描述在按钮上点击了鼠标

2.知识准备AWT事件模型:事件源是生成事件对象的对象用事件对象来描述自身状态的改变,即在某时刻,其上发生了什么事情可以通过回调规定接口对象,将事件发送给其他对象,以使其他对象对事件作出反应成为可能上例中,buttonGetNumber

就是事件源

2.知识准备AWT事件模型:监听器是对某类事件感兴趣,并希望做出响应的对象必须实现规定接口,此类接口称为监听器接口上例中,GuessExample2的对象就是监听器,实现了ActionListener接口,希望当在buttonGetNumber点击后生成一个随机数字 2.知识准备AWT事件模型——事件处理关键步骤:实现监听器接口,定义监听器类,在接口规定方法内实现事件处理逻辑创建监听器对象,将监听器添加到事件源事件发生,事件源回调监听器中相关方法 2.知识准备FocusEventAWTEventActionEventAdjustmentEventComponentEventTextEventItemEventContainerEventInputEventWindowEventPaintEventKeyEventMouseEventEventObject事件体系结构 2.知识准备事件类说明事件源ActionEvent通常按下按钮,双击列表项或选中一个菜单项时,就会生成此事件。Button、List、MenuItem、TextFieldAdjustmentEvent操纵滚动条时会生成此事件。ScrollbarComponentEvent当一个组件移动、隐藏、调整大小或成为可见时会生成此事件。ComponentItemEvent单击复选框或列表项时,或者当一个选择框或一个可选菜单的项被选择或取消时生成此事件。Checkbox、CheckboxMenuItem、Choice、ListFocusEvent组件获得或失去键盘焦点时会生成此事件。Component 2.知识准备事件类说明事件源KeyEvent接收到键盘输入时会生成此事件。ComponentMouseEvent拖动、移动、单击、按下或释放鼠标或在鼠标进入或退出一个组件时,会生成此事件。ComponentContainerEvent将组件添加至容器或从中删除时会生成此事件。ContainerTextEvent在文本区或文本域的文本改变时会生成此事件。TextField、TextAreaWindowEvent当一个窗口激活、关闭、失效、恢复、最小化、打开或退出时会生成此事件。

Window 2.知识准备事件类ActionEvent主要方法publicActionEvent(Object

source,int

id,String

command);String

getActionCommand();longgetWhen();publicObject

getSource();publicvoidsetSource(Object

newSource); 2.知识准备监听器通过实现java.awt.event包中定义的一个或多个接口来创建在发生事件时,事件源将调用监听器定义的相应方法有兴趣接收事件的任何监听器类都必须实现监听器接口 2.知识准备事件监听器方法ActionListener

actionPerformed

AdjustmentListener

adjustmentValueChanged

ComponentListener

componentResizedcomponentMovedcomponentShowncomponentHidden

ContainerListener

componentAddedcomponentRemoved

FocusListener

focusLost、focusGained

ItemListener

itemStateChanged

2.知识准备事件监听器方法KeyListener

keyPressed、keyReleasedkeyTyped

MouseListener

mouseClicked、mouseEnteredmouseExited、mousePressedmouseReleased

MouseMotionListener

mouseDragged、mouseMoved

TextListener

textChanged

WindowListener

windowActivated、windowDeactivatedwindowClosed、windowClosingwindowIconified、windowDeiconifiedwindowOpened

2.知识准备监听器接口定义InterfaceActionListener{ voidactionPerformed(ActionEvent

e);} 2.知识准备更多事件介绍焦点事件窗口事件鼠标事件…… 2.知识准备焦点事件任何GUI对象的获得或失去焦点都被视为焦点事件,并且事件源必须向事件监听器通知事件对象已失去或已获得焦点焦点监听器需要实现两个方法:focusGained和focusLost对组件输入数据要进行错误检查或范围校验时,对焦点的捕捉就显得尤其重要 2.知识准备FocusEvent

特有方法Component

getOppositeComponent()返回焦点变化事件中的另一组件booleanisTemporary()说明此事件是临时还是永久的String

paramString()获取说明此事件的一字符串 2.知识准备窗口事件当一个窗口被激活、禁止、关闭、正在关闭、最小化、恢复、打开时将生成窗口事件。需要实现的方法如下:windowActivated、windowDeactivatedwindowClosing、windowClosedwindowDeiconified、windowIconifiedwindowOpened 2.知识准备WindowEvent

特有方法intgetNewState()WINDOW_STATE_CHANGED事件的新状态intgetOldState()WINDOW_STATE_CHANGED事件的原状态Window

getOppositeWindow()焦点或激活事件的另一影响窗口Window

getWindow()事件创建窗口String

paramString() 2.知识准备键盘事件在按下或释放键盘上的一个键时,将生成键盘事件keyEvent类包含用来表示按下或点击的键的常量生成keyEvent时将调用keyListener如果程序需要处理特殊的键,如方向键,需要通过调用keyPressed()方法来处理 2.知识准备KeyEvent特有方法chargetKeyChar()

intgetKeyCode()static

String

getKeyText(int

keyCode)键码表VK_0……VK_9、

VK_A……VK_Z 2.知识准备鼠标事件任何时候移动、单击、按下或释放鼠标,都会生成鼠标事件。鼠标事件有两种监听器:MouseListener和MouseMotionListener。需要实现的方法如下:

mouseClicked、mouseEntered、mouseExitedmousePressed、mouseReleasedmouseDragged、mouseMoved 2.知识准备MouseEvent特有方法intgetButton()intgetX()intgetY()常量定义BUTTON1

、BUTTON2

、BUTTON3 2.知识准备publicvoidmouseClicked(MouseEventm){intx=m.getX();inty=m.getY();

intclickCount=m.getClickCount();if(clickCount==2){Graphicsg=getGraphics();g.drawString("鼠标双击!",x,y);g.dispose();}}

获得点击鼠标时鼠标指针的x及y坐标

确定单击和双击鼠标事件示例适配器类适配器类

事件监听器接口

ComponentAdapterComponentListenerContainerAdapterContainerListenerFocusAdapterFocusListenerKeyAdapterKeyListenerMouseAdapterMouseListenerMouseMotionAdapterMouseMotionListenerWindowAdapterWindowListener为了使事件处理变得简单,Java为具有多个方法的监听器接口提供适配器类。适配器类实现并提供了一个事件监听器接口中的所有的方法,但这些方法都是空方法。privateclassMyMouseAdapterextendsMouseAdapter{privateColorbgColor;

publicMyMouseAdapter(Colorc){bgColor=c;}

publicvoidmouseClicked(MouseEventmevent){setBackground(bgColor);repaint();

}}

匿名类匿名类就是没有指定名称的类可以便于编写事件处理程序classMyPanelextendsPanel{

publicMyPanel(){

ButtonbButton=newButton("蓝色");

add(bButton);bButton.addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEventmevent){setBackground(Color.blue);repaint();}});

} 3.任务实施实施思路与方案修改Calculator类定义使其实现ActionListener接口在actionPerformed方法中添加事件处理代码并且为每个按钮添加this(代表当前窗口对象)作为监听器 3.任务实施解决步骤,在本单元任务二中Calculator类的代码上,做如下修改:1)导入事件处理相关包java.awt.event.*2)修改Calculator类使其实现接口ActionListener3)增加actionPerformed方法,编写按钮点击处理代码,实现计算功能4)为每一个按钮对象添加当前Calculator类对象(this)作为监听器 3.任务实施同任务二相比,增加内容包括:publicclassCalculatorextendsJFrameimplementsActionListener{类声明增加了实现ActionListener接口 3.任务实施同任务二相比,增加内容包括:jb=newJButton(""+i);jb.addActionListener(this);keyPanel.add(jb);每个按钮对象都增加addActionListener(this);方法调用,将当前计算器窗口对象作为事件监听器 3.任务实施同任务二相比,增加内容包括:publicvoidactionPerformed(ActionEvente){……//重写ActionListener接口的这个方法//处理按钮点击事件,实现计算功能} 3.任务实施actionPerformed方法内容: //获取当前点击按钮文本

Stringcmd=e.getActionCommand();

//获取结果显示文本条文本

Stringc=result.getText(); //如果点击“清空”按钮,显示内容设为空 if(cmd.equals("清空")){ result.setText(""); } 3.任务实施actionPerformed方法内容:elseif(cmd.equals("退格")){ if(c.length()>0){ Stringslast=c.substring(c.length()-1); if(slast.equals("+")||slast.equals("-")||slast.equals("*")||slast.equals("/")){calculate_type=0;/*

如果删除了运算符,将计算类型恢复为未确定状态*/} result.setText(c.substring(0,c.length()-1));}} 3.任务实施actionPerformed方法内容://如果点击了数字或小数点按钮,在显示中增加//对应数字或小数点elseif(pareTo("0")>=0&&pareTo("9")<=0){ result.setText(c+cmd);}elseif(cmd.equals(".")){ result.setText(c+cmd);} 3.任务实施actionPerformed方法内容:elseif(cmd.equals("+")||cmd.equals("-")||cmd.equals("*")||cmd.equals("/")){ if(calculate_type==0){//自上次计算完成后,第一次点击运算符

result.setText(c+cmd); judgeCalculateType(cmd);//判断计算类型

} } 3.任务实施actionPerformed方法内容:else{ //自上次计算完成后,第二次点击运算符,触发计算

calculate(); result.setText(result.getText()+cmd); judgeCalculateType(cmd);//判断计算类型

}} 3.任务实施actionPerformed方法内容:elseif(cmd.equals("=")){//点击=进行计算

try{ calculate(); } catch(Exceptionexp){ JOptionPane.showMessageDialog(this,"输入错误,请检查输出或重新启动程序");}}} 3.任务实施judgeCalculateType方法内容: if(cmd.equals("+")) calculate_type=1;//记录运算类型

elseif(cmd.equals("-")) calculate_type=2; elseif(cmd.equals("*")) calculate_type=3; else calculate_type=4; 3.任务实施calculate方法内容:doublert,op1,op2;Stringc=result.getText();intpos;charops[]=newchar[]{'+','-','*','/'}; //查找运算符位置pos=c.indexOf(ops[calculate_type-1]); //以运算符位置为分界点分离出两个待计算的数op1=Double.parseDouble(c.substring(0,pos));op2=Double.parseDouble(c.substring(pos+1));

3.任务实施calculate方法内容: switch(calculate_type){ case1:rt=op1+op2;break; case2:rt=op1-op2;break; case3:rt=op1*op2;break; case4:rt=op1/op2;break; default:rt=0; } result.setText(""+rt);//显示计算结果

calculate_type=0; //准备记录下次计算的类型

4.任务拓展事件机制原理目的加深事件机制理解深入理解接口在合作开发中的作用真正学会使用接口合作开发的典型案例组件开发者组件使用者 4.任务拓展事件处理的任务当组件发生某种事件时,要设法通知组件使用者,并允许组件使用者做出个性化的处理组件使用者的不确定性定义组件的目的就是在组件设计完成后到处可以重复使用此组件。 因此,组件设计在前,组件使用在后。在定义组件类时,我们并不知道将来谁要使用此组件,从而也就无法确定谁要接收并处理此组件产生的事件。现在的任务就是要找一种办法,将事件消息正确的传递给将来的不确定的组件使用者。如下图所示 4.任务拓展事件源如:文本框(对象一)监视器如:主窗口(对象二)回车键在文本框上按下事件消息不能事先确定事件机制原理示意图 4.任务拓展事件处理要解决的问题如何知道谁要接收消息?如何传递消息?如何传递消息数据? 4.任务拓展如何知道谁要接收消息消息的接收者在使用组件时,先向该组件进行注册。为此,组件应实现注册方法。比如JTextField类的addActionListener()方法 4.任务拓展如何传递消息消息的接收者向组件注册,组件就拥有了消息接收对象的引用。向消息接收对象传递消息最自然的方法就是调用消息接收对象的一个方法,并通过方法

温馨提示

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

最新文档

评论

0/150

提交评论