Java简易计算器

 

实现简易计算器,多则运算,记忆存储等记忆操作,Java期末大作业参考 

Calculator类

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Calculator extends JFrame implements ActionListener, KeyListener {
    /*——————————————————————————北面的控件—————————————————————————*/
    private JPanel jp_north=new JPanel();//添加一个面板
    private JTextField input_text=new JTextField();//添加一个文本框


    /*——————————————————————————中间的控件—————————————————————————*/
    private JPanel jp_center=new JPanel();//添加一个面板
    private JButton[] btn=new JButton[24];//定义一个6行4列的按钮数组(全局变量方便调用)

    private String shizi="";//用于保存存储计算公式,

    private boolean dygfs=false;//判断第一个运算数是否为负数

    private Double Memorizing_numbers=null;//用于保存记忆存储的数值,全局变量。
    public Calculator() throws HeadlessException {
        this.init();//初始化窗体函数调用
        this.addNorthComponent();//北部面板设置函数调用
        this.addCenterButton();//中间按钮面板设置函数的调用
    }

    public void init(){//窗体初始化方法
        String imgpath="image/bt.png";//图标路径
        try {
            Image img= ImageIO.read(this.getClass().getResource(imgpath));//通过Image类获取该图片
            this.setIconImage(img);//设置图标
        } catch (IOException e) {
            e.printStackTrace();
        }

        this.setTitle(Const.TITLE);//设置窗体边框标题
        this.setSize(Const.FRAME_W,Const.FRAME_H);//窗体宽高设置
        this.setLayout(new BorderLayout());//设置布局为边框布局,边框布局分东南西北中5个方位来添加控件
        this.setResizable(false);//窗体大小固定不可改变
        this.setLocation(Const.FRAME_x,Const.FRAME_y);//窗体位置(屏幕居中)
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭按钮关闭后退出程序
        this.input_text.setHorizontalAlignment(JTextField.RIGHT);//文本框文字水平右对齐
    }


    public void addNorthComponent(){//添加北面控件部分
        Font f=new Font("黑体",Font.BOLD,25);
        this.input_text.setPreferredSize(new Dimension(380,50));//设置文本框宽高比
        this.input_text.setFont(f);
        jp_north.add(input_text);//北部面板中加入文本框
        this.add(jp_north,BorderLayout.NORTH);//窗体中在北部方位加入北部面板
    }


    public void addCenterButton(){//添加中间按钮部分
        this.jp_center.setLayout(new GridLayout(6,4));//6行4列的网格布局
        String []anwz= {
                "MR","M+","M-","MS",
                "MC","CE","C","←",
                "7","8","9","*",
                "4","5","6","-",
                "1","2","3","+",
                "/","0",".","="
        };//按钮文字数组

        for (int i=0;i<24;i++){//初始化计算器键盘
            btn[i]=new JButton(anwz[i]);
            Font f=new Font("黑体",Font.BOLD,25);
            btn[i].setFont(f);
            if (i==0||i==4)
                btn[i].setEnabled(false);//MR和MC按钮一开始禁用
            switch (i){//记忆操作按钮的提示文字
                case 0:btn[i].setToolTipText("记忆读取");
                case 1:btn[i].setToolTipText("记忆加法");
                case 2:btn[i].setToolTipText("记忆减法");
                case 3:btn[i].setToolTipText("记忆存储");
                case 4:btn[i].setToolTipText("记忆清除");
            }

            btn[i].addActionListener(this);
            jp_center.add(btn[i]);//在面板中加入第i个按钮
        }
        this.add(jp_center,BorderLayout.CENTER);//将中部面板加入到窗体中,位置在中部方位
    }

    public static void main(String[] args) {
        Calculator calculator=new Calculator();//定义一个窗体类
        calculator.setVisible(true);//显示这个窗体对象
    }

//    private String FirstInput=null;//第一次输入的值
//
//    private String operator=null;//运算操作符

    @Override
    public void actionPerformed(ActionEvent e) {//处理点击事件
        String click_str=e.getActionCommand();//返回被点击的按钮的值,



        if (".0123456789".indexOf(click_str)!=-1){//获取的是非操作符而是操作数
            this.input_text.setText(input_text.getText()+click_str);//按钮数字显示在文本框内
            this.input_text.setHorizontalAlignment(JTextField.RIGHT);//文本框文字水平右对齐
        }else if(click_str.matches("[\\+\\-*/]{1}")){//摁到操作符按钮时
            shizi+=this.input_text.getText().toString();
            shizi+=click_str.toString();

            this.input_text.setText("");//文本框清空
        } else if (click_str.equals("MR")) {//记忆读取按钮事件功能
            input_text.setText(Memorizing_numbers.toString());
        } else if (click_str.equals("MC")) {//记忆清除按钮的功能
            Memorizing_numbers=null;
            btn[0].setEnabled(false);
            btn[4].setEnabled(false);
        } else if (click_str.equals("MS")) {//监听到点击记忆存储的按钮
            btn[0].setEnabled(true);
            btn[4].setEnabled(true);
            Memorizing_numbers=Double.valueOf(input_text.getText());//获取文本框内当前的值,并将它记忆存储
        } else if (click_str.equals("M+")) {//点击记忆加法事件的实现
            Memorizing_numbers+=Double.valueOf(input_text.getText());//完成记忆加法操作
        } else if (click_str.equals("M-")) {
            Memorizing_numbers-=Double.valueOf(input_text.getText());//完成记忆减法操作
        } else if (click_str.equals("←")) {//退格键点击事件
            String chuli=input_text.getText();
            if (input_text.getText().length()!=0){
                chuli=chuli.substring(0,chuli.length()-1);
                input_text.setText(chuli);
            }

        } else if (click_str.equals("=")) {
            shizi+=this.input_text.getText().toString();
            if(shizi.charAt(0)=='-'){
                shizi=shizi.substring(1);
                dygfs=true;
            }
            //数字切割器
            StringTokenizer numSt=new StringTokenizer(shizi, "0123456789.");
            //存放所有运算符
            List<String> opers=new ArrayList<>();
            while(numSt.hasMoreTokens()){
                opers.add(numSt.nextToken());
            }
            //运算符切割器
            StringTokenizer  operSt=new StringTokenizer(shizi, "+-*/");
            //存放所有运算数
            List<Double> numbers=new ArrayList<>();
            while(operSt.hasMoreTokens()){
                numbers.add(Double.parseDouble(operSt.nextToken()));
            }
            if(dygfs){
                numbers.add(0,numbers.remove(0)*-1);
            }
            for (int i = 0; i < opers.size(); i++) {
                if(opers.get(i).equals("*")){
                    double  result=numbers.remove(i)*numbers.remove(i);
                    numbers.add(i, result);
                    opers.remove(i);
                    i--;
                }
                else if(opers.get(i).equals("/")){
                    double  result=numbers.remove(i)/numbers.remove(i);
                    numbers.add(i, result);
                    opers.remove(i);
                    i--;
                }
            }
            for (int i = 0; i < opers.size(); i++) {
                if (opers.get(i).equals("+")) {
                    double result = numbers.remove(i) + numbers.remove(i);
                    numbers.add(i, result);
                    opers.remove(i);
                    i--;
                } else if (opers.get(i).equals("-")) {
                    double result = numbers.remove(i) - numbers.remove(i);
                    numbers.add(i, result);
                    opers.remove(i);
                    i--;
                }
            }
            this.input_text.setText(numbers.get(0).toString());
            shizi="";
            dygfs=false;
        }else if (click_str.equals("C")) {
            shizi="";
            dygfs=false;
            this.input_text.setText("");
        } else if (click_str.equals("CE")) {
            if (input_text!=null){
                input_text.setText("");
            }
        }
    input_text.requestFocusInWindow();//文本框获得焦点、光标
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
      char c=e.getKeyChar();
        String key_str=String.valueOf(c);
        if (".0123456789".indexOf(key_str)!=-1){//获取的是非操作符而是操作数
            this.input_text.setText(input_text.getText()+key_str);//按钮数字显示在文本框内
            this.input_text.setHorizontalAlignment(JTextField.RIGHT);//文本框文字水平右对齐
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

Const类

import java.awt.*;

public class Const {//常量类
    public static final int FRAME_W=400;//窗体的宽高设置
    public static final int FRAME_H=600;
    public static final int SCREEN_W= Toolkit.getDefaultToolkit().getScreenSize().width;//获得屏幕的宽度
    public static final int SCREEN_H=Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕的高度
    public static final int FRAME_x=(SCREEN_W-FRAME_W)/2;//窗体中心点定位的x轴与y轴位置;
    public static final int FRAME_y=(SCREEN_H-FRAME_H)/2;
    public static final String TITLE="计算器";


}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值