Java实战之简易计算器(5)——实现逻辑功能

打开Controller.java类,里面即是控件对象和事件处理方法。

写一个清除按钮的事件处理方法,如下:

其他按钮的事件处理方法类似。

所以计算器的所有事件处理方法代码如下:


package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;

import java.math.BigDecimal;
import java.util.Vector;

public class Controller {

    @FXML
    private TextField resultTextField;

    // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0。
    String str1 = "0";

    // 操作数2
    String str2 = "0";

    // 运算符
    String signal = "+";

    // 运算结果
    String result = "";

    // 以下k1至k2为状态开关
    // 开关1用于选择输入方向,将要写入str1或str2
    int k1 = 1;
    // 开关2用于记录符号键的次数,如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算
    int k2 = 1;
    // 开关3用于标识 str1 是否可以被清0 ,等于1时可以,不等于1时不能被清0
    int k3 = 1;
    // 开关4用于标识 str2 是否可以被清0
    int k4 = 1;
    // 开关5用于控制小数点可否被录入,等于1时可以,不为1时,输入的小数点被丢掉
    int k5 = 1;
    // store的作用类似于寄存器,用于记录是否连续按下符号键
    Button store;

    @SuppressWarnings("rawtypes")
    Vector vt = new Vector(20, 10);

    /**
     * ”清除“按钮的事件监听器
     *
     * @param event
     */
    public void clearButtonEvent(ActionEvent event) {
        do_clear_event(event);
    }

    /**
     * ”%”求模按钮的事件监听器
     *
     * @param event
     */
    public void moduleButtonEvent(ActionEvent event) {
        do_mark_event(event);
    }

    /**
     * “*”按钮的事件监听器
     *
     * @param event
     */
    public void multiplyButtonEvent(ActionEvent event) {
        do_mark_event(event);
    }

    /**
     * ”/“除按钮的事件监听器
     *
     * @param event
     */
    public void dividedButtonEvent(ActionEvent event) {
        do_mark_event(event);
    }

    /**
     * ”-“按钮的事件监听器
     *
     * @param event
     */
    public void subtractButtonEvent(ActionEvent event) {
        do_mark_event(event);
    }

    /**
     * ”+“按钮的事件监听器
     *
     * @param event
     */
    public void addButtonEvent(ActionEvent event) {
        do_mark_event(event);
    }

    /**
     * ”.“按钮的事件监听器
     *
     * @param event
     */
    public void decimalPointButtonEvent(ActionEvent event) {
        do_decimalPoint_event(event);
    }

    /**
     * “=”按钮的事件监听器
     *
     * @param event
     */
    public void equalsButtonEvent(ActionEvent event) {
        do_equals_event(event);
    }

    /**
     * “7”按钮的事件监听器
     *
     * @param event
     */
    public void sevenButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “8”按钮的事件监听器
     *
     * @param event
     */
    public void nightButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “9”按钮的事件监听器
     *
     * @param event
     */
    public void nineButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “4”按钮的事件监听器
     *
     * @param event
     */
    public void fourButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “5”按钮的事件监听器
     *
     * @param event
     */
    public void fiveButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “6”按钮的事件监听器
     *
     * @param event
     */
    public void sixButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “1”按钮的事件监听器
     *
     * @param event
     */
    public void oneButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “2”按钮的事件监听器
     *
     * @param event
     */
    public void twoButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “3”按钮的事件监听器
     *
     * @param event
     */
    public void threeButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “00”按钮的事件监听器
     *
     * @param event
     */
    public void zeroZeroButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * “0”按钮的事件监听器
     *
     * @param event
     */
    public void zeroButtonEvent(ActionEvent event) {
        do_number_event(event);
    }

    /**
     * 操作结果:数字键处理事件(0——9等数字键的处理)
     *
     * @param event
     */
    public void do_number_event(ActionEvent event) {
        // 获取事件源(按钮)的文本值
        String ss = ((Button) event.getSource()).getText();
        store = (Button) event.getSource();
        vt.add(store);
        if (k1 == 1) {
            if (k3 == 1) {
                str1 = "";
                k5 = 1;// 还原开关k5状态
            }
            str1 = str1 + ss;
            k3 = k3 + 1;
            // 在文本框中显示结果
            resultTextField.setText(str1);
        } else if (k1 == 2) {
            if (k4 == 1) {
                str2 = "";
                k5 = 1;// 还原开关k5状态
            }
            str2 = str2 + ss;
            k4 = k4 + 1;
            resultTextField.setText(str2);
        }
    }

