实验要求

编写计算器界面并实现其功能。

实验步骤

1.界面基本样式绘制

代码实现

import java.awt.*;
import javax.swing.*;
public class f_frame extends JFrame{public f_frame(){//创建界面,设置其大小为固定值,宽900,高650,使整个界面都可以正常显示JFrame f=new JFrame("计算器");f.setSize(900, 650);Container con=f.getContentPane();//创建1个底色为白色的JPanel,设置其格式为固定格式(即可以自定义的格式)JPanel p=new JPanel();p.setBackground(Color.white);p.setLayout(null);//新建名为text的JTextField文本框位置,用于点击是数字的实时变化显示以及最终的结果显示//并将其可编辑性设置为用户不可编辑,设置其长宽以及背景颜色。JTextField text=new JTextField("");text.setEditable(false);text.setBackground(new Color(221, 221, 221));  //背景色--灰色text.setBounds(100, 50, 700, 50);p.add(text);                                   //添加到JPanel中//创建JButton数组,包含界面从左到右、自上而下的所有按钮JButton[] buttongroup= {new JButton("7"), new JButton("8"), new JButton("9"), new JButton("/"),new JButton("CE"),new JButton("4"), new JButton("5"), new JButton("6"), new JButton("*"),new JButton("="),new JButton("1"), new JButton("2"), new JButton("3"), new JButton("-"),new JButton("0"), new JButton("."),new JButton("+")};//遍历JButton数组,设置每个按钮的颜色、字体字号以及具体位置for(int i=0; i<buttongroup.length; i++){JButton b1=buttongroup[i];b1.setBackground(new Color(204, 204, 255));b1.setFont(new Font("宋体", Font.BOLD, 25));//位置逻辑,“=”和“0”特判,占据空间略大,其余长宽一致,规律放置if(i<9){if(i<5) b1.setBounds(100+150*i, 150, 100, 50);else b1.setBounds(100+150*(i-5), 250, 100, 50);}else if(i==9)b1.setBounds(100+150*(i-5), 250, 100, 250);else if(i==14)b1.setBounds(100, 450, 250, 50);else {if(i<14) b1.setBounds(100+150*(i-10), 350, 100, 50);else b1.setBounds(100+150*(i-13), 450, 100, 50);}p.add(b1);}//待添加,单击事件//向界面中添加JPanel变量,并设置界面可见性为truecon.add(p);f.setVisible(true);
//最后设置界面可见性,否则将会出现加载不到界面内容,必须有鼠标事件才能成功加载的现象发生。}//主函数,创建界面public static void main(String args[]){f_frame page=new f_frame();}
}

结果展示

2.响应事件的添加以及计算功能的实现

代码实现

import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
import javax.xml.soap.Text;public class f_frame extends JFrame implements ActionListener{//由于text内容需要改变,下面会用到,因此需要拎出来//新建名为text的JTextField文本框位置,用于点击是数字的实时变化显示以及最终的结果显示JTextField text=new JTextField("");public f_frame(){//创建界面,设置其大小为固定值,宽900,高650,使整个界面都可以正常显示JFrame f=new JFrame("计算器");f.setSize(900, 650);Container con=f.getContentPane();//创建1个底色为白色的JPanel,设置其格式为固定格式(即可以自定义的格式)JPanel p=new JPanel();p.setBackground(Color.white);p.setLayout(null);//并将text可编辑性设置为用户不可编辑,设置其长宽以及背景颜色。text.setEditable(false);text.setBackground(new Color(221, 221, 221));  //背景色--灰色text.setBounds(100, 50, 700, 50);text.setFont(new Font("宋体", Font.BOLD, 25));text.setHorizontalAlignment(JTextField.RIGHT); //右对齐p.add(text);                                   //添加到JPanel中//创建JButton数组,包含界面从左到右、自上而下的所有按钮JButton[] buttongroup= {new JButton("7"), new JButton("8"), new JButton("9"), new JButton("/"),new JButton("CE"),new JButton("4"), new JButton("5"), new JButton("6"), new JButton("*"),new JButton("="),new JButton("1"), new JButton("2"), new JButton("3"), new JButton("-"),new JButton("0"), new JButton("."),new JButton("+")};//遍历JButton数组,设置每个按钮的颜色、字体字号以及具体位置for(int i=0; i<buttongroup.length; i++){JButton b1=buttongroup[i];b1.setBackground(new Color(204, 204, 255));b1.setFont(new Font("宋体", Font.BOLD, 25));b1.addActionListener(this);//位置逻辑,“=”和“0”特判,占据空间略大,其余长宽一致,规律放置if(i<9){if(i<5) b1.setBounds(100+150*i, 150, 100, 50);else b1.setBounds(100+150*(i-5), 250, 100, 50);}else if(i==9)b1.setBounds(100+150*(i-5), 250, 100, 250);else if(i==14)b1.setBounds(100, 450, 250, 50);else {if(i<14) b1.setBounds(100+150*(i-10), 350, 100, 50);else b1.setBounds(100+150*(i-13), 450, 100, 50);}p.add(b1);}//向界面中添加JPanel变量,并设置界面可见性为truecon.add(p);f.setVisible(true);//最后设置界面可见性,否则将会出现加载不到界面内容,//必须有鼠标事件才能成功加载的现象发生。}//由于优先级的不同,算式中最多需要保留3个操作数,//分别按顺序记作num1, num2, num3,初始值为0//point变量存储当前按键double num1=0.0, num2=0.0, num3=0.0, point=1.0;//操作符用int型数据表1:+, 2:-, 3:*, 4:\//op存储上一操作符, op_now存储当前读入操作符,//op_greater存储优先级较高的后面的操作符int op=0, op_now=0, op_greater=0; //标志设计Boolean flag_num=false;      //true:num1输入完毕 false:num2尚未输入完毕Boolean flag_point=false;    //true:当前数字有小数点 false:当前数字无小数点Boolean flag_mistake=false;  //true:输入存在错误 false:输入尚不存在错误Boolean flag_begin=false;    //true:从上一次输入符号(非等号)起,已经按下某(或某些)数字Boolean flag_greater=false;  //true:有较高的优先级计算须先处理Boolean flag_end=false;      //true:上一个按下的按键是"=",结束了一次计算//响应按钮事件的函数//采用按键实时计算的方式,考虑算符优先级的影响public void actionPerformed(ActionEvent e){//捕获事件来源JButton btn=(JButton) e.getSource();//上一次按键出错,再次按键需更新错误信息。设置文本为空if(flag_mistake) {flag_mistake=false;text.setText("");}//获取事件来源按键的内容,方便后续操作String s=btn.getText();switch(btn.getText()){case "CE"://按下清空键,设置各标志以及各项纪录数据为初始状态,设置文本框内容为空flag_point=flag_num=flag_mistake=flag_begin=flag_greater=flag_end=false;num1=num2=num3=0.0; point=1.0; op=0;text.setText("");break;case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9"://按下数字键,首先已有数字键入,更新flag_begin标志flag_begin=true;//假设上一按下按键为"=",再次按下数字后,更新文本按下数字,恢复flag_end标志为0//假设不成立,则在文本框内容后附加该数字即可if(flag_end==true){text.setText(btn.getText());flag_end=false;}else text.setText(text.getText()+btn.getText());//该数字已经输入小数点后,需要更新小数位数if(flag_point)point=0.1*point;//根据flag_greater、flag_num的信息更新存储的数字if(flag_greater) num3=num3*10+s.charAt(0)-'0';else if(!flag_num) num1=num1*10+s.charAt(0)-'0';else num2=num2*10+s.charAt(0)-'0';
//          System.out.print(num1+" "+num2+" "+num3+"\n");break;case "."://在小数点前没有按下任何数字,则在前面补0if(flag_begin==false) text.setText("0");//跟新flag_point并向文本框中添加小数点if(!flag_point)  //条件是为了避免同一数字输入过多小数点{flag_point=true;text.setText(text.getText()+".");}break;default://输入符号时,检查操作数是否足够,不够则报错并相应进行标志及存储数据的设置//然后对个存储数据进行小数化的处理,若有高优先级的运算须先进行,也在这里处理if(flag_begin==false) {text.setText("mistack!need more number!");flag_mistake=true;flag_point=flag_num=flag_greater=flag_end=false;num1=num2=num3=0.0; point=1.0; op=0;}else{if(flag_greater) num3=point*num3;else if(!flag_num) num1=point*num1;else num2=point*num2;//恢复小数位数标定  设置数据num1以获取以及小数重新开始计的相关标志point=1.0;                      flag_num=true; flag_point=false;//计算需要先进行的高优先级计算段if(flag_greater) {num2=mul(num2, num3, op_greater);num3=0.0;flag_greater=false;}}}if(flag_begin){flag_begin=false;//若按键为"+" "-" "*"或"\"则记录当前操作符//若按键为"=",则完成最后一次计算并显示结果switch(btn.getText()){case "+":text.setText(text.getText()+"+");op_now=1; break;case "-":text.setText(text.getText()+"-");op_now=2; break;case "*":text.setText(text.getText()+"*");op_now=3;break;case "/":text.setText(text.getText()+"/");op_now=4;break;case "=":
//              System.out.println(num1+" "+num2+" ");if(op!=0){num1=mul(num1, num2, op);num2=0.0;}if(!flag_mistake) text.setText(String.valueOf(new DecimalFormat("0.0000").format(num1)));op=0; point=1.0;flag_end=true;break;default: flag_begin=true;//最终效果:+-*\=号,则flag_begin为false,否则为true}//进行优先级比较以及计算简化的操作if(!flag_begin&&btn.getText()!="=") {if(op==0) op=op_now; //第一个算符不需要任何多余操作,存下来就行了else if(op_now>=3&&op<3){//若当前算符优先级大于前一算符,op_greater=op_now;flag_greater=true;}else{//否则,完成前一算符的计算,将结果更新到num1,设置num2为0,更新算符num1=mul(num1, num2, op);num2=0.0;op=op_now;flag_greater=false;}}}}//真正进行计算的模块//传参:a为第一操作数,b为第二操作数,operator为算符(1:+, 2:-, 3:*, 4:\)public double mul(double a, double b, int operator){
//      System.out.print(a+" "+b+"\n"); double ans=0.0;    //ans用于存储要返回的计算结果switch(operator){case 1: ans=a+b; break;case 2: ans=a-b; break;case 3: ans=a*b; break;case 4: //除法党除数为0时进行报错,设置相应的标志以及状态为恢复初始状态if(b!=0) ans=a/b;else{System.out.println("mistake accoure");text.setText("mistack!devise 0!");flag_mistake=true;flag_point=flag_num=flag_begin=flag_greater=flag_end=false;num1=num2=num3=0.0; point=1.0; op=0;}}return ans;}//主函数,创建界面public static void main(String args[]){f_frame page=new f_frame();}
}

测试过程及结果

测试点1:除0处理:
算式设计:23+4/0-2=
依次按下”2”、”3”、”+”、”4”、”/”、”0”均正常。如下图所示:

当按下”-”号时,文本框显示报错信息:

测试点2:未按数字,直接按算符键,或连续按下两次算符键
算式设计:+
按下+号,显示结果为:

测试点3:正常的不涉及优先级及小数的运算:
算式设计:5+168-189=
显示结果:

测试点4:正常的涉及优先级以及小数的运算:
算式设计:78+69*3/2-77.25=
显示结果:

测试点5:
CE键的使用(涉及小数,优先级)
算式设计:在上述测试点4的基础上按下“CE”键。
结果显示:

测试结论:

代码执行正常,可正常完成各项计算工作。

Java简单计算器界面及功能的实现相关推荐

