学Java累计15天,跟着老师的视频自己做了一个简易的计算器。

记录一下学习和制作的过程。

第一:制作界面

使用netbeans的图形界面设计,创建一个jFrame类,就可以进行组件的摆放,属性的设置等等的操作。

java制作一个计算机 java做一个简易的计算机_java

组件组成:按钮和标签。

按钮就是0,1,2,+,开始等的操作。标签作为显示屏。

第二:编写功能

使用字符串来接收每一次的点击。一个字符串 s 保存所有符合的点击内容,并且在标签上显示,另一个 l 保存运算符号之后的内容,用来转换为第二个运算数。

数字按钮的功能。

当点击数字按钮时,要看目前标签上的内容

标签内容只有0或者与上次计算结果相同时,点击的数字按钮相应的数字应该代替标签原有的内容。

private void jButton30ActionPerformed(java.awt.event.ActionEvent evt) {

        // TODO add your handling code here:

        String s;

        JButton j1 = (JButton) evt.getSource();

        if (jLabel1.getText().equals(num3 + " ")) {

            jLabel1.setText("0");

        }

        if (isOp(jLabel1.getText())) {

            l = l + j1.getText();

        }

        if (jLabel1.getText().equals("0")) {

            s = j1.getText();

        } else {

            s = jLabel1.getText() + j1.getText();

        }

        jLabel1.setText(s);

    }
小数点的功能。

一个数不可能出现两个小数点,所以要判断点击小数点之前是否有小数点。因为点击按钮之后的内容是以字符串的形式连接,而且前后两个数值分别可以有一个小数点,那么就要以运算符为分界,分别判断是运算符前有小数点还是运算符后有。如果有运算符,就只用判断运算符后是否已经出现小数点,即 l 中是否有小数点,没有就判断 s 。

private void jButton31ActionPerformed(java.awt.event.ActionEvent evt) {

        // TODO add your handling code here:

        String s;

        s = jLabel1.getText();

        if (isOp(jLabel1.getText())) {

            if (l.indexOf('.') >= 0) {

                s = jLabel1.getText();

            } else {

                s = jLabel1.getText() + ".";

                l=l+".";

            }

            jLabel1.setText(s);

        } else {

            if (s.indexOf('.') >= 0) {

                s = jLabel1.getText();

            } else {

                s = jLabel1.getText() + ".";

            }

            jLabel1.setText(s);

        }

    }
运算符的功能。

一按运算符,前面的即标签里的内容就要转换为一个数字保存起来了,这样按等号的时候就方便运算了。并且用char类型op保存运算符的符号。

private void jButton33ActionPerformed(java.awt.event.ActionEvent evt) {

        // TODO add your handling code here:

        JButton j1 = (JButton) evt.getSource();

        num1 = Double.parseDouble(jLabel1.getText());

        op = j1.getText().charAt(0);

        jLabel1.setText(jLabel1.getText() + op);

    }
等于号的功能。

按等于号就意味着要开始运算了。可是要先从标签的内容中获取第二个运算数,别急,我们已经用 l 保存了第二个运算数的字符串类型了,转换为double类型即可。

然后用switch多分支选择结构,来确定做哪种运算。

private void jButton32ActionPerformed(java.awt.event.ActionEvent evt) {

        // TODO add your handling code here:

        num2=Double.parseDouble(l);

        BigDecimal b1=new BigDecimal(Double.toString(num1));

        BigDecimal b2=new BigDecimal(Double.toString(num2));

        switch (op) {

            case '+':

                num3 = b1.add(b2).doubleValue();

                break;

            case '-':

                num3 = b1.subtract(b2).doubleValue();

                break;

            case '*':

                num3 = b1.multiply(b2).doubleValue();

                break;

            case '/':

                num3 = b1.divide(b2).doubleValue();

                break;

            default:

                num3 = num1;

        }

        jLabel1.setText(num3 + " ");

        num1 = 0;

        num2 = 0;

        l="";

    }
遇到的问题。

测试的时候,我发现double直接运算是有误差的,因为计算机使用二进制存储的。所以,我查了一下资料,发现使用java.math.BigDecimal里的BigDecimal类运算。

BigDecimal b1=new BigDecimal(Double.toString(num1));

        BigDecimal b2=new BigDecimal(Double.toString(num2));

定义两个BigDecimal类。

使用BigDecimal类里的方法来进行加减乘除的计算。这样就不会出现误差了。

一个自学小白的内心独白。

这段时间,java是我在中国慕课上学的,接触不深。这也是我第一次写简书,希望看到的大牛们多多批评指正。