    /**
     * 操作结果:运算符号键处理事件
     *
     * @param event
     */
    public void do_mark_event(ActionEvent event) {
        String ss2 = ((Button) event.getSource()).getText();
        store = (Button) event.getSource();
        vt.add(store);

        if (k2 == 1) {
            // 开关 k1 为 1 时向数 1 写输入值,为2时向数2写输入值。
            k1 = 2;
            k5 = 1;
            signal = ss2;
            k2 = k2 + 1;// 按符号键的次数
        } else {
            int a = vt.size();
            Button c = (Button) vt.get(a - 2);

            if (!(c.getText().equals("+"))
                    && !(c.getText().equals("-"))
                    && !(c.getText().equals("*"))
                    && !(c.getText().equals("/"))
                    && !(c.getText().equals("%"))
            ) {
                cal();
                str1 = result;
                // 开关 k1 为 1 时,向数 1 写值,为2时向数2写
                k1 = 2;
                k5 = 1;
                k4 = 1;
                signal = ss2;
            }
            k2 = k2 + 1;

        }
    }

    /**
     * 操作结果:清除键处理事件
     *
     * @param event
     */
    public void do_clear_event(ActionEvent event) {
        store = (Button) event.getSource();
        vt.add(store);
        k5 = 1;
        k2 = 1;
        k1 = 1;
        k3 = 1;
        k4 = 1;
        str1 = "0";
        str2 = "0";
        signal = "";
        result = "";
        resultTextField.setText(result);
        vt.clear();
    }

    /**
     * 操作结果:等号键处理事件
     *
     * @param event
     */
    public void do_equals_event(ActionEvent event) {
        store = (Button) event.getSource();
        vt.add(store);
        cal();

        // 还原各个开关的状态
        k1 = 1;
        k2 = 1;
        k3 = 1;
        k4 = 1;

        str1 = result;
    }

    /**
     * 操作结果:小数点键处理事件
     *
     * @param event
     */
    public void do_decimalPoint_event(ActionEvent event) {
        store = (Button) event.getSource();
        vt.add(store);
        if (k5 == 1) {
            String ss2 = ((Button) event.getSource()).getText();
            if (k1 == 1) {
                if (k3 == 1) {
                    str1 = "";
                    // 还原开关k5状态
                    k5 = 1;
                }
                str1 = str1 + ss2;

                k3 = k3 + 1;

                // 显示结果
                resultTextField.setText(str1);

            } else if (k1 == 2) {
                if (k4 == 1) {
                    str2 = "";
                    // 还原开关k5的状态
                    k5 = 1;
                }
                str2 = str2 + ss2;

                k4 = k4 + 1;

                resultTextField.setText(str2);
            }
        }

        k5 = k5 + 1;
    }

    /**
     * 操作结果:计算逻辑
     */
    public void cal() {
        // 操作数1
        double a2;
        // 操作数2
        double b2;
        // 运算符
        String c = signal;
        // 运算结果
        double result2 = 0;

        if (c.equals("")) {
            resultTextField.setText("Please input operator");

        } else {
            // 手动处理小数点的问题
            if (str1.equals(".")) {
                str1 = "0.0";
            }
            if (str2.equals(".")) {
                str2 = "0.0";
            }
            a2 = Double.valueOf(str1).doubleValue();
            b2 = Double.valueOf(str2).doubleValue();

            if (c.equals("+")) {
                result2 = a2 + b2;
            }
            if (c.equals("-")) {
                result2 = a2 - b2;
            }
            if (c.equals("*")) {
                BigDecimal m1 = new BigDecimal(Double.toString(a2));
                BigDecimal m2 = new BigDecimal(Double.toString(b2));
                result2 = m1.multiply(m2).doubleValue();
            }
            if (c.equals("/")) {
                if (b2 == 0) {
                    result2 = 0;
                } else {
                    result2 = a2 / b2;
                }

            }
            if (c.equals("%")) {
                result2 = a2 % b2;
            }

            result = ((new Double(result2)).toString());

            resultTextField.setText(result);
        }
    }
}

到这里为止,本项目的所有代码都完成了。

接下来就是测试功能了。

 

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【20191019】可获取本节源码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值