java编写的简单的计算器程序
用java代码写的简易计算器(可以实现基本的加减乘除功能)

⽤java代码写的简易计算器(可以实现基本的加减乘除功能)package A;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.*;public class Calcular3 extends JFrame implements ActionListener,MouseListener{private int m1=0,n=0;//private double m2=0;//运算的数private int flag=0;JFrame f;JPanel p1,p2,p3;JTextField t;JButton b1[]=new JButton[18];String b[]= {"1","2","3","4","5","6","7","8","9","0","清空","退格",".","=","+","-","*","/"};public Calcular3(){f=new JFrame("计算器");t=new JTextField(35);p1=new JPanel();p2=new JPanel();p3=new JPanel();f.setBounds(100, 100, 400, 200);f.add(p1,BorderLayout.NORTH);f.add(p2,BorderLayout.CENTER);f.add(p3,BorderLayout.EAST);p2.setLayout(new GridLayout(5,3));p3.setLayout(new GridLayout(4,1));p1.add(t);for(int i=0;i<14;i++) {b1[i]=new JButton(b[i]);p2.add(b1[i]);b1[i].addActionListener(this);}for(int i=14;i<18;i++) {b1[i]=new JButton(b[i]);p3.add(b1[i]);b1[i].addActionListener(this);}/*for(int i=0;i<18;i++) {b1[i].addActionListener(this);}*/f.setVisible(true);}//实现接⼝的⽅法public void mouseClicked(MouseEvent e) {}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void actionPerformed(ActionEvent e) {String str="";int i;for(i=0;i<=9;i++) {if(e.getSource()==b1[i]) {if(i==9) {n=n*10;}else {n=n*10+i+1;}str=String.valueOf(n);//整形n转换成字符串strt.setText(str);//显⽰到⽂本框上}}for(i=14;i<18;i++) {//+、-、*、/if(e.getSource()==b1[i]) {//匹配运算符m1=Integer.parseInt(t.getText());if(flag==15) {m2=m1+m2;}else if(flag==16) {m2=m1-m2;}else if(flag==17) {m2=m1*m2;}else if(flag==18) {m2=m1/m2;}else m2=m1;//若⽆连续的运算符运算,保存当前数据到m2 if(i==14) flag=15;else if(i==15) flag=16;else if(i==16) flag=17;else flag=18;str=String.valueOf(b[i]);t.setText(str);//显⽰到⽂本框上n=0;//还原,记录下次数据break;//找到匹配数据退出循环}}if(e.getSource()==b1[13]) {//=m1=Integer.parseInt(t.getText());if(flag==15) {m2=m2+m1;}else if(flag==16) {m2=m2-m1;}else if(flag==17) {m2=m2*m1;}else if(flag==18) {m2=m2/m1;}else m2=m1;str=String.valueOf(m2);t.setText(str);//显⽰到⽂本框上n=0;//还原,记录下次数据flag=0;//flag还原0,表明没有未处理的运算符}if(e.getSource()==b1[10]) {//各变量变为0 清空m1=0;m2=0;flag=0;n=0;t.setText("0");//显⽰到⽂本框上}if(e.getSource()==b1[11]) {//退格m1=(int)(Double.parseDouble(t.getText())/10);n=m1;str=String.valueOf(m1);t.setText(str);}if(e.getSource()==b1[12]) {//⼩数点m1=Integer.parseInt(t.getText());str=String.valueOf(m1+b[12]);t.setText(str);//显⽰到⽂本框上int j=0;for(i=0;i<=9;i++) {if(e.getSource()==b1[i]) {j++;m2=Math.pow(0.1, j)*Integer.parseInt(b[i]);str=String.valueOf(m1+m2);t.setText(str);//显⽰到⽂本框上}}}}//主函数public static void main(String[] args) {new Calcular3();}}。
java计算器程序代码

import java.awt.*;//计算器实例import java.awt.event.*;public class calculator{public static void main(String args[]){MyWindow my=new MyWindow("计算器");}}class MyWindow extends Frame implements ActionListener{ StringBuffer m=new StringBuffer();int p;TextField tex;Buttonb0,b1,b2,b3,b4,b5,b6,b7,b8,b9,jia,jian,cheng,chu,deng,dian,qingling,kaifang;MyWindow(String s){super(s);//StringBuffer s2=new StringBuffer();//String s;tex=new TextField(18);b0=new Button(" 0 ");b1=new Button(" 1 ");b2=new Button(" 2 ");b3=new Button(" 3 ");b4=new Button(" 4 ");b5=new Button(" 5 ");b6=new Button(" 6 ");b7=new Button(" 7 ");b8=new Button(" 8 ");b9=new Button(" 9 ");dian=new Button(" . ");jia=new Button(" + ");jian=new Button(" - ");cheng=new Button(" × ");chu=new Button(" / ");deng=new Button(" = ");qingling=new Button(" 清零 ");kaifang=new Button(" √ ");setLayout(new FlowLayout());add(tex);add(b0);add(b1);add(b2);add(b3);add(b4);add(b5);add(b6);add(b7);add(b8);add(b9);add(dian);add(jia);add(jian);add(cheng);add(chu);add(kaifang);add(qingling);add(deng);b0.addActionListener(this);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);b4.addActionListener(this);b5.addActionListener(this);b6.addActionListener(this);b7.addActionListener(this);b8.addActionListener(this);b9.addActionListener(this);jia.addActionListener(this);jian.addActionListener(this);cheng.addActionListener(this);chu.addActionListener(this);dian.addActionListener(this);deng.addActionListener(this);qingling.addActionListener(this); kaifang.addActionListener(this);setBounds(200,200,160,280);setResizable(false);//不可改变大小setVisible(true);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ee){ System.exit(0);}});}public void actionPerformed(ActionEvent e){if(e.getSource()==b0){m=m.append("0");tex.setText(String.valueOf(m));}if(e.getSource()==b1){m=m.append("1"); tex.setText(String.valueOf(m)); }if(e.getSource()==b2){m=m.append("2"); tex.setText(String.valueOf(m)); }if(e.getSource()==b3){m=m.append("3"); tex.setText(String.valueOf(m)); }if(e.getSource()==b4){m=m.append("4"); tex.setText(String.valueOf(m));}if(e.getSource()==b5){m=m.append("5"); tex.setText(String.valueOf(m)); }if(e.getSource()==b6){m=m.append("6"); tex.setText(String.valueOf(m)); }if(e.getSource()==b7){m=m.append("7"); tex.setText(String.valueOf(m)); }if(e.getSource()==b8){m=m.append("8"); tex.setText(String.valueOf(m)); }if(e.getSource()==b9){m=m.append("9"); tex.setText(String.valueOf(m)); }if(e.getSource()==jia){m=m.append("+"); tex.setText(String.valueOf(m)); }if(e.getSource()==jian){m=m.append("-"); tex.setText(String.valueOf(m)); }if(e.getSource()==cheng){m=m.append("*"); tex.setText(String.valueOf(m)); }if(e.getSource()==chu){m=m.append("/"); tex.setText(String.valueOf(m)); }if(e.getSource()==dian){m=m.append("."); tex.setText(String.valueOf(m)); }String mm=String.valueOf(m);int p1=mm.indexOf("+");int p2=mm.indexOf("-");int p3=mm.indexOf("*");int p4=mm.indexOf("/");if(p1!=-1){p=p1;}else if(p3!=-1){p=p3;}else if(p2!=-1){p=p2;}else if(p4!=-1){p=p4;}if(e.getSource()==deng){String m1=mm.substring(0,p);String m2=mm.substring(p+1);String ch=mm.substring(p,p+1);//System.out.println(m1);//System.out.println(m2);//System.out.println(ch);if(ch.equals("+")){float n1=Float.parseFloat(m1); float n2=Float.parseFloat(m2); float sum=n1+n2;String su=String.valueOf(sum); tex.setText(su);}if(ch.equals("-")){float n1=Float.parseFloat(m1);float n2=Float.parseFloat(m2);float sum=n1-n2;String su=String.valueOf(sum);tex.setText(su);}if(ch.equals("*")){float n1=Float.parseFloat(m1);float n2=Float.parseFloat(m2);float sum=n1*n2;String su=String.valueOf(sum);tex.setText(su);}if(ch.equals("/")){float n1=Float.parseFloat(m1);float n2=Float.parseFloat(m2);float sum=n1/n2;String su=String.valueOf(sum);tex.setText(su);}}if(e.getSource()==qingling){StringBuffer kk=new StringBuffer(); m=kk;tex.setText("0");// System.out.println(mm);}if(e.getSource()==kaifang){String t=tex.getText();float num=Float.parseFloat(t);double nub=Math.sqrt(num);tex.setText(String.valueOf(nub)); }}}。
Java基础实例--文件MD5值计算器

文件MD5值计算器教程1 功能要求能够选择本地任意文件,点击计算,则给出选中文件的MD5值。
2 开发目的1.考察Java图形化编程能力2.考察对第三方实用类的使用能力3 所需Java核心知识1.Java Swing2.Java文件流4 开发环境及相关软件准备需要安装的软件为:1.JDK6Beans7.03.MD5.java(该文件为封装好的Java实用类,该类从互联网上获得,由第三方开发者开发,其包含了计算MD5值的所有中间方法,本例主要考察对该类的调用,可推广)。
5 开发思路本例的难点在于MD5算法的实现,由于MD5算法是开放不可逆算法,已经在商业领域成功应用多年,因此MD5算法的实现可方便地从网上获得,本例从网上下载的MD5.java,包含了MD5算法实现的过程,以及最终调用的方法。
对于开发者而言,只需关注其中的public static String toMD5(String source) 和public static String getFileMD5(File file) 两个方法。
第一个方法即输入字符串得到加密结果,第二个方法则是输入文件对象,得到加密结果。
本例实现的是对文件的加密,实际上是对文件内容的加密,因此需要将文件对象转换为文件流,方便的是getFileMD5(File file)方法已经包含了对文件流的转换工作。
开发者只需要提供File对象,就可直接计算得出MD5值。
而文件的选择和File对象的获取可通过Swing的JFileChooser对象来实现。
6 开发步骤6.1 NetBeans项目的建立打开NetBeans7.0,在左侧项目区右键—>新建项目,选择其中的Java—>Java桌面应用程序,如图所示。
下一步,免责声明下一步,输入项目名称MD5Calc,其余可默认,如图所示。
点击完成后,项目创建成功。
6.2 界面设计项目建立完成后,如图所示。
如上图,左边为项目区,列出了本机开发的所有项目,及每个项目的文件结构,每个Java桌面程序的项目一般分为META-INF、md5Calc两个包,其中md5calc下分resources包,resources下再划分busyicons包。
利用ANTLR4实现一个简单的四则运算计算器

利⽤ANTLR4实现⼀个简单的四则运算计算器利⽤ANTLR4实现⼀个简单的四则运算计算器ANTLR4介绍ANTLR能够⾃动地帮助你完成词法分析和语法分析的⼯作, 免去了⼿写去写词法分析器和语法分析器的⿇烦它是基于LL(k)的, 以递归下降的⽅式进⾏⼯作.ANTLR v4还⽀持多种⽬标语⾔。
本⽂⽤java来写代码。
总结⼀下:ANTRL能⾃动完成语法分析和词法分析过程,并⽣产框架代码,让我们写相关过程的时候只需要往固定位置添加代码即可。
⼤⼤简便了语法分析词法分析的过程。
ANTLR4安装配置因为⽤IDEA,所以直接介绍在IDEA中怎么安装,在IDEA中安装ANTLR4相关插件即可。
然后MAVEN引⽤下```<dependency><groupId>org.antlr</groupId><artifactId>antlr4</artifactId><version>4.5.2</version></dependency>```ANTLR4 语法描述⽂件ANTLR4有专门的语法来构建整个过程grammar Expr;prog : stat+;stat: expr NEWLINE # printExpr| ID '=' expr NEWLINE # assign| NEWLINE # blank;expr: expr op=('*'|'/') expr # MulDiv| expr op=('+'|'-') expr # AddSub| INT # int| ID # id| '(' expr ')' # parens;MUL : '*' ; // assigns token name to '*' used above in grammarDIV : '/' ;ADD : '+' ;SUB : '-' ;ID : [a-zA-Z]+ ;INT : [0-9]+ ;NEWLINE:'\r'? '\n' ;WS : [ \t]+ -> skip;相关语法很简单,整体来说⼀个原则,递归下降。
java计算器设计实验报告

java计算器设计实验报告《Java计算器设计实验报告》摘要:本实验报告基于Java语言,设计了一个简单的计算器。
通过使用面向对象的编程方法,实现了基本的加、减、乘、除运算,并且实现了用户界面的交互操作。
本实验报告详细介绍了计算器的设计思路、实现过程和代码结构,并对实验结果进行了分析和总结。
1. 引言计算器是人们日常生活中常用的工具之一,它能够帮助人们进行简单的数学运算。
随着计算器的普及和发展,计算器的功能也越来越丰富,例如科学计算器、金融计算器等。
本实验旨在通过使用Java语言,设计一个简单的计算器,以加深对面向对象编程的理解和应用。
2. 设计思路在设计计算器时,首先需要确定计算器的功能需求,包括加法、减法、乘法、除法等基本运算。
其次,需要考虑用户界面的设计,使用户能够方便地输入数字和选择运算符。
最后,需要考虑计算器的实现方式,包括数据结构的选择、算法的设计等。
3. 实现过程在本实验中,我们使用Java语言和Swing库来实现计算器的设计。
首先,我们创建一个Calculator类来处理计算器的逻辑操作,包括加法、减法、乘法、除法等运算。
然后,我们创建一个CalculatorUI类来处理用户界面的设计,包括数字按钮、运算符按钮和显示屏的设计。
最后,我们将Calculator类和CalculatorUI类进行整合,实现一个完整的计算器。
4. 代码结构以下是计算器的主要代码结构:Calculator类:- add(double a, double b):加法运算- subtract(double a, double b):减法运算- multiply(double a, double b):乘法运算- divide(double a, double b):除法运算CalculatorUI类:- createNumberButton(int number):创建数字按钮- createOperatorButton(String operator):创建运算符按钮- createDisplayScreen():创建显示屏Main类:- main(String[] args):主函数,启动计算器界面5. 实验结果分析通过实验,我们成功地实现了一个简单的计算器,用户能够输入数字并进行加、减、乘、除等运算。
Java程序设计计算器实验报告

长江大学工程技术学院实验报告
通信 61302 胡炯
} 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("%")) { // 百分号运算,除以 100 resultNum = resultNum / 100; } else if (operator.equals("+/-")) { // 正数负数运算 resultNum = resultNum * (-1); } else if (operator.equals("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { // 双精度浮点数的运算 long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { resultText.setText(String.valueOf(t1)); } else { resultText.setText(String.valueOf(resultNum)); } } (2)主要功能过程说明 1 构造函数 2 初始化计算器 3 处理事件 4 处理 Backspace 键被按下的事件 5 处理数字键被按下的事件 6 处理 C 键被按下的事件 7 处理运算符键被按下的事件 8 从结果文本框中获取数字 (3)功能流程图
基于java的简易计算器的设计

基于java的简易计算器的设计摘要自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了C语言中指针特点,因而变得简单了很多。
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,其具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
本文介绍了用java语言编写一个简易计算器。
实现数学上的加、减、乘、除、乘方、开方、阶乘、正弦、余弦运算等相关运算。
利用这个程序可以方便的进行日常性的小规模运算,小巧简易,是个实用的工具。
关键词:程序设计;简易计算器;java语言THE DESIGN OF SIMPLE CALCULATOR BASED ON JA V AABSTRACTSince the inception of the java language, java language Take irresistible trend soon beca me widespread international popular object-oriented programming language, both with advan ced language features, and less of the C language pointer characteristics, and thus becomes a l ot simpler . Java is a cross-platform application software can write object-oriented programmi ng language, which has excellent versatility, efficiency, platform portability, and security, are widely used in personal PC, data center, gaming consoles, scientific super-computers, mobile phones and the Internet, also has the world's largest developer of professional community. In t he global cloud computing and mobile Internet industry environment, Java and more have sig nificant advantages and broad prospects.This article describes the use java language a simple calculator. Achieve mathematical addition, subtraction, multiplication, division, involution, evolution, factorial, sine, cosine op erations and other related operations. With this program you can easily carry out daily operati ons of small-scale, small simple, is a useful tool.Key words:program design;simple calculator;java language目录1前言 (1)1.1 课程设计背景 (1)1.2 需求环境 (1)1.3 课程设计思路 (1)2课程设计概要 (2)3 计算器详细设计 (3)3.1 计算器界面……….………….........………………………………………. .33.1.1 CAL主类的显示分布 (3)3.1.2计算器显示界面实现代码 (3)3.2 监听各个按钮的类 (5)3.2.1 编写监听类目的 (5)3.2.2 监听类实现代码 (5)3.3 按键响应类 (7)3.3.1 响应类编写的目的 (7)3.2.2 响应类实现代码 (7)3.3 运算处理类 (9)3.3.1 处理方式 . (9)3.2.2 处理类实现代码 (9)4 运行与调试 (12)4.1 进入程序主界面 (12)4.2 加减乘除功能实现 (12)4.3 正余弦、正切功能实现 (13)4.4 阶乘功能实现 (13)4.5 乘方、开方功能实现 (14)5 实验总结 (15)参考文献 (16)附录:源代码 (17)1 前言1.1 课程设计背景日常生活中我们经常会遇到一些小型数据计算的问题,本课程设计就是以此为出发点,设计了这样一个简单的计算器,用以实现基本的数学运算。
java编写的简单计算器

import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;public class Calculator extends JFrame{private JPanel jp;private JTextField tAdd1,tAdd2,tAdd3,tSub1,tSub2,tSub3,tMul1,tMul2,tMul3,tDiv1,tDiv2,tDiv3;private JLabel tShow,label1,label2,label3,label4,label5,label6,label7,label8;private JButton result,exit;//构造器public Calculator(){super("简易计算器");Init();}//初始化public void Init(){ //显示区tShow=new JLabel(" 感谢使用简易计算器!"); tShow.setBounds(0, 0, 300, 20);//加法区tAdd1=new JTextField(); tAdd2=new JTextField(); tAdd3=new JTextField();label1=new JLabel("+"); label2=new JLabel("=");tAdd1.setBounds(5, 25, 80, 20); label1.setBounds(85, 25, 15, 15);tAdd2.setBounds(100,25,80,20); label2.setBounds(180,25,15,15);tAdd3.setBounds(190,25,130,20);//减法区tSub1=new JTextField(); tSub2=new JTextField(); tSub3=new JTextField();label3=new JLabel("-"); label4=new JLabel("=");tSub1.setBounds(5, 50, 80, 20); label3.setBounds(85, 50, 15, 15);tSub2.setBounds(100,50,80,20); label4.setBounds(180,50,15,15);tSub3.setBounds(190,50,130,20);//乘法区tMul1=new JTextField(); tMul2=new JTextField(); tMul3=new JTextField();label5=new JLabel("*"); label6=new JLabel("=");tMul1.setBounds(5, 75, 80, 20); label5.setBounds(85,75, 15, 15);tMul2.setBounds(100,75,80,20); label6.setBounds(180,75,15,15);tMul3.setBounds(190,75,130,20);//除法区tDiv1=new JTextField(); tDiv2=new JTextField(); tDiv3=new JTextField();label7=new JLabel("/"); label8=new JLabel("=");tDiv1.setBounds(5, 100, 80, 20); label7.setBounds(85,100, 15, 15);tDiv2.setBounds(100,100,80,20); label8.setBounds(180,100,15,15);tDiv3.setBounds(190,100,130,20);result=new JButton("开始计算");result.setBounds(10,140,100,40);exit=new JButton("退出");exit.setBounds(180,140,100,40);jp=(JPanel)this.getContentPane();jp.setLayout(null);jp.add(tShow); jp.add(tAdd1); jp.add(label1); jp.add(tAdd2); jp.add(label2); jp.add(tAdd3);jp.add(tSub1); jp.add(label3); jp.add(tSub2); jp.add(label4); jp.add(tSub3); jp.add(tMul1);jp.add(tMul2); jp.add(label5); jp.add(tMul3); jp.add(label6); jp.add(tDiv1); jp.add(label7);jp.add(tDiv2); jp.add(label8); jp.add(tDiv3); jp.add(result); jp.add(exit);//动作事件exit.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.exit(0);}});result.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){Double d = null;String a=null,b=null;a=tAdd1.getText(); b=tAdd2.getText();if(!a.isEmpty()&&!b.isEmpty()) //if(a!=null&b!=null&&a!=""&b!="")不行{d=Double.parseDouble(a)+Double.parseDouble(b);tAdd3.setText(d+""); //将d转换为字符串型// tAdd3.setText(String.valueOf(d));}a=tSub1.getText(); b=tSub2.getText();if(!a.isEmpty()&&!b.isEmpty()){d=Double.parseDouble(a)-Double.parseDouble(b);tSub3.setText(d+"");}a=tMul1.getText(); b=tMul2.getText();if(!a.isEmpty()&&!b.isEmpty()){d=Double.parseDouble(a)*Double.parseDouble(b);tMul3.setText(d+"");}a=tDiv1.getText(); b=tDiv2.getText();if(!a.isEmpty()&&!b.isEmpty()){d=Double.parseDouble(a)/Double.parseDouble(b);tDiv3.setText(String.valueOf(d));}}});}//主函数public static void main(String[] args){Calculator cal=new Calculator();cal.setVisible(true);cal.setResizable(false);cal.setSize(330,230);cal.setLocationRelativeTo(null);cal.setDefaultCloseOperation(EXIT_ON_CLOSE);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算器项目内容:编写一个Applet,模仿windows附件所带计算器的功能,可以帮助用户完成计算功能,具体如下图所示。
项目要求:使用图形的方式借助窗口、菜单、按钮等标准界面元素和鼠标操作,来帮助用户方便地向计算机系统发出命令,启动操作,并将系统运行的结果同样以图形的方式显示给用户,这样更加直观和生动;1.Applet容器中组件的添加与设置,包括面板以及菜单的使用;2.容器中组件的布局管理;3.Java核心包中数组、数学计算类的使用;4.异常的处理;5.事件处理模型中的三类对象的使用:1.Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。
2.Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。
3.Event handler-事件处理者,接收事件对象并对其进行处理的对象。
6.程序中事件处理的流程:1.计算流程的细化参考代码:import java.awt.*;import ng.*;import javax.swing.*;import javax.swing.event.*;import java.awt.event.*;import java.text.DecimalFormat;public class Calculatorimplements ActionListener { //导入动作监听接口//设计面板中的单位JFrame frame;JTextField textAnswer;JPanel panel, panel1, panel2, panel3;JMenuBar mainMenu;JTextField textMemory;JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状JButton buttonBk, buttonCe, buttonC;JButton button[];JButton buttonMC, buttonMR, buttonMS, buttonMAdd;JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul, buttonDiv, buttonMod;JButton buttonSqrt, buttonDao, buttonEqual;JMenu editMenu, viewMenu, helpMenu;JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal; DecimalFormat df; //设置数据输出精度boolean clickable; //控制当前能否按键double memoryd; //使用内存中存储的数字int memoryi;double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd)short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算String copy; //做复制用JTextArea help; //帮助JScrollPane scrollHelp;//构造函数public Calculator() {clickable = true;answerd = 0;frame = new JFrame("计算器");df = new DecimalFormat("0.##############"); //设置数据输出精度(对于double型值) textAnswer = new JTextField(15);textAnswer.setText("");textAnswer.setEditable(false);textAnswer.setBackground(new Color(255, 255, 255));panel = new JPanel();frame.getContentPane().add(panel);panel1 = new JPanel();panel2 = new JPanel();panel.setLayout(new BorderLayout());//设计整个面板mainMenu = new JMenuBar();editMenu = new JMenu("编辑(E)");viewMenu = new JMenu("查看(V)");helpMenu = new JMenu("帮助(H)");copyItem = new JMenuItem(" 复制(C) Ctrl+C");copyItem.addActionListener(this);pasteItem = new JMenuItem(" 粘贴(V) Ctrl+V");pasteItem.addActionListener(this);editMenu.add(copyItem);editMenu.add(pasteItem);tItem = new JMenuItem("●标准型(T)");tItem.addActionListener(this);sItem = new JMenuItem(" 科学型(S)");sItem.addActionListener(this);numberGroup = new JMenuItem(" 数字分组(I)");numberGroup.addActionListener(this);viewMenu.add(tItem);viewMenu.add(sItem);viewMenu.add(numberGroup);topHelp = new JMenuItem(" 帮助主题(H)");topHelp.addActionListener(this);help = new JTextArea(5, 20);scrollHelp = new JScrollPane(help);help.setEditable(false);help.append("执行简单计算\n");help.append("1. 键入计算的第一个数字。
\n");help.append("2. 单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。
\n"); help.append("3. 键入计算的下一个数字。
\n");help.append("4. 输入所有剩余的运算符和数字。
\n");help.append("5. 单击“=”。
\n");aboutCal = new JMenuItem(" 关于计算器(A)");aboutCal.addActionListener(this);helpMenu.add(topHelp);helpMenu.add(aboutCal);mainMenu.add(editMenu);mainMenu.add(viewMenu);mainMenu.add(helpMenu);panel.add(mainMenu, BorderLayout.NORTH);panel.add(textAnswer, BorderLayout.CENTER);panel.add(panel1, BorderLayout.SOUTH);panel1.setLayout(new BorderLayout());textMemory = new JTextField(3);textMemory.setEditable(false);textMemory.setBackground(new Color(217, 217, 217)); labelMemSpace = new JLabel(" "); buttonBk = new JButton("Backspace");buttonBk.setForeground(new Color(255, 0, 0)); buttonCe = new JButton("CE");buttonCe.setForeground(new Color(255, 0, 0)); buttonC = new JButton("C");buttonC.setForeground(new Color(255, 0, 0)); buttonBk.addActionListener(this);buttonCe.addActionListener(this);buttonC.addActionListener(this);panel1.add(panel2, BorderLayout.NORTH);panel2.setLayout(new FlowLayout(FlowLayout.RIGHT)); panel2.add(textMemory);panel2.add(labelMemSpace);panel2.add(buttonBk);panel2.add(buttonCe);panel2.add(buttonC);panel3 = new JPanel();panel1.add(panel3, BorderLayout.CENTER);button = new JButton[10];for (int i = 0; i < button.length; i++) {button[i] = new JButton(Integer.toString(i));button[i].setForeground(new Color(0, 0, 255));}buttonMC = new JButton("MC");buttonMC.setForeground(new Color(255, 0, 0)); buttonMR = new JButton("MR");buttonMR.setForeground(new Color(255, 0, 0)); buttonMS = new JButton("MS");buttonMS.setForeground(new Color(255, 0, 0)); buttonMAdd = new JButton("M+");buttonMAdd.setForeground(new Color(255, 0, 0)); buttonDot = new JButton(".");buttonDot.setForeground(new Color(0, 0, 255)); buttonAddAndSub = new JButton("+/-"); buttonAddAndSub.setForeground(new Color(0, 0, 255)); buttonAdd = new JButton("+");buttonAdd.setForeground(new Color(255, 0, 0)); buttonSub = new JButton("-");buttonSub.setForeground(new Color(255, 0, 0)); buttonMul = new JButton("*");buttonMul.setForeground(new Color(255, 0, 0)); buttonDiv = new JButton("/");buttonDiv.setForeground(new Color(255, 0, 0)); buttonMod = new JButton("%");buttonMod.setForeground(new Color(0, 0, 255)); buttonSqrt = new JButton("sqrt");buttonSqrt.setForeground(new Color(0, 0, 255)); buttonDao = new JButton("1/x");buttonDao.setForeground(new Color(0, 0, 255)); buttonEqual = new JButton("=");buttonEqual.setForeground(new Color(255, 0, 0));//将所有行为与监听绑定panel3.setLayout(new GridLayout(4, 6));panel3.add(buttonMC);panel3.add(button[7]);button[7].addActionListener(this); panel3.add(button[8]);button[8].addActionListener(this); panel3.add(button[9]);button[9].addActionListener(this); panel3.add(buttonDiv); buttonDiv.addActionListener(this); panel3.add(buttonSqrt); buttonSqrt.addActionListener(this); panel3.add(buttonMR); buttonMR.addActionListener(this); panel3.add(button[4]);button[4].addActionListener(this); panel3.add(button[5]);button[5].addActionListener(this); panel3.add(button[6]);button[6].addActionListener(this); panel3.add(buttonMul); buttonMul.addActionListener(this); panel3.add(buttonMod); buttonMod.addActionListener(this); panel3.add(buttonMS); buttonMS.addActionListener(this); panel3.add(button[1]);button[1].addActionListener(this); panel3.add(button[2]);button[2].addActionListener(this); panel3.add(button[3]);panel3.add(buttonSub);buttonSub.addActionListener(this);panel3.add(buttonDao);buttonDao.addActionListener(this);panel3.add(buttonMAdd);buttonMAdd.addActionListener(this);panel3.add(button[0]);button[0].addActionListener(this);panel3.add(buttonAddAndSub);buttonAddAndSub.addActionListener(this);panel3.add(buttonDot);buttonDot.addActionListener(this);panel3.add(buttonAdd);buttonAdd.addActionListener(this);panel3.add(buttonEqual);buttonEqual.addActionListener(this);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);frame.pack();frame.show();}//设置各个按钮行为public void actionPerformed(ActionEvent event) {boolean sign = false; //判断是否是double型数参与运算,是为true,不是为false Object temp = event.getSource();try {//如果按下数据按钮,将按下的按钮代表的数据插入的当前文本框字符串之后for (int i = 0; i <= 9; i++)if (temp == button[i] && clickable == true)textAnswer.setText(textAnswer.getText() + Integer.toString(i));//按下'.'按钮时,判断当前文本框内字符串中含不含'.',如果已含,则不允许再插入'.' if (temp == buttonDot && clickable == true) {boolean isDot = false;if (textAnswer.getText().length() == 0)isDot = true;for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}if (isDot == false)textAnswer.setText(textAnswer.getText() + ".");}if ( (temp == buttonAdd || temp == buttonSub || temp == buttonMul || temp == buttonDiv) && clickable == true) {//'+'操作if (temp == buttonAdd) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText()); }textAnswer.setText("");prekey = key = 0;}//'-'操作if (temp == buttonSub) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText()); }textAnswer.setText("");prekey = key = 1;}//'*'操作if (temp == buttonMul) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText()); }textAnswer.setText("");prekey = key = 2;}//'/'操作if (temp == buttonDiv) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText());}textAnswer.setText("");prekey = key = 3;}}//'='操作if (temp == buttonEqual && clickable == true) {//如果连续按'=',则进行连续运算if (prekey == 5) {if (key == 0) {answerd += vard;textAnswer.setText(df.format(answerd));}if (key == 1) {answerd -= vard;textAnswer.setText(df.format(answerd));}if (key == 2) {answerd *= vard;textAnswer.setText(df.format(answerd));}if (key == 3) {if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零");clickable = false;}else {answerd /= vard;textAnswer.setText(df.format(answerd));}}}else {vard = Double.parseDouble(textAnswer.getText());if (key == 0) {prekey = -1;answerd += Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}if (key == 1) {prekey = -1;answerd -= Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}if (key == 2) {prekey = -1;answerd *= Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}if (key == 3) {prekey = -1;if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}else {answerd /= Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}}}prekey = 5;}//'%'操作,对第二个操作数除以100if (temp == buttonMod && clickable == true) {if (answerd == 0) {String s = textAnswer.getText();textAnswer.setText(s);}else {boolean isDot = false;for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}//如果是double数,除100if (isDot == true) {double dtemp = Double.parseDouble(textAnswer.getText());dtemp = dtemp / 100.0;textAnswer.setText(Double.toString(dtemp));}else {//如果是int数但能被100整除,则去掉末尾两个零if (Integer.parseInt(textAnswer.getText()) % 100 == 0) {int itemp = Integer.parseInt(textAnswer.getText());itemp /= 100;textAnswer.setText(Integer.toString(itemp));}//如果是int数,但不能被100整除,则按double数处理else {double dtemp = Double.parseDouble(textAnswer.getText());dtemp = dtemp / 100.0;textAnswer.setText(Double.toString(dtemp));}}}}//开根号运算if (temp == buttonSqrt && clickable == true) {String s = textAnswer.getText();if (s.charAt(0) == '-') {textAnswer.setText("负数不能开根号");clickable = false;}elsetextAnswer.setText(Double.toString(ng.Math.sqrt(Double.parseDouble(textAnswer.getText()))));}//倒数运算if (temp == buttonDao && clickable == true) {if (textAnswer.getText().charAt(0) == '0' &&textAnswer.getText().length() == 1) {textAnswer.setText("零不能求倒数");clickable = false;}else {boolean isDec = true;int i, j, k;String s = Double.toString(1 / Double.parseDouble(textAnswer.getText()));for (i = 0; i < s.length(); i++)if (s.charAt(i) == '.')break;for (j = i + 1; j < s.length(); j++)if (s.charAt(j) != '0') {isDec = false;break;}if (isDec == true) {String stemp = "";for (k = 0; k < i; k++)stemp += s.charAt(k);textAnswer.setText(stemp);}elsetextAnswer.setText(s);}}//按下'+/-'按钮时处理if (temp == buttonAddAndSub && clickable == true) {boolean isNumber = true;String s = textAnswer.getText();for (int i = 0; i < s.length(); i++)if (! (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.' || s.charAt(i) == '-')) {isNumber = false;break;}if (isNumber == true) {//如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉if (s.charAt(0) == '-') {textAnswer.setText("");for (int i = 1; i < s.length(); i++) {char a = s.charAt(i);textAnswer.setText(textAnswer.getText() + a);}}//如果当前字符串第一个字符不是符号,则添加一个符号在首字母处elsetextAnswer.setText('-' + s);}}//计算器有关内存操作//'MC'的操作,将内存清0if (temp == buttonMC && clickable == true) {memoryd = memoryi = 0;textMemory.setText("");}//'MS'的操作,将当前文本框内容保存入内存,显示'M'if (temp == buttonMS && clickable == true) {boolean isDot = false;textMemory.setText(" M");for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}//如果是double,则存入memoryd(double存储器)if (isDot == true) {memoryd = Double.parseDouble(textAnswer.getText());memoryi = 0; //保证存储器中存放最新的值}//如果是int,则存入memoryi(int存储器)else {memoryi = Integer.parseInt(textAnswer.getText());memoryd = 0; //保证存储器中存放最新的值}}//'MR'的操作,将存储器中的信息输出if (temp == buttonMR && clickable == true) {if (memoryd != 0)textAnswer.setText(Double.toString(memoryd));if (memoryi != 0)textAnswer.setText(Integer.toString(memoryi));}//'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器if (temp == buttonMAdd && clickable == true) {boolean isDot = false;for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}if (memoryi != 0) { //存储中是一个int型数if (isDot == false) //被加数是一个int型数memoryi += Integer.parseInt(textAnswer.getText());else { //被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int 存储器清零memoryd = memoryi + Double.parseDouble(textAnswer.getText());memoryi = 0;}}elsememoryd += Double.parseDouble(textAnswer.getText());}//按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除if (temp == buttonBk && clickable == true) {String s = textAnswer.getText();textAnswer.setText("");for (int i = 0; i < s.length() - 1; i++) {char a = s.charAt(i);textAnswer.setText(textAnswer.getText() + a);}}//按下'CE'按钮,将当前文本框内数据清除if (temp == buttonCe) {textAnswer.setText("");clickable = true;}//按下'C'按钮,文本框内数据清除,同时var,answer清0if (temp == buttonC) {vard = answerd = 0;textAnswer.setText("");clickable = true;}//按下'复制'菜单栏if (temp == copyItem) {copy = textAnswer.getText();}//按下'粘贴'菜单栏if (temp == pasteItem) {textAnswer.setText(copy);}if (temp == sItem) {JOptionPane.showMessageDialog(panel, "当前是标准型计算器,\n科学型计算器有待更新。