/*** 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。*/public classMyCalculator extendsJFrame implementsActionListener {

/** 计算器上的键的显示名字 */private finalString[] KEYS= { "7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};/** 计算器上的功能键的显示名字 */private finalString[] COMMAND= { "Backspace","CE","C"};/** 计算器左边的M的显示名字 */private finalString[] M= { " ","MC","MR","MS","M+"};/** 计算器上键的按钮 */privateJButton keys[] = newJButton[KEYS.length];/** 计算器上的功能键的按钮 */privateJButton commands[] = newJButton[COMMAND.length];/** 计算器左边的M的按钮 */privateJButton m[] = newJButton[M.length];/** 计算结果文本框 */privateJTextField resultText= newJTextField("0");// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字private booleanfirstDigit= true;// 计算的中间结果。private doubleresultNum= 0.0;// 当前运算的运算符privateString operator= "=";// 操作是否合法private booleanoperateValidFlag= true;/*** 构造函数*/publicMyCalculator() {

super();// 初始化计算器init();// 设置计算器的背景颜色this.setBackground(Color.LIGHT_GRAY);this.setTitle("计算器");// 在屏幕(500, 300)坐标处显示计算器this.setLocation(500,300);// 允许修改计算器的大小this.setResizable(true);// 使计算器中各组件大小合适this.pack();}

/*** 初始化计算器*/private voidinit() {

// 文本框中的内容采用右对齐方式resultText.setHorizontalAlignment(JTextField.RIGHT);// 不允许修改结果文本框resultText.setEditable(false);// 设置文本框背景颜色为白色resultText.setBackground(Color.WHITE);// 初始化计算器上键的按钮,将键放在一个画板内JPanel calckeysPanel = newJPanel();// 用网格布局器,4行,5列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素calckeysPanel.setLayout(newGridLayout(4,5,3,3));for(inti = 0;i < KEYS.length;i++) {

keys[i] = newJButton(KEYS[i]);calckeysPanel.add(keys[i]);keys[i].setForeground(Color.blue);}

// 运算符键用红色标示,其他键用蓝色表示keys[3].setForeground(Color.red);keys[8].setForeground(Color.red);keys[13].setForeground(Color.red);keys[18].setForeground(Color.red);keys[19].setForeground(Color.red);// 初始化功能键,都用红色标示。将功能键放在一个画板内JPanel commandsPanel = newJPanel();// 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素commandsPanel.setLayout(newGridLayout(1,3,3,3));for(inti = 0;i < COMMAND.length;i++) {

commands[i] = newJButton(COMMAND[i]);commandsPanel.add(commands[i]);commands[i].setForeground(Color.red);}

// 初始化M键,用红色标示,将M键放在一个画板内JPanel calmsPanel = newJPanel();// 用网格布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素calmsPanel.setLayout(newGridLayout(5,1,3,3));for(inti = 0;i < M.length;i++) {

m[i] = newJButton(M[i]);calmsPanel.add(m[i]);m[i].setForeground(Color.red);}

// 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部,// 将文本框放在北部,将calms画板放在计算器的西部。// 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内JPanel panel1 = newJPanel();// 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素panel1.setLayout(newBorderLayout(3,3));panel1.add("North",commandsPanel);panel1.add("Center",calckeysPanel);// 建立一个画板放文本框JPanel top = newJPanel();top.setLayout(newBorderLayout());top.add("Center",resultText);// 整体布局getContentPane().setLayout(newBorderLayout(3,5));getContentPane().add("North",top);getContentPane().add("Center",panel1);getContentPane().add("West",calmsPanel);// 为各按钮添加事件侦听器// 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListenerfor(inti = 0;i < KEYS.length;i++) {

keys[i].addActionListener(this);}

for(inti = 0;i < COMMAND.length;i++) {

commands[i].addActionListener(this);}

for(inti = 0;i < M.length;i++) {

m[i].addActionListener(this);}

}