  1. Java 简单计算器(加法)

    Java 简单计算器(加法) 结构图: ​ 如何用java写一个简易的加法计算器?本人菜鸟一枚,半个小时完成.大部分代码的解读注释已经标记好了,如下 程序入口 程序的main方法应该始终保持干净清爽, ...

  2. Java实现计算器的基本功能

    Java实现计算器的基本功能 package p3;import java.awt.Color; import java.awt.Container; import java.awt.Dimensio ...

  3. 求java简单计算器源代码_java简单计算器源代码

    简单计算器代码 package calcultorthree; import java.awt.BorderLayout;//导入边界布局管理器类 import java.awt.GridLayout ...

  4. JAVA——简单计算器设计

    1.首先展示效果图(仅是单项运算),作为新手尽量降低了耦合,希望能得到大佬指点. (1)设置按键(作为一个父类) import java.awt.Button; import java.awt.Gri ...

  5. java计算器简单吗,java简单计算器

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 无聊做个java加减乘除计算器,int型,没有小数,,呵呵,,真特么无聊,, package swing; import javax.swing.*; i ...

  6. JAVA简单计算器(简单实现两数加减乘除)

    文章目录 前言 简易计算器 前言 今日的小练习为用户输入两个数,简易实现两数的加减乘除并可重复使用. 实现这个小功能有了大概的思路其实还好,但是我却没有止步于此,为了提升用户的体验性,保证这个小程序的 ...

