Java实现简易计算器

1建立窗口

  • 观察计算机的窗口,随后进行建议设置
  • 先设置出一个大的窗口
  • 分割成两大块,一块为文本框、一块为按钮
  • 将按纽通过网格进行4*4的实现,其中通过将按钮文字存在数组中解决不一样按钮文字的展示
   void run() {
        JFrame frame = new JFrame("calcultor");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //在窗口显示之前,将文本框,按钮创建出来
        tf = new JTextField();
        //设定大小
        tf.setPreferredSize(new Dimension(400, 60));
        bt = new JButton();
        //添加到窗口中
        frame.getContentPane().add(tf, BorderLayout.NORTH);
        frame.getContentPane().add(bt, BorderLayout.CENTER);
        //内容面板,帮助组合布局
        JPanel p = new JPanel();
        //变成网格布局
        p.setLayout(new GridLayout(4, 4));
        //添加16个按钮
        for (int i = 0; i < 16; i++) {
            JButton bt = new JButton(BtText[i]);
            p.add(bt);
            //点击按钮进行事件响应
            bt.addActionListener(this);
        }
        frame.getContentPane().add(p, BorderLayout.CENTER);


        frame.setSize(300, 400);
//        方法的意思是说数据模型已经构造好了,
//        允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上了,
//        并不是显示图形,而是可以运行开始画图了。
//        这个方法和java多线程的start方法有点异曲同工之妙,
//        start方式是允许run方法运行了,start方法和setVisible方法很相似
        frame.setVisible(true);

    }

2实现ActionListener——监听事件

  • 实现ActionListener后,会自动重写actionPerformed方法,在其中,进行整个逻辑的实现。
  • 先通过if-else将按钮文字进行分类:数字类、操作符类(operator)以及小数点
  • 数字类:注意是第一个数字还是操作符后的第二个数字。通过operator的初始值判断后将数字放入相应的位置
  • 操作符类:通过switch进行相应的操作,注意使用BigDecimal避免精度丢失
  • 小数点:通过判断是否为第一个数字(只能输入一个小数点还未解决,随后跟进)
  • public void actionPerformed(ActionEvent e) {
            //处理按钮的点击事件
            //默认标签上的文字
            String action = e.getActionCommand();
            char act = action.charAt(0);
            if (act >= '0' && act <= '9') {
                //确保不是只能输入一个数字
                //使用感叹号表示其还没有填入运算符,来判断是否放置在数字b中
                if (operator == '!') {
                    //保证不输入0000111这类型数字
    //                if (act == '0') {
    //                    if (strA.length() > 0) {
    //                        strA += action;
    //                        //放置在文本框中
    //                        tf.setText(strA);
    //                    }
    //                } else {
                    strA += action;
                    //放置在文本框中
                    tf.setText(strA);
    
    //                }
                } else {
                    strB += action;
                    //放置在文本框中
                    tf.setText(strB);
    
                }
            } else if (act == '+' || act == '-' || act == '*' || act == '/') {
                tf.setText(String.valueOf(act));
                operator = act;
            } else if (act == '=') {
                //解决丢失精度问题
    //            加法 add()函数     减法subtract()函数
    //            乘法multiply()函数    除法divide()函数    绝对值abs()函数
                BigDecimal a = new BigDecimal(Double.parseDouble(strA));
    //            Double a = Double.parseDouble(strA);
                BigDecimal b = new BigDecimal(Double.parseDouble(strB));
    //            Double b = Double.parseDouble(strB);
    
                double res;
                switch (operator) {
                    case '+':
                        res = a.add(b).doubleValue();
                        //整形+""转换成字符串
                        tf.setText(res + "");
                        break;
                    case '-':
                        res = a.subtract(b).doubleValue();
                        //整形+""转换成字符串
                        tf.setText(res + "");
                        break;
                    case '*':
                        res = a.multiply(b).doubleValue();
                        //整形+""转换成字符串
                        tf.setText(res + "");
                        break;
                    case '/':
                        //在进行divide操作的时候,scale表示保留几位小数,第三个参数表示四舍五入操作
                        res = a.divide(b, 10, BigDecimal.ROUND_HALF_DOWN).doubleValue();
                        //整形+""转换成字符串
                        tf.setText(res + "");
                        break;
                }
                //把操作的制空,保证下一次操作的正常进行
                operator = '!';
                strA = "";
                strB = "";
    
    
            } else if (act == '.') {
    
                if (operator == '!' && strA != "") {
                    if (flag = true) {
                        strA += action;
                        tf.setText(strA);
                        flag = false;
                    }
                }
                if (strB != "") {
                    if (flag2 == true) {
                        strB += action;
                        flag2 = false;
                    }
                }
            }
        }

     

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值