A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xbs783 中级黑马   /  2016-11-4 16:43  /  949 人查看  /  5 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.awt.Color;

/**
* java版计算器
*/
public class Calculator extends JFrame {
        final int WIN_W = 250, WIN_H = 250;
        JPanel myPanel, panelSuper;

        public Calculator() {

                // 主面板
                panelSuper = new JPanel();
                panelSuper.setLayout(null);

                // 设置窗口位置
                double width = Toolkit.getDefaultToolkit().getScreenSize().width;
                double height = Toolkit.getDefaultToolkit().getScreenSize().height;
                this.setBounds((int) (width - WIN_W) / 2, (int) (height - WIN_H) / 2,
                                WIN_W, WIN_H);

                // 窗口配置
                this.setTitle("java版计算器");
                this.validate();
                this.setResizable(false);
                this.setVisible(true);
                this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

                // 添加计算器按钮面板
                myPanel = new MyPanel();
                this.add(myPanel, BorderLayout.CENTER);

        }

        public static void main(String[] args) {
                new Calculator();
        }

        /**
         * 计算器按钮面板类
         */
        class MyPanel extends JPanel implements ActionListener {
                JButton button1, button2, button3, button4, button5, button6, button7,
                                button8, button9, button0, buttonJia, buttonJian, buttonCheng,
                                buttonChu, buttonDeng, buttonDian, buttonC, buttonDel,
                                buttonZF, buttonGH;
                JTextField jTextField; // 计算器显示屏
                char oper; // 操作符
                String key, allKey = "1234567890.±del", jjccKey = "+-*/";
                BigDecimal d1, d2;
                boolean first;

                public MyPanel() {

                        // 设置布局
                        this.setLayout(new FlowLayout(FlowLayout.LEFT, 4, 5));

                        // 计算器显示屏
                        jTextField = new JTextField(21);
                        jTextField.setHorizontalAlignment(JTextField.RIGHT);
                        jTextField.setEditable(false);
                        jTextField.setBackground(new Color(255, 255, 255));
                        jTextField.setText("0");
                        this.add(jTextField);

                        // 计算器按钮
                        button1 = new JButton("1");
                        button2 = new JButton("2");
                        button3 = new JButton("3");
                        button4 = new JButton("4");
                        button5 = new JButton("5");
                        button6 = new JButton("6");
                        button7 = new JButton("7");
                        button8 = new JButton("8");
                        button9 = new JButton("9");
                        button0 = new JButton("0");
                        buttonJia = new JButton("+");
                        buttonJian = new JButton("-");
                        buttonCheng = new JButton("*");
                        buttonChu = new JButton("/");
                        buttonDeng = new JButton("=");
                        buttonDian = new JButton(".");
                        buttonDel = new JButton("del");
                        buttonC = new JButton("c");
                        buttonZF = new JButton("±");
                        buttonGH = new JButton("√");
                        button1.setPreferredSize(new Dimension(55, 30));
                        button2.setPreferredSize(new Dimension(55, 30));
                        button3.setPreferredSize(new Dimension(55, 30));
                        button4.setPreferredSize(new Dimension(55, 30));
                        button5.setPreferredSize(new Dimension(55, 30));
                        button6.setPreferredSize(new Dimension(55, 30));
                        button7.setPreferredSize(new Dimension(55, 30));
                        button8.setPreferredSize(new Dimension(55, 30));
                        button9.setPreferredSize(new Dimension(55, 30));
                        button0.setPreferredSize(new Dimension(55, 30));
                        buttonJia.setPreferredSize(new Dimension(55, 30));
                        buttonJian.setPreferredSize(new Dimension(55, 30));
                        buttonCheng.setPreferredSize(new Dimension(55, 30));
                        buttonChu.setPreferredSize(new Dimension(55, 30));
                        buttonDeng.setPreferredSize(new Dimension(55, 30));
                        buttonDian.setPreferredSize(new Dimension(55, 30));
                        buttonDel.setPreferredSize(new Dimension(55, 30));
                        buttonC.setPreferredSize(new Dimension(55, 30));
                        buttonZF.setPreferredSize(new Dimension(55, 30));
                        buttonGH.setPreferredSize(new Dimension(55, 30));
                        this.add(buttonDel);
                        this.add(buttonC);
                        this.add(buttonZF);
                        this.add(buttonGH);
                        this.add(button1);
                        this.add(button2);
                        this.add(button3);
                        this.add(buttonJia);
                        this.add(button4);
                        this.add(button5);
                        this.add(button6);
                        this.add(buttonJian);
                        this.add(button7);
                        this.add(button8);
                        this.add(button9);
                        this.add(buttonCheng);
                        this.add(button0);
                        this.add(buttonDian);
                        this.add(buttonDeng);
                        this.add(buttonChu);
                        buttonDel.addActionListener(this);
                        buttonC.addActionListener(this);
                        buttonZF.addActionListener(this);
                        buttonGH.addActionListener(this);
                        button1.addActionListener(this);
                        button2.addActionListener(this);
                        button3.addActionListener(this);
                        button4.addActionListener(this);
                        button5.addActionListener(this);
                        button6.addActionListener(this);
                        button7.addActionListener(this);
                        button8.addActionListener(this);
                        button9.addActionListener(this);
                        button0.addActionListener(this);
                        buttonJia.addActionListener(this);
                        buttonJian.addActionListener(this);
                        buttonCheng.addActionListener(this);
                        buttonChu.addActionListener(this);
                        buttonDeng.addActionListener(this);
                        buttonDian.addActionListener(this);

                        // 计算器初始化
                        init();
                }

