美文网首页Java 杂谈Java学习笔记
WarMj:JAVA 简易计算器源码

WarMj:JAVA 简易计算器源码

作者: WarMj | 来源:发表于2017-12-12 21:18 被阅读0次

    参考:http://yuncode.net/code/c_50b0c000f0c2e62
    作者:程序猿style

    界面.png

    源码

    package top.warmj.calculator;
    
    import java.awt.*;
    import java.awt.event.*;
    
    public class Calc extends Frame implements ActionListener {
        Font font = new Font("宋体", Font.PLAIN, 24); // 全局字体,字体无效
        private Button b_7;
        private Button b_8;
        private Button b_9;
        private Button b_divi; // 除号
        private Button b_4;
        private Button b_5;
        private Button b_6;
        private Button b_multi; // 乘号
        private Button b_1;
        private Button b_2;
        private Button b_3;
        private Button b_sub; // 减号
        private Button b_dot; // 小数点
        private Button b_0;
        private Button b_equal; // 等于号
        private Button b_plus; // 加号
        private TextField tf_result; // 结果显示框
        private Button b_clear;
        private double resultNum = 0.0;
        private Button b_backspace;
        private Boolean isFirstNum = true; // 是否第一个数字,或按下运算按钮后的第一个数字
        private boolean isValid = true; // 操作是否合法
        private String operator = "="; // 当前运算的运算符
        private Button[] numButtonArrs; // 数字按钮数组
        private Button[] opeButtonArrs; // 运算符等按钮数组
    
        public static void main(String[] args) {
            new Calc("Simple Calculator —— WarMj");
        }
    
        // 程序功能
        public Calc() {
            init();
        }
    
        public Calc(String name) {
            super(name);
            init();
        }
    
        // 初始化
        public void init() {
            this.setSize(500, 270);
            this.setLocation(750, 400);
            this.setIconImage(Toolkit.getDefaultToolkit().createImage("calc.png"));
            this.setVisible(true);
            this.setResizable(false);
            northPanel();
            centerPanel();
            event();
        }
    
        // 按键点击动作监听
        public void actionPerformed(ActionEvent e) {
            // 获取事件源的标签
            String label = e.getActionCommand();
            if (label.equals(opeButtonArrs[5].getLabel())) {
                // 点击"Backspace"键
                handleBackspace();
            } else if (label.equals(opeButtonArrs[6].getLabel())) {
                // 点击"CE"键
                tf_result.setText("");
            } else if ("0123456789.".indexOf(label) >= 0) {
                // 点击数字键或者小数点键
                handleNumber(label);
            } else {
                // 用户点击运算符键
                handleOperator(label);
            }
        }
    
        // 运算符键功能
        private void handleOperator(String key) {
            if (operator.equals("/")) {
                // 除法运算
                // 如果当前结果文本框中的值等于0
                if (getNumberFromText() == 0.0) {
                    // 操作不合法
                    isValid = false;
                    tf_result.setText("除数不能为零");
                } else {
                    resultNum /= getNumberFromText();
                }
            } else if (operator.equals("+")) {
                // 加法运算
                resultNum += getNumberFromText();
            } else if (operator.equals("-")) {
                // 减法运算
                resultNum -= getNumberFromText();
            } else if (operator.equals("*")) {
                // 乘法运算
                resultNum *= getNumberFromText();
            } else if (operator.equals("=")) {
                // 赋值运算
                resultNum = getNumberFromText();
            }
            if (isValid) {
                // 双精度浮点数的运算
                long t1; // 存放长整数
                double t2; // 判断差值
                t1 = (long) resultNum;
                t2 = resultNum - t1;
    
                if (t2 == 0) {
                    // 没有差值,说明是值是整数,这样没有小数点
                    tf_result.setText(String.valueOf(t1));
                } else {
                    // 有差值,说明是浮点数
                    tf_result.setText(String.valueOf(resultNum));
                }
            }
    
            // 运算符等于用户按的按钮
            operator = key;
            isFirstNum = true;
            isValid = true;
        }
    
        // 数字键或小数点键功能
        private void handleNumber(String key) {
            if (isFirstNum) {
                // 如果输入的是第一个数字
                tf_result.setText(key);
            } else if (key.equals(".") && (tf_result.getText().indexOf(".") < 0)) {
                tf_result.setText(tf_result.getText() + ".");
            } else if (!key.equals(".")) {
                tf_result.setText(tf_result.getText() + key);
            }
    
            // 以后输入的就不是第一个数字了
            isFirstNum = false;
        }
    
        // 退格键功能
        private void handleBackspace() {
            if (tf_result.getText().equals("")) {
                isFirstNum = true;
                resultNum = 0.0;
                operator = "=";
            } else {
                String str = tf_result.getText();
                tf_result.setText(str.substring(0, str.length() - 1));
            }
        }
    
        // 事件
        public void event() {
            // 创建键盘监听对象
            KeyAdapter keyadapter = new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode() > 47 && e.getKeyCode() < 58) {
                        handleNumber(e.getKeyText(e.getKeyCode()));
                    } else if (e.getKeyCode() > 95 && e.getKeyCode() < 106) {
                        handleNumber(e.getKeyText(e.getKeyCode()).substring(7, 8));
                    }
    
                    switch (e.getKeyCode()) {
                        case 106: // 乘号 *
                            handleOperator("*");
                            break;
                        case 61:
                        case 107: // 加号 +
                            handleOperator("+");
                            break;
                        case 45:
                        case 109: // 减号 -
                            handleOperator("-");
                            break;
                        case 111: // 除号 /
                            handleOperator("/");
                            break;
                        case 10: // 回车 Enter
                            handleOperator("=");
                            break;
                        case 8: // 退格 Backpace
                            handleBackspace();
                            break;
                        case 46:
                        case 110: // 小数点 .
                            handleNumber(".");
                            break;
                        case 27:
                            tf_result.setText("");
                            break;
                        default:
                            break;
                    }
                }
            };
    
            // 添加键盘监听事件
            tf_result.addKeyListener(keyadapter);
    
            for (int i = 0; i < numButtonArrs.length; i++) {
                // 给按钮添加监听事件,由于本类已经实现 ActionListener 接口,所以直接用 this
                numButtonArrs[i].addActionListener(this); // 点击
                numButtonArrs[i].addKeyListener(keyadapter); // 按钮
            }
    
            for (int i = 0; i < opeButtonArrs.length; i++) {
                opeButtonArrs[i].addActionListener(this); // 点击
                opeButtonArrs[i].addKeyListener(keyadapter); // 按钮
            }
    
            // 关闭窗口
            this.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    
        // 北布局,计算结果和清零按钮
        public void northPanel() {
            Panel north = new Panel();
    
            // 结果框
            tf_result = new TextField();
            tf_result.setEditable(false);
            tf_result.setBackground(Color.WHITE);
            tf_result.setColumns(25);
            tf_result.setFont(font);
            tf_result.setText("");
    
            // 退格按钮
            b_backspace = new Button("←");
            b_backspace.setPreferredSize(new Dimension(50, 35));
            b_backspace.setFont(font);
    
            // 清零按钮
            b_clear = new Button("CE");
            b_clear.setPreferredSize(new Dimension(50, 35));
            b_clear.setFont(font);
    
            north.add(tf_result);
            north.add(b_backspace);
            north.add(b_clear);
            this.add(north, BorderLayout.NORTH);
        }
    
        // 中间布局,其他运算按钮
        public void centerPanel() {
            Panel center = new Panel();
    
            b_7 = getButton("7");
            b_8 = getButton("8");
            b_9 = getButton("9");
            b_divi = getButton("/");
            b_4 = getButton("4");
            b_5 = getButton("5");
            b_6 = getButton("6");
            b_multi = getButton("*");
            b_1 = getButton("1");
            b_2 = getButton("2");
            b_3 = getButton("3");
            b_sub = getButton("-");
            b_dot = getButton(".");
            b_0 = getButton("0");
            b_equal = getButton("=");
            b_plus = getButton("+");
    
            // 数字和小数点按钮数组
            numButtonArrs = new Button[] { b_0, b_1, b_2, b_3, b_4, b_5, b_6, b_7, b_8, b_9, b_dot };
    
            // 运算符按钮数组
            opeButtonArrs = new Button[] { b_plus, b_sub, b_multi, b_divi, b_equal, b_backspace, b_clear };
    
            center.add(b_7);
            center.add(b_8);
            center.add(b_9);
            center.add(b_divi);
            center.add(b_4);
            center.add(b_5);
            center.add(b_6);
            center.add(b_multi);
            center.add(b_1);
            center.add(b_2);
            center.add(b_3);
            center.add(b_sub);
            center.add(b_dot);
            center.add(b_0);
            center.add(b_equal);
            center.add(b_plus);
    
            center.setVisible(true);
            this.add(center, BorderLayout.CENTER);
        }
    
        // 获取按钮功能
        public Button getButton(String name) {
            Button button = new Button(name);
            button.setPreferredSize(new Dimension(115, 40));
            button.setFont(font);
    
            return button;
        }
    
        // 获取当前数字
        private double getNumberFromText() {
            double result = 0.0;
            try {
                result = Double.valueOf(tf_result.getText()).doubleValue();
            } catch (NumberFormatException e) {
            }
            return result;
        }
    }
    
    calc.png

    相关文章

      网友评论

        本文标题:WarMj:JAVA 简易计算器源码

        本文链接:https://www.haomeiwen.com/subject/jlbnixtx.html