




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实训项目Java电子计算器【需求分析】在日常生活中经常需要用到计算器,比如科学计算、数值计算、会计业务等,在Applet中实现一个精巧实用的计算器,可以让用户在使用网站服务的同时,可以很方便地进行数据运算,可增加页面的实用性,同时让用户的操作也更方便与快捷。本项目需要实现一个简单的四则运算的计算器,拥有加、减、乘、除功能。【项目目的】理解并掌握Java中的类、对象、继承、方法等概念,以及Applet的基本框架和事件处理的方法。学会使用JDK编写、调试和运行Java Applet应用程序。利用awt组件编写一个计算器,实现基本的四则运算。【项目分解】1、 界面设计整个界面由3个面板组成,第1个面板放置输入信息和运算结果的显示文本域以及一个清除输入的按钮。setLayout方法用于设置容器的布局管理器,这里采用流布局,即FlowLayout,所有放置的组件按大小依次排列。第2个面板放置数字按钮、点按钮及等于按钮。在for循环中,依次实例化9个数字按钮,并将按钮用add方法加入到第2面板中。setForeground方法可为组件设置前景色,这里将按钮文字设置为红色(Color.red)显示,以将功能按钮与数字按钮区分开来。第3个面板放置4个运算符:加、减、乘、除。最后,将3个面板放置到Applet中,Applet按照FlowLayout布局,依次加入的3个面板会按照加入的顺序及它们的尺寸放置到合适的位置。2事件处理事件处理流程如下图所示:事件处理通过action方法来完成,方法体如下所示:public boolean action(Event e, Object o) 可通过Event类的target变量来获取事件来源,如下面的语句,将e.target与等于按钮bEqual相比较,如果相符,则事件来源于等于按钮,这里应调用对应的方法处理运算结果,并显示出来。if(e.target = bEqual) doOperator();初始化过程:(1)定义相关组件和变量(2)Applet的初始化(init)(3).事件处理 (actionPerformed)(4).其他自定义方法方法:doOperator,doClear, doForeText按钮输入的处理过程如下:(1)输入数据ForeText(2)输入运算符CurrentOpForeTextBackText(第一运算数), ForeText=CurrentOpPreOp(3)输入数据ForeScreen(4)输入运算符OpCurrent3. 数值运算从输入得到的都是字符串,在运算之前,需要转换成其他数据类型。这里,需要将字符串转换成double值。首先,从字符串得到一个Double类的实例,以该实例的doubleValue方法可得与字符串对应的double值。也可以用Double类的parseDouble方法直接从字符串得到double值。在if语句中,将运算符与字符“”比较,得到运算类型,如果为加,则直接将两者相加,得到运算结果,并通过setText方法将结果显示在文本域中。源代码清单:import java.awt.*;import java.applet.*;public class Calculator extends Applet TextField tfAnswer; /显示输入和结果的文本域 Button bPoint,bEqual,bPlus,bMinus,bClear,bMulti,bDivision; /运算符按钮 Button b=new Button10; /数字按钮 String currentOp,preOp; /当前操作和上一步操作 String foreText,backText; /当前输入和上一次输入 boolean isFloat = false; /运算类型标志 public void init() Panel panel1=new Panel(); /实例化面板 Panel panel2=new Panel(); Panel panel3=new Panel(); currentOp = new String(); /实例化各组件 preOp = new String(); foreText = new String(); backText = new String(); tfAnswer = new TextField(8); setBackground(Color.lightGray); /设置Applet背景色 setForeground(Color.blue); /设置Applet前景色 for(int i=9;i=0;i-) bi=new Button(Integer.toString(i); /实例化数字按钮 panel2.add(bi); /增加按钮到面板 bPoint = new Button(.); /实例化按钮 bEqual = new Button(=); bEqual.setForeground(Color.red); /设置按钮前景色 bClear = new Button(清除); bClear.setForeground(Color.red); bDivision = new Button(/); bDivision.setForeground(Color.red); bMulti = new Button(*); bMulti.setForeground(Color.red); bMinus = new Button(-); bMinus.setForeground(Color.red); bPlus = new Button(+); bPlus.setForeground(Color.red); setLayout(new FlowLayout(); /设置布局管理器 panel1.setLayout(new FlowLayout(); panel2.setLayout(new GridLayout(4,3); panel3.setLayout(new GridLayout(4,1); panel1.add(tfAnswer); /增加组件到面板 panel1.add(bClear); panel2.add(bPoint); panel2.add(bEqual); panel3.add(bPlus); panel3.add(bMinus); panel3.add(bMulti); panel3.add(bDivision); add(panel1); /增加组件到Applet add(panel2); add(panel3); public boolean action(Event e, Object o) /事件处理 String s = new String(); for(int i=0;i10;i+) if(e.target=bi|e.target=bPoint) /按钮事件来自于数字按钮和点按钮 if(e.target != bPoint) s = (String)o; doForeText(s); /处理输入 if(e.target = bPoint)&(!isFloat) /浮点数输入 isFloat = true; /设置运算标志 s = (String)o; if(foreText.equals() foreText += 0.; /增加小数点前面0 else doForeText(s); if(e.target = bClear) doClear(); /清除输入 if(e.target = bMulti)|(e.target = bDivision)| (e.target = bPlus)|(e.target = bMinus) /处理运算 if(foreText != ) currentOp = (String)o); doOperator(); /处理运算 else preOp = (String)o); if(e.target = bEqual) /等于按钮事件处理 doOperator(); /处理运算 return true; public void doOperator() double dFore,dBack; Double d; if(preOp.equals() backText = foreText; foreText = ; tfAnswer.setText(backText); /显示文本 else dFore = (new Double(foreText).doubleValue(); /得到第一输入 dBack = (new Double(backText).doubleValue(); /得到第二输入 foreText = ; backText = tfAnswer.getText(); if(preOp.equals(+) /加运算处理 d = new Double(dBack + dFore); /得到运算结果 tfAnswer.setText(d.toString(); /显示运算结果 backText = d.toString(); if(preOp.equals(-) d = new Double(dBack - dFore);/得到运算结果 tfAnswer.setText(d.toString(); /显示运算结果 backText = d.toString(); if(preOp.equals(*) d = new Double(dBack * dFore);/得到运算结果 tfAnswer.setText(d.toString();/显示运算结果 backText = d.toString(); if(preOp.equals(/) if (dFore=0) tfAnswer.setText(除数不能为0); /显示出错信息 return; d = new Double(dBack / dFore);/得到运算结果 tfAnswer.setText(d.toString();/显示运算结果 backText = d.toString(); /Math.sin(); preOp = currentOp; public void doForeText(String s) foreText += s; tfAnswer.setText(foreText); /显示输入 public void doBackText(String s) backText = foreText; foreText = ; tfAnswer.setText(foreText); /显示输入 public void doClear() /清除输入 currentOp = ; preOp = ; foreText = ; backText = ; isFloat = false; tfAnswer.setText(); 【相关知识】由于同一个事件源上可能发生多种事件,因此java采取了授权处理机制(Delegation Model),事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。比如在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以授权给事件处理者一来处理鼠标事件,同时授权给事件处理者二来处理键盘事件。有时也将事件处理者称为监听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对的接口。例如类ButtonHandler之所以能够处理ActionEvent事件,原因在于它实现了与ActionEvent事件对应的接口ActionListener。每个事件类都有一个与之相对应的接口。将事件源对象和事件处理器(事件监听器)分开。如图所示使用授权处理模型进行事件处理的一般方法归纳如下:1对于某种类型的事件XXXEvent, 要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXXListener;2事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener ) 方法来注册监听器。 与AWT有关的所有事件类都由java.awt.AWTEvent类派生,它也是EventObject类的子类。AWT事件共有10类,可以归为两大类:低级事件和高级事件。java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。 低级事件ComponentEvent( 组件事件:组件尺寸的变化,移动) ContainerEvent( 容器事件:组件增加,移动) WindowEvent( 窗口事件:关闭窗口,窗口闭合,图标化) FocusEvent( 焦点事件:焦点的获得和丢失) KeyEvent( 键盘事件:键按下、释放) MouseEvent( 鼠标事件:鼠标单击,移动) 高级事件(语义事件)ActionEvent(动作事件:按钮按下,TextField中按Enter键)AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值)ItemEvent(项目事件:选择项目,不选择项目改变)TextEvent(文本事件,文本对象改变) 每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。例如,与键盘事件KeyEvent相对应的接口是:public interface KeyListener extends EventListener public void keyPressed(KeyEvent ev);public void keyReleased(KeyEvent ev);public void keyTyped(KeyEvent ev);注意到在本接口中有三个方法,那么java运行时系统何时调用哪个方法?其实根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法执行了。当键盘刚按下去时,将调用keyPressed( )方法执行,当键盘抬起来时,将调用keyReleased( )方法执行,当键盘敲击一次时,将调用keyTyped( )方法执行。又例如窗口事件接口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建省晋江市潘径中学2026届英语九年级第一学期期末教学质量检测模拟试题含解析
- 云南省镇康县第一中学2024-2025学年高二上学期11月月考历史试卷
- 2025年轨道车司机(高级技师)职业技能鉴定考试题库(含答案)
- 江苏省江阴市长寿中学2026届九上化学期中预测试题含解析
- 2026届山西省晋中市九年级化学第一学期期中质量跟踪监视试题含解析
- 柳州市重点中学2026届九年级化学第一学期期中检测试题含解析
- 租赁场地开办幼儿园合同范本(包含装修条款)
- 高层建筑空调系统销售、安装及安全运行合同
- 汽车行业售后担保合同质量保障与消费者权益保护
- 离婚协议:夫妻感情破裂与子女抚养协议
- 部编小学语文单元作业设计四年级上册第八单元
- 班组长质量管理意识培训
- 陈旭大卫不可以 省赛一等奖
- 透析器分类和选择课件
- 中医护理技术在急危重病人中的应用
- 机器人动力学培训课件
- 美容整形瘢痕修复培训
- 自动化腹膜透析的临床应用课件
- 食堂投诉处理、消防、治安及意外事故处理方案
- 《荷塘月色》 省赛获奖
- 部编人教版四年级语文下册《全册课件》完整版
评论
0/150
提交评论