                /**
                 * 计算器初始化
                 */
                public void init() {
                        d1 = new BigDecimal("0");
                        d1 = new BigDecimal("0");
                        key = "=";
                        oper = '=';
                        jTextField.setText("0");
                        first = true; // 用于标记是否进行连续操作(例如按键顺序为“9*9====”,第一次等于first由true变为false,如果!first,按等号相当于用上一次的结果与第二个操作数相乘)
                }

                /**
                 * 按钮监听
                 */
                public void actionPerformed(ActionEvent e) {
                        JButton b = (JButton) e.getSource();
                        if (b == buttonDian) { // 按下.

                                jTextField.setText(jTextField.getText() + ".");
                                if (first) {
                                        d2 = d1 = getNum();
                                } else {
                                        d2 = getNum();
                                }
                        } else if (b == buttonZF) {// 按下±
                                BigDecimal d = getNum();
                                d = new BigDecimal("0").subtract(d);
                                setFormatNum(d);
                                if (first) {
                                        d2 = d1 = getNum();
                                } else {
                                        d2 = getNum();
                                }
                        } else if (b == buttonDel) {// 按下del
                                if (jTextField.getText().length() == 1
                                                || jTextField.getText().length() == 2
                                                && jTextField.getText().startsWith("-")) {
                                        jTextField.setText("0");

                                } else {
                                        String s = jTextField.getText();
                                        s = s.substring(0, s.length() - 1);
                                        if (s.endsWith("E+") || s.endsWith("E-"))
                                                s = s.substring(0, s.length() - 2);
                                        jTextField.setText(s);
                                        if (first) {
                                                d2 = d1 = getNum();
                                        } else {
                                                d2 = getNum();
                                        }
                                }
                        } else if (b == buttonC) {// 按下c
                                init();
                        } else if (b == buttonJia) {// 按下+
                                BigDecimal s;
                                if (!first && allKey.indexOf(key) >= 0) {
                                        if (oper == '-' || oper == '/') {
                                                s = operate(d1, oper, d2);
                                        } else {
                                                s = operate(d2, oper, d1);
                                        }
                                        setFormatNum(s);
                                }// 如果不是第一次,且上一次操作是对数字进行操作
                                else {

                                        first = false;
                                }
                                d2 = d1 = getNum();
                                // System.out.print("111我执行啦\n");
                                oper = '+';
                        } else if (b == buttonJian) {// 按下-
                                BigDecimal s;
                                if (!first && allKey.indexOf(key) >= 0) {
                                        s = operate(d1, oper, d2);
                                        setFormatNum(s);
                                }// 如果不是第一次,且上一次操作是对数字进行操作
                                else {
                                        first = false;
                                }
                                d2 = d1 = getNum();
                                oper = '-';
                        } else if (b == buttonCheng) {// 按下*
                                BigDecimal s;
                                if (!first && allKey.indexOf(key) >= 0) {
                                        if (oper == '-' || oper == '/') {
                                                s = operate(d1, oper, d2);
                                        } else {
                                                s = operate(d2, oper, d1);
                                        }
                                        setFormatNum(s);
                                }// 如果不是第一次,且上一次操作是对数字进行操作
                                else {
                                        first = false;
                                }
                                d2 = d1 = getNum();
                                oper = '*';
                        } else if (b == buttonChu) {// 按下/
                                BigDecimal s;
                                if (!first && allKey.indexOf(key) >= 0) {
                                        s = operate(d1, oper, d2);
                                        setFormatNum(s);
                                }// 如果不是第一次,且上一次操作是对数字进行操作
                                else {
                                        first = false;
                                }
                                d2 = d1 = getNum();
                                oper = '/';
                        } else if (b == buttonGH) {// 按下平方根
                                if (jTextField.getText().startsWith("-")) {
                                        init();
                                        return;
                                }
                                BigDecimal d = getNum();
                                MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN);
                                d = new BigDecimal(Math.sqrt(d.doubleValue()), mc);
                                setFormatNum(d);
                                if (first) {
                                        d2 = d1 = getNum();
                                } else {
                                        d2 = getNum();
                                }
                        } else if (b == buttonDeng) {// 按下=
                                BigDecimal s = null;
                                d2 = getNum();
                                if (!key.equals("=")) {
                                        s = operate(d1, oper, d2);
                                } else {
                                        s = operate(d2, oper, d1);
                                }
                                if (oper != '=' && !key.equals("=")) {// 上一次操作为 +-*/
                                        d1 = getNum();

                                }
                                setFormatNum(s);
                                first = true;
                        } else { // 按下其他按钮
                                if (this.jTextField.getText().equals("0")
                                                || allKey.indexOf(key) == -1) {
                                        this.jTextField.setText(b.getText());
                                } else {
                                        this.jTextField.setText(jTextField.getText() + b.getText());
                                }
                                if (first) {
                                        d2 = d1 = getNum();
                                } else {
                                        d2 = getNum();
                                }// d2作被加数:d2+d1
                        }
                        key = b.getText();
                }

