java实现计算器功能
本文实例为大家分享了java实现计算器功能具体代码,供大家参考,具体内容如下
效果图
组成结构
从结构上来说,一个简单的图形界面,需要由界面组件、组件的事件监听器(响应各类事件的逻辑)和具体的事件处理逻辑组成。
界面实现的主要工作是创建各个界面组件对象,对其进行初始化,以及控制各组件之间的层次关系和布局。
计算器代码结构
计算器java源码
1、定义变量和按钮
publicclassCalculator{ //定义成员变量,方便逻辑的实现 //需要定义存储当前被按下的操作数和操作符,result存储运算的结果。 //staticStringresult; //staticStringsingal="+"; //操作数1,设置初值0 staticStringstr1="0"; //操作数2,设置初值0 staticStringstr2="0"; //运算符,初值设置为+ staticStringsignal="+"; //运算结果 staticStringresult=""; //创建一个JTextField对象并初始化,为用于显示操作和计算结果的文本框,参数20,表示最大显示20列 staticJTextFieldresult_TextField=newJTextField(result,20); //创建一个主窗体(JFrame)对象,并初始化 JFrameframe=newJFrame("计算器"); //创建清除按钮 JButtonclear_Button=newJButton("Clear"); //创建数字按钮 JButtonbutton0=newJButton("0"); JButtonbutton1=newJButton("1"); JButtonbutton2=newJButton("2"); JButtonbutton3=newJButton("3"); JButtonbutton4=newJButton("4"); JButtonbutton5=newJButton("5"); JButtonbutton6=newJButton("6"); JButtonbutton7=newJButton("7"); JButtonbutton8=newJButton("8"); JButtonbutton9=newJButton("9"); //创建操作符按钮 JButtonbutton_Dian=newJButton("."); JButtonbutton_Jia=newJButton("+"); JButtonbutton_Jian=newJButton("-"); JButtonbutton_Cheng=newJButton("×"); JButtonbutton_Chu=newJButton("÷"); //创建等于按钮 JButtonbutton_Dy=newJButton("="); //定义5个开关状态 //开关1用于选择输入的方向,将要写入str1或者str2,k1为1是写入str1,为2是写入str2(初值设为1) intk1=1; //开关2用于记录符号键的次数,当k2>1,表示是多符号运算(初值设为1) intk2=1; //开关3用于标识str1是否可以清0,设等于1表示可以,不等于1,表示不可以 intk3=1; //开关4用于标识str2是否可以清0,设等于1表示可以,不等于1,表示不可以 intk4=1; //开关5用于控制小数点是否可以输入,设为1可以,不为1时,输入的被舍弃 intk5=1; //定一个按钮,用于存储之前被按下的符号键 JButtonstore; //vt存储之前输入的运算符 Vectorvt=newVector (20,10); }
2、构建容器并添加组件
publicCalculator(){ //文本右对齐 result_TextField.setHorizontalAlignment(JTextField.RIGHT); //设置主窗体在窗口中的位置 frame.setLocation(400,300); //设置窗体不能调大小 frame.setResizable(false); //创建一个面板JPanel,pan对象,并初始化 JPanelpan=newJPanel(); //设置pan的布局为网格布局,四行四列,边距为5像素 pan.setLayout(newGridLayout(4,4,5,5)); //将用于计算的按钮添加到pan中 pan.add(button7); pan.add(button8); pan.add(button9); pan.add(button_Chu); pan.add(button4); pan.add(button5); pan.add(button6); pan.add(button_Cheng); pan.add(button1); pan.add(button2); pan.add(button3); pan.add(button_Jian); pan.add(button0); pan.add(button_Dian); pan.add(button_Dy); pan.add(button_Jia); //花里胡哨,为pan对象设置边距 pan.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); //创建一个面板,pan2对象,并初始化 JPanelpan2=newJPanel(); //设置pan2的布局为边界布局(5个) pan2.setLayout(newBorderLayout()); //将显示结果的文本框(west)和Clear(east)按钮添加到pan2 pan2.add(result_TextField,BorderLayout.WEST); pan2.add(clear_Button,BorderLayout.EAST); //将面板pan和pan2放入窗体frame中 frame.getContentPane().setLayout(newBorderLayout()); frame.getContentPane().add(pan2,BorderLayout.NORTH); frame.getContentPane().add(pan,BorderLayout.CENTER); //设置frame大小可调 frame.pack();//窗口大小根据组件变 frame.setVisible(true); }
3、完成各个事件的响应逻辑
//写数字键响应事件 classlistenerimplementsActionListener{ @SuppressWarnings("unchecked") @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub //获取事件源,并从事件源从获取输入的数据 Stringss=((JButton)e.getSource()).getText(); //读入存储的符号键,并添加到vt中去 store=(JButton)e.getSource(); vt.add(store); //开关k1的使用 if(k1==1){ //输入是操作数1的部分 //判断是否可以清零 if(k3==1){ str1=""; //还原开关k5状态,输入的是数字,因此后面随时可用输入小数点,为了防止出错,给k5进行赋值 k5=1; } str1=str1+ss; //当输入完成后,我们需要给k3的值加1,保证操作数1不会被清空。并且还需要将操作数1打印到结果栏。 k3=k3+1; //显示结果 result_TextField.setText(str1); }elseif(k1==2){ //输入是操作数2的部分 //逻辑与k1一样,把str1改为str2 //判断是否可以清零 if(k4==1){ str2=""; //还原开关k5状态,输入的是数字,因此后面随时可用输入小数点,为了防止出错,给k5进行赋值 k5=1; } str2=str2+ss; //当输入完成后,我们需要给k3的值加1,保证操作数1不会被清空。并且还需要将操作数1打印到结果栏。 k4=k4+1; //显示结果 result_TextField.setText(str2); } } } //小数点的响应事件 classlistener_xiaosimplementsActionListener{ @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub //获取相应源,并添加到vt中去 store=(JButton)e.getSource(); vt.add(store); if(k5==1){ //获取事件源,并从事件源从获取输入的数据 Stringss2=((JButton)e.getSource()).getText(); //开关k1的使用 if(k1==1){ //输入是操作数1的部分 //判断是否可以清零 if(k3==1){ str1=""; //还原开关k5状态,输入的是数字,因此后面随时可用输入小数点,为了防止出错,给k5进行赋值 k5=1; } str1=str1+ss2; //当输入完成后,我们需要给k3的值加1,保证操作数1不会被清空。并且还需要将操作数1打印到结果栏。 k3=k3+1; //显示结果 result_TextField.setText(str1); }elseif(k1==2){ //输入是操作数2的部分 //逻辑与k1一样,把str1改为str2 //判断是否可以清零 if(k4==1){ str2=""; //还原开关k5状态,输入的是数字,因此后面随时可用输入小数点,为了防止出错,给k5进行赋值 k5=1; } //str2=str2+ss; //当输入完成后,我们需要给k3的值加1,保证操作数1不会被清空。并且还需要将操作数1打印到结果栏。 k4=k4+1; //显示结果 result_TextField.setText(str2); } } //为了防止输入小数点之后再次输入小数点,需要进行k5=k5+1;的操作。 k5=k5+1; } } //运算符号响应事件 classlistener_signalimplementsActionListener{ privateStringsingal; @SuppressWarnings("unchecked") @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub //获取事件源,并从事件源从获取输入的数据 Stringss2=((JButton)e.getSource()).getText(); //读入存储的符号键,并添加到vt中去 store=(JButton)e.getSource(); vt.add(store); if(k2==1){//一次运算 //开关k1为1时,向数1输入值,为2时向数2输入值 k1=2; //可以输入小数点 k5=1; signal=ss2; //只能输入一个符号 k2=k2+1; }else{//连续运算 //定义一个a,表示输入的长度,然后读入上次的输入 inta=vt.size(); //获取后面的运算符 JButtonc=(JButton)vt.get(a-2); //判断输入如果不是下面的符号,就说明是要进行多次运算 if(!(c.getText().equals("+"))&&!(c.getText().equals("*"))&&!(c.getText().equals("-")) &&!(c.getText().equals("/"))){ //调用calc()运算 calc(); //将结果存到str1中 str1=result; //开关k1为1时,向数1输入值,为2时向数2输入值 k1=2; //可以输入小数点 k5=1; //k4置1,表示可以连续计算 k4=1; //singal存储此次输入的符号。 singal=ss2; } //增加已经输入的符号的次数 k2=k2+1; } } } @SuppressWarnings("unused") //等于的响应事件 classlistener_dyimplementsActionListener{ @SuppressWarnings("unchecked") @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub //按键按下后,调用calc()函数,还原开关的值 store=(JButton)e.getSource(); vt.add(store); calc(); //还原开关状态 k1=1; k2=1; k3=1; k4=1; //为7+5=12+5=17这种计算做准备 str1=result; } } //清除响应事件 @SuppressWarnings("unused") classlistener_clearimplementsActionListener{ @SuppressWarnings("unchecked") @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub //读入存储的符号键 store=(JButton)e.getSource(); vt.add(store); //将所有的值清零或置为初值 k1=1; k2=1; k3=1; k4=1; k5=1; str1="0"; str2="0"; signal=""; result=""; result_TextField.setText(result); vt.clear(); } }
4、为按钮添加事件监听器
//监听等于键 listener_dyjt_dy=newlistener_dy(); button_Dy.addActionListener(jt_dy); //监听数字键 listenerjt=newlistener(); button0.addActionListener(jt); button1.addActionListener(jt); button2.addActionListener(jt); button3.addActionListener(jt); button4.addActionListener(jt); button5.addActionListener(jt); button6.addActionListener(jt); button7.addActionListener(jt); button8.addActionListener(jt); button9.addActionListener(jt); //监听符号键 listener_signaljt_signal=newlistener_signal(); button_Cheng.addActionListener(jt_signal); button_Chu.addActionListener(jt_signal); button_Jia.addActionListener(jt_signal); button_Jian.addActionListener(jt_signal); //监听清除键 listener_clearjt_c=newlistener_clear(); clear_Button.addActionListener(jt_c); //监听小数点键 listener_xiaosjt_xs=newlistener_xiaos(); button_Dian.addActionListener(jt_xs); } //计算逻辑的实现,写calc()函数 @SuppressWarnings("unused") publicvoidcalc(){ //定义a2和b2存储操作数,和存储中间变量的值result2 doublea2; doubleb2; doubleresult2=0; //运算符用signal存储 Stringc=signal; //进行运算 if(c.equals("")){ result_TextField.setText("请输入符号"); }else{ //手动处理小数点的问题 if(str1.equals(".")){ str1="0.0"; } if(str2.equals(".")){ str2="0.0"; } //转换字符串为double a2=Double.valueOf(str1).doubleValue(); b2=Double.valueOf(str2).doubleValue(); if(c.equals("+")){ result2=a2+b2; } if(c.equals("-")){ result2=a2-b2; } if(c.equals("*")){ //进行乘法时,为了保证精度,可以将double存入大的浮点数类BigDecimal中 BigDecimalm1=newBigDecimal(Double.toString(a2)); BigDecimalm2=newBigDecimal(Double.toString(b2)); result2=m1.multiply(m2).doubleValue(); } if(c.equals("/")){ if(b2==0){ result2=0; }else{ result2=a2/b2; } } //输出结果 result=((newDouble(result2)).toString()); result_TextField.setText(result); }
5、测试函数
publicstaticvoidmain(String[]args){ try{ //设置风格 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); }catch(Exceptione){ e.printStackTrace(); } Calculatorcalc=newCalculator(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。