制作 JAVA 简易计算器

用JAVA做个简易的计算器,入门水平就好,不要太复杂
实现功能:加减乘除,清除键,部分清除键,开平方,小数点,等号,百分比

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Calculation extends JFrame implements ActionListener{
    private JTextField txfResult;//显示操作结果的文本框
    JTextField txfM;//显示记忆的索引值的文本框
    Double dM=0d;//存储数据

    public Calculation() {
        super("swing 计算器实例");
        /*设置用于显示的文本框*/
        txfResult =new JTextField("0",30);//初始文本显示0  最大列数30
        txfResult.setBackground(Color.WHITE);
        txfResult.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示
        txfResult.setEditable(false);//文本框不可编辑  即为readOnly只读属性
        JPanel ResultTextPanel=new JPanel();//放操作结果文本框的面板
        ResultTextPanel.add(txfResult);
        /*设置用于控制数字的键与显示记忆索引值的文本框*/
        txfM=new JTextField(2);//最长2列
        JButton b1=new JButton("Backspace");//退格键
        JButton b2=new JButton("CE");//重置键
        JButton b3=new JButton("C");//清0键
        JPanel ControlPanel=new JPanel();
        ControlPanel.setLayout(new GridLayout(1, 4, 2, 2));//1行4列  水平间距2 垂直间距2
        ControlPanel.add(txfM);
        ControlPanel.add(b1);
        ControlPanel.add(b2);
        ControlPanel.add(b3);
        b1.addActionListener(this);
        b2.addActionListener(this);
        b3.addActionListener(this);
        /*数字和运算符键*/
        String dcKey[]= {"MC","7","8","9","/","sqrt","MR","4","5","6","*","%","MS","1","2","3","-","1/x"
                ,"M+","0","+/-",".","+","="};
        JPanel dcKeyPanel =new JPanel();//数字和运算符的面板
        dcKeyPanel.setLayout(new GridLayout(4, 6,2,2));
        //一个 循环放好所有数字和运算符组件
        for(int i=0;i<24;i++) {
            JButton b=new JButton(dcKey[i]);
            dcKeyPanel.add(b);
            b.addActionListener(this);
        }
        Container ct=this.getContentPane();//窗体内容面板对象
        ct.setLayout(new BorderLayout());
        ct.add(ResultTextPanel,BorderLayout.NORTH);
        ct.add(ControlPanel,BorderLayout.CENTER);
        ct.add(dcKeyPanel,BorderLayout.SOUTH);
        pack();
        setVisible(true);
        setResizable(false);//禁止最大化
        setLocationRelativeTo(null);//居中显示
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
    }

    public static void main(String[] args) {
        new Calculation();
    }

    //////////////////////////////////////////////////////数字键和功能键的实现/////////////////////////////////////////////////////////   
    private boolean newDigital=true;//类内全局boolean变量 用于表示是否是输入数的标志

    private String operation="";//表示运算符的字符串
    private double d1;//二元运算前操数
    private double d2;//二元运算后操作数
    private int optionValue;//区别加减乘除运算符的变量
    /*监听方法*/
    @Override
    public void actionPerformed(ActionEvent e) {
        String s=(e.getActionCommand());//返回与此动作相关的命令字符串  就是button上显示的字
        String str=txfResult.getText();
        /*后退键*/
        if(s.equals("Backspace")) {
            if(str.equals("0")||str.equals("")) {//已经是清0状态下 不可再清0了
                return;
            }
            String s1=txfResult.getText();
            txfResult.setText(s1.substring(0, s1.length()-1));//截掉最后一个数字
        }
        /*重置键*/
        if(s.equals("CE")) {
            txfResult.setText("0");
            newDigital=true;//是否是新输入的数的标志设置为true
        }
        /*清0键*/
        if(s.equals("C")) {
            txfResult.setText("0");
            optionValue=0;//表示运算符的变量设置为0
            newDigital=true;//表示是否新输入的数的标志设置为true
        }
        /*数字键*/
        if(s.length()==1&&s.charAt(0)>='0'&&s.charAt(0)<='9') {
            if(!newDigital) {
                txfResult.setText(str+s);//不是新输入的数
            }else {
                txfResult.setText(s);
                newDigital=false;//表示是否新输入的数的标志设置为false
            }
            return;
        }

        /*小数点*/
        if(s.equals(".")) {
            if(txfResult.getText().indexOf(".")==-1) {//若之前尚不存在小数点
                /*判断数字是否0打头*/
                if(txfResult.getText().trim().startsWith("0")) {//强大的API
                    txfResult.setText("0.");
                    newDigital=false;
                }else {
                    txfResult.setText(str+".");//str事件刚开始就得到的txfResult.getText()
                }
            }
            return;
        }
        /* 表示数字正负符号+/- */
        if(s.equals("+/-")) {
            double d=Double.parseDouble(str.trim());//获取输入的数字
            txfResult.setText(String.valueOf(-d));//取得获取输入数字的相反数
            return;
        }

        //////////////////////////////////////////////////////加减乘除运算的实现/////////////////////////////////////////////////////////  
        if(s.equals("+")) {
            d1=Double.parseDouble(txfResult.getText());//立刻获取前操作数的值
            txfResult.setText("");
            optionValue=1;//设置运算符标志
        }
        if(s.equals("-")) {
            d1=Double.parseDouble(txfResult.getText());
            optionValue=2;
        }
        if(s.equals("*")) {
            d1=Double.parseDouble(txfResult.getText());
            optionValue=3;
        }
        if(s.equals("/")) {
            d1=Double.parseDouble(txfResult.getText());
            optionValue=4;
        }
        if(s.equals("=")) {
            d2=Double.parseDouble(txfResult.getText());//获取后操作数的值
            /*根据运算符标志的不同值确定计算结果*/
            switch(optionValue) {
            case 1:
                txfResult.setText(String.valueOf(d1+d2));
                break;
            case 2:
                txfResult.setText(String.valueOf(d1-d2));
                break;
            case 3:
                txfResult.setText(String.valueOf(d1*d2));
                break;
            case 4:
                if(d2!=0) {
                    txfResult.setText(String.valueOf(d1/d2));
                }else {
                    txfResult.setText("除数不能为0");
                    return;
                }
                break;              
            }
            operation="";//运算结束 清空运算符
        }       


        ////////////////////////////////求平方根 倒数 百分比运算/////////////////////////////////
        if(s.equals("sqrt")) {
            double d=Double.parseDouble(txfResult.getText().trim());//获取操作数的值
            if(d>0) {
                txfResult.setText(String.valueOf(Math.sqrt(d)));//计算该值的平方根
            }else {
                txfResult.setText("负数不能计算平方根");
            }
        }else if(s.equals("1/x")) {
            double d=Double.parseDouble(txfResult.getText().trim());//计算倒数
            if(str.equals("0")) {
                txfResult.setText("除数不能为0");
            }else {
                txfResult.setText(String.valueOf(1/d));
            }           
        }else if(s.equals("%")) {
            txfResult.setText((String.valueOf(Double.parseDouble(str)/100)));
        }

        ///////////////////////////////////////////实现数据的记忆功能///////////////////////////////////
        if(s.equals("MC")) {//清空存储数据
            txfResult.setText("");
            dM=0d;
            newDigital=true;
        }
        if(s.equals("MR")) {
            if(txfM.getText().trim()!="") {
                txfResult.setText(""+dM);//显示存储数字当前值
            }
        }
        if(s.equals("MS")) {
            dM=Double.parseDouble(txfResult.getText().trim());
                txfM.setText("M");//存储区显示M
        }
        if(s.equals("M+")) {
            dM=dM+Double.parseDouble(txfResult.getText().trim());//将显示的数字与已经存储的数据相加 即更新存储数据
        }       
    }
}

https://blog.csdn.net/hza419763578/article/details/80683573