已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基本思想:计算器分为3部分,菜单、普通计算器、式子计算器。用两个类分别建立容器存储相应的组件,在菜单选择中通过remove()、repaint() (删除组件后刷新)和add()、validate()(添加组件后刷新)实现模式的转换,同时在菜单中也实现计算器参数初始化。2种计算器共用GridBagLayout可变布局、GridBagConstraints布局设置、Numer 数值类,addbutton()单个按钮添加函数、addTextField()输入区添加函数、光标定位等等。import java.awt.Container;import java.awt.Font;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class Caculater extends JFramepublic GridBagLayout layout=new GridBagLayout();/可变布局public GridBagConstraints constraints=new GridBagConstraints();/布局设置Numer result=new Numer();/结果暂存Numer M;/结果存储器int fpoint=0;/textField 光标定位Cater cater=new Cater();/标准计算器Cator cator=new Cator();/普通计算器private boolean type=false;/判断是否是普通计算器public Caculater()super(“计算器“);addMenu();add(cater.container);public class Caterprivate Container container=new Container();/容器JTextArea textArea=new JTextArea();/显示区JTextField textField=new JTextField();/输入区int apoint=0;/textArea 光标定位int upoint=0;/memory使用向上的位置String formula=“;/式子String copty=“;/复制的式子Memory memorys=new Memory100;/存储历史最大记录int number=0;/存储计数器boolean upfirst=true;/判断是否首次使用向上public Cater()container.setLayout(layout);addTextArea();addTextField(1,1,1,5,container,textField);addButton();private void addTextArea()constraints.gridx=0;/组件x 位置constraints.gridy=0;/组件y 位置constraints.gridheight=1;/组件高度constraints.gridwidth=10;/组件宽度constraints.fill=GridBagConstraints.BOTH;/constraints.weightx=1;constraints.weighty=1;textArea.setEditable(false);JScrollPane spane=new JScrollPane(textArea);textArea.setFont(new Font(“Serif“,Font.PLAIN,18);layout.setConstraints(spane, constraints);spane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);container.add(spane);/添加按钮private void addButton()InsertAction insert=new InsertAction();CommandAction command=new CommandAction();addbutton(“MC“,0,2,1,1,command,container);addbutton(“MR“,1,2,1,1,command,container);addbutton(“MS“,2,2,1,1,command,container);addbutton(“M+“,3,2,1,1,command,container);addbutton(“M-“,4,2,1,1,command,container);addbutton(“Delete“,0,3,1,1,insert,container);addbutton(“CE“,1,3,1,1,insert,container);addbutton(“C“,2,3,1,1,insert,container);addbutton(“,3,3,1,1,insert,container);addbutton(“,4,3,1,1,command,container);addbutton(“7“,0,4,1,1,insert,container);addbutton(“8“,1,4,1,1,insert,container);addbutton(“9“,2,4,1,1,insert,container);addbutton(“,3,4,1,1,command,container);addbutton(“%“,4,4,1,1,command,container);addbutton(“4“,0,5,1,1,insert,container);addbutton(“5“,1,5,1,1,insert,container);addbutton(“6“,2,5,1,1,insert,container);addbutton(“,3,5,1,1,command,container);addbutton(“1/x“,4,5,1,1,command,container);addbutton(“1“,0,6,1,1,insert,container);addbutton(“2“,1,6,1,1,insert,container);addbutton(“3“,2,6,1,1,insert,container);addbutton(“ ,3,6,1,1,command,container);addbutton(“ ,4,6,1,1,command,container);addbutton(“0“,0,7,1,1,insert,container);addbutton(“.“,1,7,1,1,insert,container);addbutton(“(“,2,7,1,1,command,container);addbutton(“)“,3,7,1,1,command,container);addbutton(“=“,4,7,2,1,command,container);addbutton(“,0,8,1,1,command,container);addbutton(“,1,8,1,1,command,container);addbutton(“,2,8,1,1,command,container);addbutton(“,3,8,1,1,command,container);public class MemoryString formula=new String();Numer result;Memory(String s,Numer r)formula=s;result=new Numer(r);void delete()result=null;formula=“;boolean isEmpty()return formula.isEmpty();String print()String s;s=formula+“=“+result.putnum();return s;/设置数值按钮监听器private class InsertAction implements ActionListenerpublic void actionPerformed(ActionEvent event)String input=event.getActionCommand();String output=textField.getText();if(!input.equals(“)if(input.equals(“Delete“)if(fpoint0)textField.setText(output.substring(0,fpoint-1)+output.substring(fpoint,output.length();if(fpoint0)fpoint-;else if(apoint0)if(apoint=formula.length()formula=formula.substring(0,apoint-1);textArea.setText(formula);elseformula=formula.substring(0,apoint-1)+formula.substring(apoint,formula.length();textArea.setText(formula.substring(0,apoint-1)+“+formula.substring(apoint-1,formula.length();if(apoint0)apoint-;return;if(input.equals(“.“)if(output.indexOf(“.“)=-1)if(apoint0)textField.setText(output.substring(0, fpoint)+input+output.substring(fpoint,output.length() );fpoint+;output=textField.getText();else if(fpoint=output.length()if(output.length()=0)textField.setText(“0.“);fpoint=2;else textField.setText(output+“.“);fpoint+;return;/键入数字if(!input.equals(“)textField.setText(output.substring(0,fpoint)+“ +output.substring(fpoint,output.length();else if(!aput.isEmpty()if(apoint0)apoint-;textArea.setText(aput.substring(0, apoint)+“+aput.substring(apoint, aput.length();return;if(input.equals(“)if(!output.isEmpty()if(fpoint=99)upoint=0;else upoint+;elsetextArea.setText(memorysupoint.print();textField.setText(“);apoint=0;return;if(input.equals(“)if(upfirst)if(memorysnumber=null)upoint=0;else upoint=number+1;textArea.setText(“+upoint);upfirst=false;if(upoint=99)upoint=0;else upoint+;if(number=0textArea.setText(formula);if(upoint=0)upoint=99;else upoint-;elsetextArea.setText(memorysupoint.print();textField.setText(“);apoint=0;return;if(input.equals(“1/x“)if(Double.parseDouble(output)!=0fpoint=textField.getText().length();else if(Double.parseDouble(output)=0)JOptionPane.showMessageDialog(Caculater.this,String.format(“%s“, “错误!分母不能为0!“);else JOptionPane.showMessageDialog(Caculater.this,String.format(“%s“, “错误!当前情况不能求倒数!“);return;if(input.equals(“=“)/开始计算formula=textArea.getText();if(!output.isEmpty()formula+=output;textField.setText(“);fpoint=0;apoint=formula.length();formula=re_formula(formula);result.rnumber(caculete(formula);memorysnumber=new Memory(formula,result);if(number=99)number=0;else number+;textArea.setText(formula+input+result.putnum();formula=“;textArea.setEditable(false);/保证再次使用时失去任意修改的功能return;if(apoint0;s=str.substring(n,n+1)if(isnum.indexOf(s)=-1)n+;break;n-;return str.length()-n;/剔除不属于正确式子的字符String re_formula(String str)String test=“-.1234567890%()“ ;String s=“;if(str.indexOf(“=“)!=-1)int n=str.indexOf(“=“);str=str.substring(0, n);for(int i=0;i0)textField.setText(output.substring(0,fpoint-1)+output.substring(fpoint,output.length();/else if(fpoint0)fpoint-;return;/删除前一次计算的结果if(fpoint=output.length()output=textField.getText();fpoint=output.length();setoperator=false;if(input.equals(“.“)if(output.indexOf(“.“)=-1)if(fpoint0)textField.setText(output.substring(0, fpoint)+input+output.substring(fpoint,output.length() );fpoint+;output=textField.getText();else if(fpoint=output.length()if(output.length()=0)textField.setText(“0.“);else textField.setText(output+“.“);output=textField.getText();fpoint=output.length();start=true;return;/键入数字if(!input.equals(“)fpoint=input.length(); start=true;return;/在中间插入数字if(fpoint0)fpoint-;textField.setText(output.substring(0,fpoint)+“ +output.substring(fpoint,output.length();return;if(input.equals(“)if(!output.equals(“)if(fpointoutput.length()fpoint+;if(fpointoutput.length()textField.setText(output.substring(0,fpoint)+“ +output.substring(fpoint,output.length();return;if(input.equals(“1/x“)|input.equals(“)lastCommand=input;if(input.equals(“=“)/第一次使用等号需要更新,以后重复使用,就不断重复最后一次运算if(!den)last=output;num.rnumber(last);if(lastCommand.equals(“)|lastCommand.equals(“1/x“)/单操作符需要不断更新最后值last=output;num.rnumber(last);calculate(num);start=false;setoperator=true;den=true;return;if(den)/停止使用等号lastCommand=“=“;den=false;if(start)/防止重复输入操作符时,把结果当作输入进行计算last=output;num.rnumber(last);calculate(num);lastCommand=input;else lastCommand=input;start=false;setoperator=true;public void calculate(Numer x) if(lastCommand.equals(“)result.n=x.n;result.d=x.d;result.sqrt();if(lastCommand.equals(“1/x“)result.n=x.n;result.d=x.d;result.countdown();if (lastCommand.equals(“) result.add(x); else if (lastCommand.equals(“) result.sub(x);else if (lastCommand.equals(“) result.mul(x); else if (lastCommand.equals(“) result.divide(x);else if (lastCommand.equals(“%“) if(result.isint()else JOptionPane.showMessageDialog(Caculater.this,String.format(“%s“, “求余数的参数必须为整数!“);else if (lastCommand.equals(“=“) result.d=x.d;result.n=x.n;textField.setText(“+result.putnum();fpoint=textField.getText().length();public void addbutton(String label,int x,int y,int height,int width,ActionListener listener,Container container)JButton button=new JButton(label);constraints.gridx=x;constraints.gridy=y;constraints.gridheight=height;constraints.gridwidth=width;constraints.fill=GridBagConstraints.BOTH;button.addActionListener(listener);layout.setConstraints(button,constraints);container.add(button);public void addTextField(int x,int y,int height,int width,Container container,JTextField textField)constraints.gridx=x;/组件x 位置constraints.gridy=y;/组件y 位置constraints.gridheight=height;/组件高度constraints.gridwidth=width;/组件宽度constraints.fill=GridBagConstraints.BOTH;/组件随显示变化的选项constraints.weightx=1;/水平扩展,即显示变化时,长度变化constraints.weighty=1;/垂直扩展,即高度变化textField.setHorizontalAlignment(JTextField.RIGHT);/光标右边显示textField.setEditable(false);/不可编辑textField.setFont(new Font(“Serif“,Font.PLAIN,18);/显示字体layout.setConstraints(textField, constraints);/把布局设置应用到组件上container.add(textField);/把该组件添加到容器中private void addMenu()JMenu menus=new JMenu3;menus0=new JMenu(“查看(V)“);menus0.setMnemonic(F);menus1=new JMenu(“编辑(E)“);menus1.setMnemonic(E);menus2=new JMenu(“帮助(H)“);menus2.setMnemonic(H);JMenuItem lookItem=new JMenuItem2;JMenuItem aditItem=new JMenuItem3;JMenuItem helpItem=new JMenuItem2;lookItem0=new JMenuItem(“普通型(O)“);lookItem0.setMnemonic(O);lookItem1=new JMenuItem(“标准型(T)“);lookItem1.setMnemonic(T);aditItem0=new JMenuItem(“复制(C) Ctrl+C“);aditItem0.setMnemonic(C);aditItem1=new JMenuItem(“粘贴(P) Ctrl+V“);aditItem1.setMnemonic(P);aditItem2=new JMenuItem(“自由编辑(F)“);aditItem2.setMnemonic(F);helpItem0=new JMenuItem(“关于主题(H)“);helpItem0.setMnemonic(H);helpItem1=new JMenuItem(“关于计算器(A)“);MenuAction menuaction=new MenuAction();lookItem0.addActionListener(menuaction);lookItem1.addActionListener(menuaction);aditItem0.addActionListener(menuaction);aditItem1.addActionListener(menuaction);aditItem2.addActionListener(menuaction);helpItem0.addActionListener(menuaction);helpItem1.addActionListener(menuaction);JMenuBar bar=new JMenuBar();menus0.add(lookItem0);menus0.add(lookItem1);menus1.add(aditItem0);menus1.add(aditItem1);menus1.add(aditItem2);menus2.add(helpItem0);menus2.add(helpItem1);setJMenuBar(bar);bar.add(menus0);bar.add(menus1);bar.add(menus2);private class MenuAction implements ActionListenerpublic void actionPerformed(ActionEvent event)String input=event.getActionCommand();if(input.equals(“关于主题(H)“)JOptionPane.showMessageDialog(Caculater.this,String.format(“%s“, “花了快半个月了。n“+“ -许先斌n“ +“ 2011.8.12“);return;if(input.equals(“关于计算器(A)“)JOptionPane.showMessageDialog(Caculater.this,String.format(“%s“, “该计算器最多存储100条记录。n“ +“计算器需要确保输入正确,否则得不到答案。n“+“计算器上的计算符号与键盘的不一样,最好不要由键盘输入。“);return;if(input.equals(“复制(C) Ctrl+C“)cater.copty=cater.memoryscater.upoint.formula;JOptionPane.showMessageDialog(Caculater.this,String.format(“复制%s“, cater.copty);return;if(input.equals(“粘贴(P) Ctrl+V“)cater.formula=cater.formula.substring(0, cater.apoint)+cater.copty+cater.formula.substring(cater.apoint);JOptionPane.showMessageDialog(Caculater.this,String.format(“%s“, “粘贴成功!“ );cater.textArea.setText(cater.formula);return;if(input.equals(“自由编辑(F)“)cater.textArea.setEditable(true);if(input.equals(“普通型(O)“)if(!type)Caculater.this.remove(Caculater.this.cater.container);/去掉标准计算器容器repaint();/显示Caculater.this.add(Caculater.this.cator.container);/添加普通计算器容器validate();/显示/普通计算器参数初始化cator.textField.setText(“);fpoint=0;cator.last=“0“;result.d=0;result.n=0;cator.lastCommand=“=“;M=null;cator.start=false;cator.setoperator=false;cator.den=false;type=true;return;if(input.equals(“标准型(T)“)if(type)Caculater.this.remove(Caculater.this.cator.container);repaint();Caculater.this.add(Caculater.this.cater.container);validate();cater.textField.setText(“);cater.textArea.setText(“);fpoint=0;cater.apoint=0;cater.upoint=0;result.d=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建漳浦县储备粮管理有限公司公开招聘4人笔试参考题库附带答案详解
- 2025福建宁德三都澳城澳建设发展公司招聘笔试笔试参考题库附带答案详解
- 2025烟台业达经济发展集团有限公司社会公开招聘笔试笔试参考题库附带答案详解
- 2025湖北襄阳高新城乡基础设施建设维护有限公司招聘延期笔试参考题库附带答案详解
- 2025浙江郡安里文旅发展有限公司招聘3人笔试参考题库附带答案详解
- 2025浙江温州乐清市事业单位(国有企业)招聘43人笔试参考题库附带答案详解
- 2025河南艾瑞环保科技有限公司招聘3人笔试参考题库附带答案详解
- 中远海运船员管理有限公司2026招聘笔试历年典型考点题库附带答案详解
- 蠡县2025年河北保定蠡县县直事业单位公开招聘工作人员28名笔试历年参考题库典型考点附带答案详解
- 烟台市2025山东烟台高新技术产业开发区福山园管理委员会选聘园区工作人员1笔试历年参考题库典型考点附带答案详解
- 泸州市兴泸投资集团有限公司招聘笔试题库2026
- 电力监控应急预案(3篇)
- 2026年合肥市产业投资控股(集团)有限公司招聘笔试参考题库附带答案详解
- 湖北省三重一大监督制度
- 门店会员绩效考核制度
- 湖北省宜昌市2026届高三下4月考数学试题含解析
- 财务部门工作流程手册
- 2026年广东省初中学业水平考试模拟(一) 英语
- 房地产 -2025年下半年长沙写字楼市场报告
- 三维图解2021版高支模施工方案(含计算书)通俗易懂
- 小米培训方法教程课件
评论
0/150
提交评论