版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java计算器实验报告计算机032
胡勇健
03095218
2005年5月5日1.设计名称与要求2.各模块功能的介绍和实现3.系统的特色和不足4.参考书实验名称及其要求:A)名称:java计算器的设计B)要求:1.实验目的:图形界面设计。熟悉java.awt包中的组件,掌握图形界面设计方法,理解委托事件处理模型。2.题意:请设计并实现Windows系统中“计算器”的窗口及功能。3.实验要求:(1)设计图形界面添加菜单:窗口上添加各种组件及菜单,并处理组件及菜单的事件监听程序。(2)运算:实现多种运算,保证运算正确性。二. 各模块功能的介绍和实现:A)GUI图形界面的组件:a)所用到的Java类库包:java.awt.*;java.awt.event.*;javax.swing.*;java.awt.datatransfer.*;基本的图形界面组件来源于awt包。事件的属性处理来源于awt.event包。swing组件增加了awt包中所不具备的各种优越功能。用于计算器与外部的程序进行复制粘贴。b)所用的各部分图形组件的定义:FramemainFrame;//主框架JTextFieldanswerText;//显示计算结果JTextFieldmemoryState;//显示计算器内存的使用情况MenuBarmenuGroup;//菜单栏MenueditMenu,viewMenu,helpMenu;//编辑,查看,帮助菜单MenuItemcopyItem,pasteItem;//复制,粘贴MenuItemstandardModel;//标准型CheckboxMenuItemnumGroup;//数字分组MenuItemaboutCal;//关于计算器ButtonbuttonBackSpace,buttonCE,buttonC;//退格,清除,清空按钮Button buttonMC,buttonMR,buttonMS,buttonMADD;//内存操作按钮ButtonbuttonNum[];//数字按钮ButtonbuttonAdd,buttonSub,buttonMul,buttonDiv;//+,-,*,/ButtonbuttonDot,buttonSign,buttonEqual;//.+/-=ButtonbuttonSqrt,buttonMod,buttonReciprocal;//sqrt%1/xc)组件的初始化以及对界面的排版对主框架的初始化操作voidinitMainFrame()函数是对主框架进行初始化,设置其框架大小270*250,初始位置270*250,背景颜色Color.lightGray,是否显示true,能否改变窗口大小false,以及增加了addWindowListener委托事件,当关闭窗口时调用System.exit(O)系统指令,结束程序。voidinitMainFrame(){mainFrame=newFrame("计算器");mainFrame.setSize(270,250);mainFrame.setLocation(200,140);mainFrame.setBackground(Color.lightGray);mainFrame.setResizable(false);mainFrame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}对文本框的初始化操作initTextField()是对文本textBufferanswerTextmemoryState的初始化,textBuffer是用于对文本的缓冲处理,StringBuffer类优于String类是因为StringBuffer是对字符串直接操作,从而节省了内存。由于在这个计算器程序中,对字符串的操作量很大因此,StringBuffer在这方面体现出了其本身的优势。answerText和memoryState用swing的组件JTextField是因为JTextField显示文本框时可以在文本框的右边显示,符合Windows自带计算器的特点。answerText和memoryState的背景色为白色,都不能进行编辑。answerText为右对齐,大小为23个字符,而memoryState为2个字符。voidinitTextField(){textBuffer=newStringBuffer("");answerText=newJTextField(textBuffe.rtoString(),23);answerText.setHorizontalAlignment(JTextField.RIGHT);answerText.setEditable(false);answerText.setBackground(Color.white);memoryState=newJTextField(2);memoryState.setEditable(false);memoryState.setBackground(Color.white);}对各按钮的初始化操作initButtons()函数是对各按钮进行初始化,为每一个按钮增加其标签并增加了addActionListener(this)功能,用于给各按钮增加属性,具体的功能代码,请见actionPerformed(ActionEvente);其中,数字按钮、四则运算按钮、小数点按钮都增加了键盘输入功能addKeyListener其参数为匿名类KeyListener的适配器newKeyAdapter(),当在键盘上按下相应的键时,为其增加相应的属性功能。voidinitButtons(){buttonBackSpace=newButton("BackSpace");buttonBackSpace.addActionListener(this);buttonCE=newButton("CE");buttonCE.addActionListener(this);buttonC=newButton("C");buttonC.addActionListener(this);buttonMC=newButton("MC");buttonMC.addActionListener(this);buttonMR=newButton("MR");buttonMR.addActionListener(this);buttonMS=newButton("MS");buttonMS.addActionListener(this);buttonMADD=newButton("M+");buttonMADD.addActionListener(this);buttonNum=newButton[10];for(inti=0;i<buttonNum.length;i++){buttonNum[i]=newButton(Integer.toString(i));buttonNum[i].addActionListener(this);buttonNum[i].addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){
if(Character.isDigit(e.getKeyChar())){textBuffer.append(e.getKeyChar());answerText.setText(textBuffe.rtoString());AddNum();});}buttonAdd=newButton("+");buttonAdd.addActionListener(this);buttonAdd.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='+')AddFunction(1);}});buttonSub=newButton("-");buttonSub.addActionListener(this);buttonSub.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='-')AddFunction(2);}});buttonMul=newButton("*");buttonMul.addActionListener(this);buttonMul.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='*')
AddFunction(3);}});buttonDiv=newButton("/");buttonDiv.addActionListener(this);buttonDiv.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='/')AddFunction(4);}});buttonDot=newButton(".");buttonDot.addActionListener(this);buttonDot.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='.'){textBuffer.append(e.getKeyChar());answerText.setText(textBuffe.rtoString());AddNum();}});buttonSign=newButton("+/-");buttonSign.addActionListener(this);buttonEqual=newButton("=");buttonEqual.addActionListener(this);buttonEqual.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='=')OnGo();}});buttonSqrt=newButton("sqrt");buttonSqrt.addActionListener(this);buttonMod=newButton("%");buttonMod.addActionListener(this);buttonReciprocal=newButton("1/x");buttonReciprocal.addActionListener(this);}对菜单的初始化操作initMenu()函数是对各菜单的初始化,先为其生成实例对象,再添加到MenuBar的实例对象menuGroup中,Menultem各项添加到相应的Menu中。voidinitMenu(){/*先为各个菜单项生成实例对象,并为其设置相应的标签。MenuItem各项还要设置addActionListener(this)增加委托事件任务。*/menuGroup=newMenuBar();editMenu=newMenu(‘编辑(E)");viewMenu=newMenu("查看(V)");helpMenu=newMenu("帮助(H)");copyitem=newMenultem("复制(C)Ctrl+C",newMenuShortcut(KeyEvent.VK_C));copyItem.addActionListener(this);pasteitem=newMenultem(‘粘贴(P)Ctrl+V",newMenuShortcut(KeyEvent.VK_V));pasteitem.addActionListener(this);standardModel=newMenultem("•标准型(T)");standardModel.addActionListener(this);numGroup=newCheckboxMenultem("数字分组(I)",false);numGroup.additemListener(this);aboutCal=newMenuItem("关于计算器(A)");aboutCal.addActionListener(this);/*再把各个菜单相继加入到MenuBar中*/menuGroup.add(editMenu);menuGroup.add(viewMenu);menuGroup.add(helpMenu);editMenu.add(copyItem);editMenu.add(pasteItem);viewMenu.add(standardModel);viewMenu.add(numGroup);helpMenu.add(aboutCal);}对总框架的总体布局OverallArrangement()是根据mainFrame的框架大小,把文本框answerText,内存使用的情况文本框memorystate,内存操作键MRMSM+MC,退格键Backspace清除键CE,清空键C,以及主键盘区的各键按照一定的比例位置加入到mainFrame中.voidOverallArrangement()//文本框的容器//文本框的容器//计算器上部分的容器//计算器中部的容器//主键盘区的容器//内存区的容器//数字及相应的操作键盘区PaneltextPanel=newPanel();PanelupperPanel=newPanel();PanelcenterPanel=newPanel();PanelmainPanel=newPanel();PanelleftPanel=newPanel();PanelrightPanel=newPanel();
mainFrame.setMenuBar(menuGroup);//为主框架设置菜单栏mainFrame.add(upperPanel,BorderLayout.NORTH);//把上容器放在主框架的北面mainFrame.add(centerPanel);//把中容器放在主框架的中部mainFrame.add(mainPanel,BorderLayout.SOUTH);//把主容器放在主框架的南面/*设置主框架的上半部分*/textPanel.add(answerText); //把文本框添加到文本容器中upperPanel.add(textPanel); //把文本容器放入上容器中/*设置主框架的中部*///采用流式布局,各组件相互间隔10个像素//把内存记忆框放在中容器中//把内存记忆框放在中容器中//把退格键放在中容器中//把清除键放在中容器中//把清空键放在中容器中centerPanel.add(memoryState);centerPanel.add(buttonBackSpace);centerPanel.add(buttonCE);centerPanel.add(buttonC);/*设置主框架的下半部分*/leftPanel.setLayout(newGridLayout(4,1,0,2));//左下角的容器采用4*1的网式布局
leftPanel.add(buttonMC); //添加MCleftPanel.add(buttonMR); //添加MRleftPanel.add(buttonMS); //添加MSleftPanel.add(buttonMADD); //添加M+mainPanel.add(leftPanel,BorderLayout.WEST);//把此容器放在主容器的西面/*设置主键盘区*/rightPanel.setLayout(newGridLayout(4,5,3,3));//采用4*5的网式布局,相互间隔3各像素/*添加各键*/rightPanel.add(buttonNum[7]);rightPanel.add(buttonNum[8]);rightPanel.add(buttonNum[9]);rightPanel.add(buttonDiv);rightPanel.add(buttonSqrt);rightPanel.add(buttonNum[4]);rightPanel.add(buttonNum[5]);rightPanel.add(buttonNum[6]);rightPanel.add(buttonMul);rightPanel.add(buttonMod);rightPanel.add(buttonNum[1]);rightPanel.add(buttonNum[2]);rightPanel.add(buttonNum[3]);rightPanel.add(buttonSub);rightPanel.add(buttonReciprocal);rightPanel.add(buttonNum[0]);rightPanel.add(buttonSign);rightPanel.add(buttonDot);rightPanel.add(buttonAdd);rightPanel.add(buttonEqual);mainPanel.add(rightPanel,BorderLayout.CENTER);}计算器构造函数是对各布局函数的调用SimpleCalculator(){initMainFrame();initTextField();initButtons();initMenu();OverallArrangement();reSet();mainFrame.setVisible(true);}B)计算运算部分程序的执行过程:a)运算部分变量的定义stringBuffertextBuffer;intnumDot;intoperator;//记录数值的字符串//小数点的个数//操作符:1-加法2-减法3-乘法4-除法doublefirstValue,secondValue,result;//第一、二个数及结果booleanenterSecond;intforFirOrSec;//是否已经输入了第二个数//此时输入的是第一个还是第二个数booleanb_remFir,b_remSec,b_remFun;//指示是否此时还记的上次的数和运算符intremFun;doubleremFir,remSec;//记住上次的运算符//记住上次参加运算的第一二个数
booleanisNumGroup=false;booleancanBeBack;booleanisNumGroup=false;booleancanBeBack;doublememory;//记录是否为数字分组//是否可以使用退格键//用于内存操作时保存的数据b)各功能函数简介reset函数reSet()是把各属性设置为原始值,当按下voidreSet(){answerText.setText("0.");textBuffer=newStringBuffer("");numDot=0;remFun=operator=0;firstValue=secondValue=result=0.0;enterSecond=false;forFirOrSec=1;b_remFir=b_remSec=b_remFun=false;remFir=remSec=0.0;canBeBack=true;}showScreen函数showScreen()是当按下了数字键后,在屏幕上显示。如果有数字分组项,则调用数字分组函数。如为整数则在其后只显示一个小数点,例如:数值5应该显示为5.若为小数,则直接显示。voidshowScreen(){if(numDot==0)answerText.setText(textBuffe.rtoString()+".");elseanswerText.setText(textBuffe.rtoString());if(isNumGroup==true){showNumGroup();}}showScreenValue函数showScreenValue()是用于显示计算后的结果值,具体的功能同上。voidshowScreenValue(){intresInteger=(int)result;if(Math.abs(result-resInteger)==0){StringBuffertmp=newStringBuffer(Double.toString(result));tmp.deleteCharAt(tmp.length()-1);answerText.setText(tmp.toString());}elseanswerText.setText(Double.toString(result));if(isNumGroup==true){showNumGroup();}}showNumGroup函数数字分组的显示:每隔三位显示一个逗号以示分隔。voidshowNumGroup(){inti,cnt=0;Stringstring=answerText.getText();Stringinterge,fraction;interge=fraction=string;for(i=0;i<string.length();i++){if(string.charAt(i)=='.'){interge=string.substring(0,i);fraction=string.substring(i+1,string.length());break;}}StringBuffersb=newStringBuffer(interge);sb.reverse();for(i=0;i<sb.length();i++){if(Character.isDigit(sb.charAt(i))){cnt++;if(cnt>3){cnt=0;sb.insert(i,",");}sb.reverse();answerText.setText(sb.toString()+"."+fraction);}deleteNumGroup函数deleteNumGroup()是当已经数字分组时,再次按下该键,消除数字分组的效果voiddeleteNumGroup(){StringBuffersb=newStringBuffer(answerText.getText());for(inti=0;i<sb.length();i++){if(sb.charAt(i)==','){sb.deleteCharAt(i);}}answerText.setText(sb.toString());}AddFunction函数当输入了四则运算符时,先进行判断各种双目运算的可能性,若不是第一次运算操作则先把上一次的操作完成并在屏幕上显示,并记录下当前的操作符,否则存入操作符。voidAddFunction(intop){//如果此时第二个数存在.则运算,例如输入2+3=5后按*4+if(b_remFir==true&&b_remFun==false&&enterSecond==true){if(operator==1)result=remFir+secondValue;elseif(operator==2)result=remFir-secondValue;elseif(operator==3)result=remFir*secondValue;elseif(operator==4)result=remFir/secondValue;b_remFir=true;remFir=result;enterSecond=false;forFirOrSec=2;operator=op;showScreenValue();elseif(b_remFir==false&&b_remFun==false&&enterSecond==true)if(operator==1)result=firstValue+secondValue;elseif(operator==2)result=firstValue-secondValue;elseif(operator==3)result=firstValue*secondValue;elseif(operator==4)result=firstValue/secondValue;b_remFir=true;remFir=result;enterSecond=false;forFirOrSec=2;operator=op;showScreenValue();}else{operator=op;forFirOrSec=2;}b_remFun=false;remFun=0;textBuffer=newStringBuffer("");}AddNum函数把屏幕上的值存入result和firstValuesecondValue中。voidAddNum(){if(forFirOrSec==1){result=firstValue=Double.parseDouble(textBuffer.toString());b_remFir=false;remFir=0;}elseif(forFirOrSec==2){enterSecond=true;secondValue=Double.parseDouble(textBuffer.toString());b_remSec=false;remSec=0;}}OnGo函数当按下了等于号时,先对各种键盘的输入方法进行判断,并对每种情况进行正确的操作。voidOnGo(){//如果记着第一,二个数和运算符,即上次算完后未输入数,而再次按=if(b_remFir==true&&b_remSec==true&&b_remFun==true){if(remFun==1)result=remFir+remSec;elseif(remFun==2)result=remFir-remSec;elseif(remFun==3)result=remFir*remSec;elseif(remFun==4)result=remFir/remSec;b_remFir=true;b_remSec=true;b_remFun=true;remFir=result;remSec=remSec;remFun=remFun;}//只记的第一数,如算完2+3=5后按*4=elseif(b_remFir==true&&b_remSec==false&&b_remFun==false){if(operator==1)result=remFir+secondValue;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度绿色家居产品免责任协议书3篇
- 2025年度农村土地租赁与农业废弃物资源化利用项目合作合同2篇
- 二零二五年度全新音乐节演出活动承办服务合同3篇
- 2025年度年度合伙开设中式快餐连锁店合同3篇
- 2025年度农村土地互换与农业绿色发展合作协议
- 二零二五年度建筑用石材采购与加工合作协议3篇
- 二零二五年度现代化工厂生产线整体转让协议3篇
- 2025年度养老院老人外出社区活动安全保障合同3篇
- 二零二五年度金融科技基金公司投资合作协议3篇
- 二零二五年度房地产开发企业借款合同3篇
- 2021年贵安新区产业发展控股集团有限公司招聘笔试试题及答案解析
- 安全文化培训 (注册安工再培训)课件
- 色粉-MSDS物质安全技术资料
- 骨科学研究生复试真题汇总版
- 石油化工钢结构工程施工及验收规范
- 辽海版六年级音乐上册第8单元《3. 演唱 姐妹们上场院》教学设计
- 形势任务教育宣讲材料第一讲——讲上情
- 物业安全员考核实施细则
- 中国地质大学(武汉)教育发展基金会筹备成立情况报告
- 第四章破产法(破产法)教学课件
- PE拖拉管施工方案标准版
评论
0/150
提交评论