                /**
                 * 获取操作数
                 *
                 * @return 操作数
                 */
                public BigDecimal getNum() {
                        BigDecimal d = new BigDecimal(jTextField.getText());
                        return d;
                }

                public void setFormatNum(BigDecimal dd) {
                        MathContext mc = new MathContext(18, RoundingMode.HALF_DOWN);

                        BigDecimal d = new BigDecimal(dd.toString(), mc);
                        String num = d.toString();
                        if (num.endsWith(".0"))
                                num = num.replaceAll("\\.0", "");
                        this.jTextField.setText(num);
                }

                /**
                 * 计算
                 *
                 * @param a1
                 *            操作数1
                 * @param c
                 *            操作符
                 * @param a2
                 *            操作数2
                 * @return
                 */
                public BigDecimal operate(BigDecimal a1, char c, BigDecimal a2) {
                        MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN);
                        switch (c) {
                        case '+':
                                return a1.add(a2);
                        case '-':
                                return a1.subtract(a2);
                        case '*':
                                return a1.multiply(a2);
                        case '/':
                                if (a2.compareTo(new BigDecimal("0")) == 0) {
                                        init();
                                        return new BigDecimal("0");
                                }
                                return a1.divide(a2, mc);
                        default:
                                return a2;
                        }
                }
        }

}

5 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
哇。。可以。。代码足。。赞一个。。
回复 使用道具 举报
{:8_497:}学习用,马一个
回复 使用道具 举报
我曾经使用单片机的控制电容屏写过一个简单的计算器,发现并不是很复杂,但是很麻烦。而且有些bug ,我明白做好一个计算器也不是简单。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马