  7. java简单计算器课程设计报告_JAVA课程设计之计算器设计报告

    题 目: 计算器 院(系):xxx学院 年级专业:xxx班 学生姓名:xxx 指导老师:xx老师 开始时间:200x-xx-xx 完成时间:200x-xx-xx 目 录 1. 摘 要 2. 概要设计 ...

  8. java 简单计算器

    要清理文件了,把这个代码保存一下. import java.awt.*; import java.awt.event.*; import javax.swing.*; /** topic:java-C ...

  9. java简单计算器课程设计_java仿windows简易计算器课程设计 源码+报告

    [实例简介] java仿windows简易计算器课程设计 源码+报告 课直接运行. [实例截图] [核心代码] Java课设-简易计算器 └── Java课设-简易计算器 ├── Java课程设计.d ...

最新文章

  1. 干货 | 走进Node.js之启动过程剖析
  2. MySQL alter
  3. 聊聊架构设计做些什么来谈如何成为架构师
  4. jvm内置锁synchronized不能被中断
  5. Mirantis Certification summary
  6. Javascript阻止表单提交
  7. python坐标轴刻度设置对数_用对数刻度设置刻度
  8. grep 和 sed:linux经常使用工具 amp; 基本正則表達式
  9. series、dataframe转为tensor格式数据
  10. 虚拟机网络驱动(共享文件夹)不见了的解决方案-适用于win7~win10 and Windows Server 2008~Windows Server 2012R2
  11. C++ string类相关函数
  12. java访问kudu,KUDU的java操作
  13. 国军标GJB150.8A-2009淋雨试验第三方检测机构
  14. html添加购买按钮,萤火小程序商城给前端和商品组件增加“购买”按钮的方法...
  15. 51单片机-直流电机
  16. dos命令行设置网络优先级_实用批处理:不用下软件就能 批量改名,修复网络,删除小文件...
  17. 怎么做手机App测试?app测试详细流程和方法介绍
  18. 如何提升测试人员在公司的地位
  19. 【林轩田】机器学习基石(九)——线性回归
  20. 成功操盘手必经的5个阶段

热门文章

  1. 最新Xycms广告设计中心网站系统源码V4.7
  2. 【大数据实验】06:MapReduce操作
  3. 潘多拉路由器(PandoraBox SDK Platform)远程web访问设置教程
  4. 智能电视linux系统安装当贝,智能电视怎么用U盘安装当贝市场 小白必看攻略!
  5. 影响中国发展的七大垂直搜索引擎!!
  6. Oracle数据库(三)Oracle 数据备份
  7. java截取字符串中间的某个部分
  8. 计算机的aero界面是一种,win7系统Aero特效是什么
  9. puppeteer 鼠标定位滑块_puppeteer的使用
  10. 传统媒体如何借大数据实现自我救赎