/*** 处理事件*/public voidactionPerformed(ActionEvent e) {

// 获取事件源的标签String label = e.getActionCommand();if(label.equals(COMMAND[0])) {

// 用户按了"Backspace"键handleBackspace();} else if(label.equals(COMMAND[1])) {

// 用户按了"CE"键resultText.setText("0");} else if(label.equals(COMMAND[2])) {

// 用户按了"C"键handleC();} else if("0123456789.".indexOf(label) >= 0) {

// 用户按了数字键或者小数点键handleNumber(label);// handlezero(zero);} else{

// 用户按了运算符键handleOperator(label);}

}

/*** 处理Backspace键被按下的事件*/private voidhandleBackspace() {

String text = resultText.getText();inti = text.length();if(i > 0) {

// 退格,将文本最后一个字符去掉text = text.substring(0,i - 1);if(text.length() == 0) {

// 如果文本没有了内容,则初始化计算器的各种值resultText.setText("0");firstDigit= true;operator= "=";} else{

// 显示新的文本resultText.setText(text);}

}

}

/*** 处理数字键被按下的事件**@paramkey*/private voidhandleNumber(String key) {

if(firstDigit) {

// 输入的第一个数字resultText.setText(key);} else if((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {

// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面resultText.setText(resultText.getText() + ".");} else if(!key.equals(".")) {

// 如果输入的不是小数点,则将数字附在结果文本框的后面resultText.setText(resultText.getText() + key);}

// 以后输入的肯定不是第一个数字了firstDigit= false;}

/*** 处理C键被按下的事件*/private voidhandleC() {

// 初始化计算器的各种值resultText.setText("0");firstDigit= true;operator= "=";}

/*** 处理运算符键被按下的事件**@paramkey*/private voidhandleOperator(String key) {

if(operator.equals("/")) {

// 除法运算// 如果当前结果文本框中的值等于0if(getNumberFromText() == 0.0) {

// 操作不合法operateValidFlag= false;resultText.setText("除数不能为零");} else{

resultNum/= getNumberFromText();}

} else if(operator.equals("1/x")) {

// 倒数运算if(resultNum== 0.0) {

// 操作不合法operateValidFlag= false;resultText.setText("零没有倒数");} else{

resultNum= 1/ resultNum;}

} else if(operator.equals("+")) {

// 加法运算resultNum+= getNumberFromText();} else if(operator.equals("-")) {

// 减法运算resultNum-= getNumberFromText();} else if(operator.equals("*")) {

// 乘法运算resultNum*= getNumberFromText();} else if(operator.equals("sqrt")) {

// 平方根运算resultNum= Math.sqrt(resultNum);} else if(operator.equals("%")) {

// 百分号运算,除以100resultNum= resultNum/ 100;} else if(operator.equals("+/-")) {

// 正数负数运算resultNum= resultNum* (-1);} else if(operator.equals("=")) {

// 赋值运算resultNum= getNumberFromText();}

if(operateValidFlag) {

// 双精度浮点数的运算longt1;doublet2;t1 = (long) resultNum;t2 = resultNum- t1;if(t2 == 0) {

resultText.setText(String.valueOf(t1));} else{

resultText.setText(String.valueOf(resultNum));}

}

// 运算符等于用户按的按钮operator= key;firstDigit= true;operateValidFlag= true;}

/*** 从结果文本框中获取数字**@return*/private doublegetNumberFromText() {

doubleresult = 0;try{

result = Double.valueOf(resultText.getText()).doubleValue();} catch(NumberFormatException e) {

}

returnresult;}

public static voidmain(String args[]) {

MyCalculator calculator1 = newMyCalculator();calculator1.setVisible(true);calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

}

java实现计算器功能_用java实现计算器功能相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java 1.6 最大化_关于java:JDK 1.6和1.7中的新功能

    我很了解JDK 1.5.众所周知,除了新的API(例如AtomicInteger),还有一些主要的语言更改,例如提供对泛型的支持.添加枚举.私有化自动装箱和自动取消装箱等. 我想找到一些资源,它们最好 ...

  3. java全文检索功能_基于Java的全文检索引擎简介

    Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基 ...

  4. java mysql点赞功能_用Java做一个类似于微博QQ空间点赞的功能-Fun言

    点赞是一个互动性很强的功能,网站加入点赞可以增强用户之间的亲密度,可以利用点赞排出受欢迎文章或者其他的列表,所以今天教大家如何做一个类似于微博.QQ空间的点赞功能 需求分析: 首先要明确这个功能是需要 ...

  5. 超市管理系统java swing+mysql报告_基于java+swing+mysql的超市管理系统

    运行环境:java jdk 1.8 IDE环境:Eclipse,Myeclipse,IDEA都可以 硬件环境:windows 7/8/10 2G内存以上(推荐4G,4G以上更好) 可以实现: 销售管理 ...

  6. java是什么格式_是java格式

    错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...

  7. java农产品查询系统_基于java的农产品销售系统的设计与实现论文.docx

    基于java的农产品销售系统的设计与实现论文.docx 分类号_______________ 密级________________ UDC _______________ 学号_毕业设计(论文)论文题 ...

  8. JAVA redis缓存过期_失效java服务器

    Java 并发/多线程教程--4并发模型 本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平 ...

  9. Java的泛型特性_学习Java的重中之重!

    Java的"泛型"特性,你以为自己会了 使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合.反射.泛型.注解等等,这些可以说我们在平时开发中是经常使用到的, ...

  10. java 版本查看命令_查看Java版本命令如何查看?Java常用命令详解

    现在程序员开发项目都在使用工具,很多人可能都忘记了Java自带命令,下面就让我来介绍些吧. 1.java.exe: 运行java程序,这个相信每一位用Java的人知道了. 2.javac.exe: 编 ...

最新文章

  1. luogu P3455 [POI2007]ZAP-Queries (莫比乌斯反演 + 整除分块)
  2. 第五课.可变图结构下的归纳式学习图注意力
  3. 携手长江天成转型 谋定·农业大健康-林裕豪:升级山茶油农产品
  4. surefire单元测试 并发 提速
  5. 虚拟机如何上网以及互ping问题
  6. ORACLE 11g安装图解
  7. java acm包,Java利用ACM外置包的基本图形操作
  8. 实战:基于服务端开发和前后端分离开发区别
  9. 基于大数据挖掘----浅谈大数据与大数据挖掘
  10. 中国黑客常用的八种工具及其防御方法(转)
  11. Canvas 画直线
  12. Python 获取LOL所有英雄的传说
  13. Ubuntu16.04 + TITAN XP 深度学习服务器环境搭建(驱动安装,CUNN7.6.5, CUDA9.0) (避坑篇)
  14. Python 第三方模块 科学计算 SciPy模块4 线性代数1
  15. 企业微信之发送应用消息案例
  16. oracle数据库什么情况下创建索引比较好
  17. 运动会分数统计的实验报告(数组实现)
  18. cordova打包app热更新问题
  19. 2022劳务员-岗位技能(劳务员)特种作业证考试题库及模拟考试
  20. LDO和BUCK降压稳压器对比

热门文章

  1. Java简繁体汉字转化
  2. html中如何做背景渐变,html如何设置背景径向渐变
  3. origin数据平滑_Origin平滑曲线怎么设置?平滑曲线处理方法讲解
  4. TapTap推广统计逻辑
  5. python中sorted函数逆序_python中sorted函数
  6. python实现sorted函数_Python sorted函数及用法
  7. Self-Supervised 3D Face Reconstruction via Conditional Estimation
  8. led伏安特性实验误差分析_伏安法测量误差分析-北京新东方
  9. 【C语言】贪吃蛇小游戏代码详解
  10. 外贸人必收藏开发客户、找邮箱等高效工具