Java语言GUI实现计算器以及源代码
一、 设计分析
1.1任务及其目的
设计一个计算器应用程序,完成复杂的科学运算。设计的计算器应用程序可以完成加法、减法、乘法、除法和科学函数运算。且有小数点、正负号、求倒数、退格和清零等功能。用鼠标点击相应的数字键和运算符号键,然后点击=按钮。窗口上方的文本框将会显示计算出来的结果,如果未显示说明输入的表达式有误。要将文本框清零,科单击清零按钮。
1.2设计思路
实现主要分为两部分:
- 编写能实现简单四则运算的类(BaseCalcucator.class)
将传入的中缀表达式转化为逆波兰表达式,在进行计算。 - 编写进行科学计算的类(SceneCalculator.class)
将传入的式子进行相应的科学计算,并用计算出来的结果进行替代掉进行科学计算的式子。
二,程序结构
1、程序流程如下图
图2.1程序流程图
2、程序界面
图2.2程序界面图
控件
1.文本框TextArea:text用于显示当前计算的式子,recordArea用于显示过去计算的式子,mermoryArea用于显示计算器“寄存器”中的值。
2.功能Button:record和mermor用于在历史记录和“寄存器”之间进行切换。
3.数字Button:0-9.小数点
4.运算符Button:+ - * / ( ) =
5.计算器基本Button:←用于退格,c用于清空mathNow、recordArea、mermoryArea
6.科学运算符Button::(15个)
sin,cos,tan,ln,log,e,π,1/x, x2,x3, , x!,√, ,|x|,
7.切换Button:Deg代表角度制,Rad代表弧度制。通过点击Deg实现角度制与弧度制之间的切换
成员变量
1.private String mathPast=” ”,用于存储上次运算的式子
2.private String mathNow =” ”,用于存储现在运算的式子
3.private String showNow=” ”,用于存储显示在文本框的式子
4.private String m;用于存储使用计算器寄存器的数
5.private String restult=””;用于计算出来的结果
6.pivate String temp=””,用于暂时存储的数字
7.private int TrigCalculMethod=0;(默认设置为0,进行角度制运算)
TrigCalculMethod=0,进行角度制运算,TrigCalculMethod=1,进行弧度制运算
8.private int equal_flag=0;进行等号按钮的标记(及刚刚是否进行了一次运算)
equal_flag=0,及刚刚没有进行运算,equal_flag=1,代表刚刚进行了一次运算
三、 各模块的功能及程序说明
3.1 Calcuator主类模块
3.1.1 初始化特殊函数按钮
由于JButton 按钮上无法显示出x2,x3, , ,所以图片粘贴的办法,将相应的函数图片粘贴到按钮的表面。,
//创建x的平方,x的三次方,x的y次方,x开y次方按钮
ImageIcon squareimg = new ImageIcon("src\\Calcuator\\x的平方.png");// 创建图片对象
ImageIcon cubeimg = new ImageIcon("src\\Calcuator\\x的三次方.png");// 创建图片对象
ImageIcon powerimg = new ImageIcon("src\\Calcuator\\x的y次方.png");// 创建图片对象
ImageIcon readicationimg = new ImageIcon("src\\Calcuator\\x开y次方.png");// 创建图片对象
Image squareimage = squareimg.getImage();
Image cubeimage = cubeimg.getImage();
Image powerimage = powerimg.getImage();
Image readicationimage = readicationimg.getImage();
//为把它缩小点,先要取出这个Icon的image ,然后缩放到合适的大小
Image squaresmallImage = squareimage.getScaledInstance(25,25,Image.SCALE_FAST);
Image cubesmallImage = cubeimage.getScaledInstance(25,25,Image.SCALE_FAST);
Image powersmallImage = powerimage.getScaledInstance(25,25,Image.SCALE_FAST);
Image readictionsmallImage = readicationimage.getScaledInstance(30,30,Image.SCALE_FAST);
//再由修改后的Image来生成合适的Icon;
//***Image对象创建ImageIcon对象,可查阅ImageIcon的构造方法***
ImageIcon smallIcon = new ImageIcon(squaresmallImage);
ImageIcon cmallIcon = new ImageIcon(cubesmallImage);
ImageIcon pmallIcon = new ImageIcon(powersmallImage);
ImageIcon rmallIcon = new ImageIcon(readictionsmallImage);
JButton squarebuttion=new JButton(smallIcon);
JButton cubebuttion=new JButton(cmallIcon);
JButton powerbuttion=new JButton(pmallIcon);
JButton readictionbuttion=new JButton(rmallIcon);
图3.1.1 特殊函数按钮初始化代码图
3.1.2 初始化计算器的界面
使用构造法,进行计算器开始界面的设计。
public Calcuator (){
super("计算器");
this.setBounds(400, 250, 900, 680);
//设置窗体图片
// this.setIconImage(walkpaperimage);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体的布局形式
GridBagLayout gr=new GridBagLayout();
GridBagConstraints gc=new GridBagConstraints();
//设置窗体布局
this.setLayout(gr);
//创建模板
JPanel jp1 = createPanel1();
JPanel jp2 = createPanel2();
//对整个窗体进行网格包布局 jp1,jp4
gc.weightx=90;gc.weighty=68;gc.fill=GridBagConstraints.BOTH;
gc.gridwidth=7;gc.gridheight=10;
gc.gridx=0;gc.gridy=0;
gr.setConstraints(jp1,gc);
this.add(jp1);
gc.gridwidth=3;gc.gridheight=10;
gc.gridx=7;gc.gridy=0;
gr.setConstraints(jp2,gc);
this.add(jp2);
this.setVisible(true);
}
图3.1.2构造计算器开始界面
设计思路:
1、 将计算器开始窗口划分为两个左右大面板。左边的面板放置用于显示的文本域和按钮,右边的面板用于放置历史记录按钮和内存按钮及其对应的文本域.。然后采用网格包布局管理器,进行分配比例和布局。
2、 (方法createPanel1())在左边的大面板中再创建两个面板。将文本域放置在一个面板,按钮也放置在单独的一个面板。然后采用边界布局,将文本域所在的面板放置大面板的North,按钮所在的面板放置在Center。在按钮所在的面板中采用网格布局放置每一个按钮,然后实例化监听类(ButtonAction)的对象(ba),并在每一个按钮上添加监听对象(ba)。
3、 (方法 createPanel2())在右边的大面板中同样创建两个面板。一个放置历史记录按钮和内存按钮,一个放置对应的文本域。也是采用边界布局,将按钮所在的面板置于North,将文本域的面板置于Center。放置文本域的面板再采用卡片布局,放置不同按钮对应的文本域。
3.1.3 监听类(ButtonAction)的设置
用Plantuml绘制监听类的原理如下:
代码与原理图有所出入,不过大致原理是一样的。
3.1.3 监听类原理图
设计思路
1、 将计算器所有按钮(除去Degr、历史记录、内存)的监听编写在一个类中。
2、 把计算器的按钮分为四个类型:常量型、运算符、函数型、功能。并设计对应的四个模块。点击按钮则运行对应模块。
3.2 ScienCalcuator类
把要进行计算的表达式转入到ScienCalcuator类,进行科学运算,并计算出来的结果替代相应的字符。最后得到没有科学运算符的字符串,再将其传入BaseCalcuator中。
3.2.1 对计算式进行预处理
去掉 math 中的空格,替换 π,替换自然指数 e
3.2.1 计算式的预处理
3.2.2 pow运算(”^”)
获取^左右两边的参数进行Math.pow计算,如果参数是表达式,需要调用fScienCalcuator方法,然后用结算结果替换科学运算式部分。
大致原理如下图:
String fPower(String con_str) {
while (con_str.contains("^")) {
//1.中间寻找的点
int midIndex = con_str.lastIndexOf("^");
//2.获取左边参数
dou