Java简单计算器的实现


import javax.swing.*;

import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;



/**
 * Created by one on 2017/4/14.
 */
public class SimpleFrameTest extends JFrame {
    private Border border = BorderFactory.createEmptyBorder(10, 10, 10, 10);

    private JTextField textbox = new JTextField("0");

    private CalculatorCore core = new CalculatorCore();

    private ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton button = (JButton) e.getSource();
            String label = button.getText();
            String result = core.process(label);
            textbox.setText(result);
        }
    };

    public SimpleFrameTest(String title) throws HeadlessException {
        super(title);//调用父类构造方法
        setupFrame();//调整窗体属性
        setupControls();//创建控件
    }

    private void setupControls() {
        setupDisplayPanel();//创建文本面板
        setupButtonPanel();//创建按钮面板
    }

    //创建按钮面板并添加按钮
    private void setupButtonPanel() {
        JPanel panel = new JPanel();
        panel.setBorder(border);
        panel.setLayout(new GridLayout(4, 5, 3, 3));

        createButtons(panel, new String[]{
                "7", "8", "9", "+", "C",
                "4", "5", "6", "-", "CE",
                "1", "2", "3", "*", "",
                "0", ".", "=", "/", ""
        });
        this.add(panel, BorderLayout.CENTER);//设置按钮面板居中对齐
    }

    /**
     * 在指定面板上创建按钮
     */
    private void createButtons(JPanel panel, String[] labels) {
        for (String label : labels) {
            //遍历字符串,如果 label 为空,则表示创建一个空面板,否则创建一个按钮,把按钮添加到面板
            if (label.equals("")) {
                panel.add(new JPanel());
            } else {
                JButton button = new JButton(label);
                button.addActionListener(listener);//为按钮添加监听器
                panel.add(button);//添加按钮到面板
            }
        }
    }

    //设置显示面板,用一个文本框作为计算器的显示部分
    private void setupDisplayPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBorder(border);

        setupTextbox();
        panel.add(textbox, BorderLayout.CENTER);
        this.add(panel, BorderLayout.NORTH);
    }

    //调整文本框
    private void setupTextbox() {
        textbox.setHorizontalAlignment(JTextField.RIGHT);//文本左右对齐
        textbox.setEditable(false);     //文本框只读
        textbox.setBackground(Color.white);//背景为白色
    }

    //调整窗体
    private void setupFrame() {
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体程序结束
        this.setLocation(100, 50);//设置窗体显示在桌面上的位置
        this.setSize(300, 300);//设置窗体大小
        this.setResizable(false);   //窗体大小固定
    }


    //程序入口
    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SimpleFrameTest frame = new SimpleFrameTest("C - 计算器");
        frame.setVisible(true);//在桌面上显示窗体
    }
}

/**
 * 计算器核心逻辑
 */
class CalculatorCore {
    private String displayText = "0";//要显示的文本
    boolean reset = true;
    private BigDecimal number1, number2;
    private String operator;

    private HashMap<String, Operator> operators = new HashMap<String, Operator>();

    private HashMap<String, Processor> processors = new HashMap<String, Processor>();

    CalculatorCore() {
        setupOperators();
        setupProcessor();
    }

    //为每种命令添加处理方式
    private void setupProcessor() {
        processors.put("[0-9]", new Processor() {
            public void calculate(String command) {
                numberClicked(command);
            }
        });
        processors.put("\\.", new Processor() {
            public void calculate(String command) {
                dotClicked();
            }
        });
        processors.put("=", new Processor() {
            public void calculate(String command) {
                equalsClicked();
            }
        });
        processors.put("[+\\-*/]", new Processor() {
            public void calculate(String command) {
                operatorClicked(command);
            }
        });
        processors.put("C", new Processor() {
            public void calculate(String command) {
                 clearClicked();
            }
        });
        processors.put("CE", new Processor() {
            public void calculate(String command) {
                clearErrorClicked();
            }
        });
    }

    //为每种operator添加处理方式
    private void setupOperators() {
        operators.put("+", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.add(number2);
            }
        });
        operators.put("-", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.subtract(number2);
            }
        });
        operators.put("*", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.multiply(number2);
            }
        });
        operators.put("/", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.divide(number2, 30, RoundingMode.HALF_UP);
            }
        });
    }

    //根据命令处理
    public String process(String command) {
        for (String pattern : processors.keySet()) {
            if (command.matches(pattern)) {
                processors.get(pattern).calculate(command);
                break;
            }
        }

        return displayText;
    }

    //当按下CE时,清除上一步的输入
    private void clearErrorClicked() {
        if (operator == null) {
            number1 = null;
        } else {
            number2 = null;
        }
        displayText = "0";
        reset = true;
    }

    //当按下 C 时,全部清楚
    private void clearClicked() {
        number1 = null;
        number2 = null;
        operator = null;
        displayText = "0";
        reset = true;
    }

    //当按下 = 时
    private void equalsClicked() {
        calculateResult();
        number1 = null;
        number2 = null;
        operator = null;
        reset = true;
    }

    //计算结果
    private void calculateResult() {
        number2 = new BigDecimal(displayText);
        Operator oper = operators.get(operator);
        if (oper != null) {
            BigDecimal result = oper.process(number1, number2);
            displayText = result.toString();
        }
    }

    //当按下 + - * / 时
    private void operatorClicked(String command) {
        if (operator != null) {
            calculateResult();
        }

        number1 = new BigDecimal(displayText);
        operator = command;

        reset = true;
    }

    //当按下 . 时
    private void dotClicked() {
        if (displayText.indexOf(".") == -1) {
            displayText += ".";
        } else if (reset) {
            displayText = "0";
        }
        reset = false;
    }

    //当按下 0-9 时
    private void numberClicked(String command) {
        if (reset) {
            displayText = command;
        } else {
            displayText += command;
        }
        reset = false;
    }


    //运算符处理接口
    interface Operator {
        BigDecimal process(BigDecimal number1, BigDecimal number2);
    }

    //按钮处理接口
    interface Processor {
        void calculate(String command);
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值