A1397742680 2020-05-21 19:39 采纳率: 100%
浏览 607
已采纳

制作 JAVA 简易计算器

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

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-05-21 20:54
    关注
    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料