Java 设计极简计算器

Java 简易计算器

最近Java作业是设计一个简易计算器 要求是利用frame和panel设计计算器同时实现其基本的加减乘除清零等功能

代码主要分成三块

  1. 构造函数 主要用于生成按钮等组件以及排版
  2. 事件处理 不同的按钮有不同的作用
  3. 计算结果 编写一个函数 对输入的算式进行计算并返回结果

先附上最后的成果图
简易计算器示意图
先对各段进行说明 代码在最后统一给出

1.构造函数

这块主要是对按钮各组件进行排版,用了一个Frame嵌套2个Panel的结构。
第一个Panel是一个文本显示区域,就是图中那一条白框,初始值为0。然后这里是用了TextArea,本来是打算用TextField的,但是TextField不能调节高度,总是显得很扁。于是就用了TextArea,然后把水平和竖直方向的滚动条都去了,就是图中的样子了(去掉滚动条之后就是一个可以调节长宽的TextField啊…)。
第二个Panel是按钮区,包含了0-9、+、-、x、/、.、CE、backspace、=一共18个按钮。

2.事件处理

这部分就是对于不同按钮有不同的反应。如果按的是CE,就清空文本区里的文本;如果按的的是backspace,就删去最后一个字符;如果按的是等于,就把已经输入的字符串(就是那一串数字加运算符)input作为参数,带入第三部分的计算结果的函数里计算结果并返回,同时输出结果;如果按的是数字或者运算符,就直接记录在input里就好了;然后这边因为String类型的变量不方便直接改,所以我就转换成了StringBuffer类型进行处理,不过上网搜的时候好像更推荐用StringBuilder类…不是很清楚。

3.计算结果

这一部分主要是对输入进来的input进行处理。首先找到运算符的下标,然后根据这个下表把字符串划分成三段:第一个数字、运算符、第二个数字;然后再把数字转换成浮点型进行运算最后转换回字符串型返回即可。
这里说一下indexOf这个函数,这里因为是寻找运算符的下标,如果没出现这个运算符就返回-1,如果出现了就返回下标。所以四个运算符的结果加起来再加上3就是出现的运算符的下标。


代码
/* 简易计算器 注意事项
 * 一次只能对 一个 运算符进行操作 别多写了 计算不出来的
 * CE清空 backspace回删
 * 没有异常处理 还有各种可能出现的异常都没判断
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.border.Border;

public class Calculator extends Frame implements ActionListener, WindowListener
{
    //主函数
    public static void main(String[] args) 
    {
        Calculator cal = new Calculator();
    }
    
    //全局变量设置
    Frame fr;
    Button []but;
    TextArea ta;
    String name[] = {"7","8","9","x","/","CE","4","5","6","+","-","backspace","1","2","3",".","0","="};
    StringBuffer input = new StringBuffer();
    int num1 ,num2 ,res = 0;
    
    //构造函数 用于生成按钮以及排版 文本区的大小以及frame的大小不要随便改
    public Calculator()
    {
        fr = new Frame("简易计算器");        

        Panel panela = new Panel();//文本框
        ta = new TextArea("0",5,90,3);//5表示宽度 90表示长度 3表示滚动条类型 都隐藏
        panela.add(ta,new BorderLayout().CENTER);
        fr.add(panela,BorderLayout.NORTH);
        
        Panel panelb = new Panel();//按钮 1 2 3 4 5 6 7 8 9 + - x / CE backspace...3x6gridlayout
        panelb.setLayout(new GridLayout(3,6));
        but = new Button[name.length];
        for(int i = 0;i < name.length;i++)
        {
            but[i] = new Button(name[i]);
            but[i].addActionListener(this);
            panelb.add(but[i]);
        }
        fr.add(panelb,BorderLayout.CENTER);
        
        fr.pack();
        fr.show();
        fr.setSize(700,400);
        fr.addWindowListener(this);
    }
    
    //响应事件  
    public void actionPerformed(ActionEvent e) {
        String temp;
        if(e.getSource() == but[5])//若按了CE
        {
            input = new StringBuffer("");
            ta.setText(" ");
        }
        else if(e.getSource() == but[11])//若按了backspace
        {
            input.delete(input.length()-1,input.length());
            temp = input.toString();
            ta.setText(temp);
        }
        else if(e.getSource() == but[17])//若按了=
        {
            temp = input.toString();
            temp = calculate(temp);
            temp = input+"="+temp;
            ta.setText(temp);
            input = new StringBuffer("");
        }
        else//若按了数字以及加减乘除
        {
            input.append(e.getActionCommand());
            temp = input.toString();
            ta.setText(temp);
        }
    }    

    //计算结果函数
    String calculate(String str)
    {
        int plus = str.indexOf("+");
        int minus = str.indexOf("-");
        int mutiple = str.indexOf("x");
        int divide = str.indexOf("/");
        int ind = plus+minus+mutiple+divide+3;
        String s1 = str.substring(0,ind);
        String s2 = str.substring(ind+1,str.length());
        float num1 = Float.parseFloat(s1);
        float num2 = Float.parseFloat(s2);
        float res = 0;
        if(ind == plus)
            res = (num1+num2);
        else if(ind == minus)
            res = (num1-num2);
        else if(ind == mutiple)
            res = (num1*num2);
        else 
            res = num1/num2;
        String s = res + "";
        return s;
    }
    
    public void windowActivated(WindowEvent e) {}
    public void windowClosed(WindowEvent e) {}
    public void windowClosing(WindowEvent e) 
    {
        System.exit(0);
    }
    public void windowDeactivated(WindowEvent e) {}
    public void windowDeiconified(WindowEvent e) {}
    public void windowIconified(WindowEvent e) {}
    public void windowOpened(WindowEvent e) {}
}

不过,这个计算器一次只能进行一次运算,就是说一次只能输入一个运算符,所以叫“简易”计算器…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值