计算器(二)

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Arrays;



import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class CalcFrame  extends JFrame {

    /**

     * 计算器的外观设计

     */
//窗口长宽设计
    private static final long serialVersionUID = 1L;

    private final static int PRE_WIDTH = 500;

    private final static int PRE_HEIGHT = 400;



    private JTextField text = null;

    private JButton button = null; //存储标记


    private String[] nOp = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};

    private String[] mOp= {"MC","MR","MS","M+"};

    private String[] rOp = {"Back","CE","C"};

    private CalService service = new CalService();


    public CalcFrame (){

        this.setTitle("计算器");

        this.setSize(PRE_WIDTH, PRE_HEIGHT);

        this.setLocationRelativeTo(null);

        this.setResizable(false);



        //添加底层

        JPanel panel = new JPanel();

        panel.setLayout(new BorderLayout(10,1));

        panel.add(getTextField(), BorderLayout.NORTH);

        panel.setPreferredSize(new Dimension(PRE_WIDTH, PRE_HEIGHT));



        //WEST

        JButton[] mButton = getMButton();

        JPanel panel1 = new JPanel();

        panel1.setLayout(new GridLayout(5,1,0,5));

        for(JButton b : mButton ){

            panel1.add(b);

        }

        panel.add(panel1,BorderLayout.WEST);

        //

        JButton[] rButton = getRButton();

        JPanel panel2 = new JPanel();

        panel2.setLayout(new BorderLayout(1,5));

        JPanel panel21 = new JPanel();

        panel21.setLayout(new GridLayout(1,3,3,3));

        for(JButton b : rButton){

            panel21.add(b);

        }

        panel2.add(panel21,BorderLayout.NORTH);



        JButton[] nButton = getNButton();

        JPanel panel22 = new JPanel();

        panel22.setLayout(new GridLayout(4,5,3,5));

        for(JButton b : nButton){

            panel22.add(b);

        }

        panel2.add(panel22,BorderLayout.CENTER);

        panel.add(panel2,BorderLayout.CENTER);



        this.add(panel);

        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        this.setVisible(true);





    }

    //返回显示框

    private JTextField getTextField(){

        text = new JTextField("0",10);

        //text.setSize(480, 50);

        return text;

    }

    //返回数字键

    private JButton[] getNButton(){

        String[] redButton = {"/","*","-","+","="};

        JButton[] nbutton = new JButton[nOp.length];

        for(int i = 0; i < this.nOp.length; i++){

            JButton b = new JButton(this.nOp[i]);

            b.addActionListener(getActionListener());



            Arrays.sort(redButton);

            if(Arrays.binarySearch(redButton, nOp[i]) >= 0){

                b.setForeground(Color.red);

            }else{

                b.setForeground(Color.blue);

            }

            nbutton[i] = b;

        }

        return nbutton;

    }

    //返回操作健

    private JButton[] getMButton(){

        JButton[] mbutton = new JButton[mOp.length + 1];

        mbutton[0] = getButton();

        for(int i = 0; i < this.mOp.length; i++){

            JButton b = new JButton(this.mOp[i]);

            b.addActionListener(getActionListener());

            b.setForeground(Color.red);

            mbutton[i+1] = b;

        }

        return mbutton;

    }

    private JButton[] getRButton(){

        JButton[] rbutton = new JButton[rOp.length];

        for(int i = 0; i < this.rOp.length; i++){

            JButton b = new JButton(this.rOp[i]);

            b.addActionListener(getActionListener());

            b.setForeground(Color.red);

            rbutton[i] = b;

        }

        return rbutton;

    }

    private JButton getButton(){

        button = new JButton();

        return button;

    }

    private ActionListener getActionListener(){

        ActionListener actionListener = new ActionListener() {



            @Override

            public void actionPerformed(ActionEvent e) {

                String cmd = e.getActionCommand();

                String result = null;

                try {

                    result = service.callMethod(cmd, text.getText());

                } catch (Exception e2) {

                    System.out.println(e2.getMessage());

                }

                if(cmd.indexOf("MC") == 0){

                    button.setText("");

                }else if(cmd.indexOf("M") == 0){

                    button.setText("M");

                }

                //显示计算结果

                if(result != null){

                    text.setText(result);

                }



            }

        };

        return actionListener;

    }

    public static void main(String[] args) {

        new CalcFrame ();

    	}
    }




public class CalService {

    private boolean isSecondNum = false;

    private String lastOp;

    private String firstNum = "0";

    private String secondNum = "null";

    private double store;

    private String numString = "0123456789.";

    private String opString = "+-*/";



    public String catNum(String cmd, String text) {

        String result = cmd;

        // 如果text不等于0

        if (!"0".equals(text)) {

            if (isSecondNum) {

                isSecondNum = false;

            } else {

                result = text + cmd;

            }

        }

        if (result.indexOf(".") == 0) {

            result = "0" + result;

        }

        return result;

    }



    public String setOp(String cmd, String text) {

        this.lastOp = cmd;

        this.firstNum = text;

        this.secondNum = null;



        this.isSecondNum = true;

        return null;

    }



    public String cal(String text, boolean isPercent) {

        double secondResult = secondNum == null ? Double.valueOf(text)

                .doubleValue() : Double.valueOf(secondNum).doubleValue();



        //除数为0

        if(secondResult == 0 && this.lastOp.equals("/")){

            return "0";

        }



        //有%

        if(isPercent){

            secondResult = MyMath.multiply(Double.valueOf(firstNum), MyMath.divide(secondResult, 100));

        }

        if(this.lastOp.equals("+")){

            firstNum = String.valueOf(MyMath.add(Double.valueOf(firstNum),secondResult));

        }else if (this.lastOp.equals("-")) {

            firstNum = String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult));

        }else if (this.lastOp.equals("*")) {

            firstNum = String.valueOf(MyMath.multiply(Double.valueOf(firstNum),secondResult));

        }else if (this.lastOp.equals("/")) {

            firstNum = String.valueOf(MyMath.divide(Double.valueOf(firstNum),secondResult));

        }



        secondNum = secondNum == null ? text :secondNum;

        this.isSecondNum = true;

        return firstNum;

    }

    //求开方

    public String sqrt(String text){

        this.isSecondNum = true;

        return String.valueOf(Math.sqrt(Double.valueOf(text)));

    }

    //求倒数

    public String setReciprocal(String text){

        if (text.equals("0")){

            return text;

        }else{

            this.isSecondNum = true;

            return String.valueOf(MyMath.divide(1, Double.valueOf(text)));

        }

    }

    //存储

    public String mCmd(String cmd,String text){

        if(cmd.equals("M+")){

            store = MyMath.add(store, Double.valueOf(text));

        }else if (cmd.equals("MC")) {

            store = 0;

        }else if (cmd.equals("MR")) {

            isSecondNum = true;

            return String.valueOf(store);

        }else if (cmd.equals("MS")) {

            store = Double.valueOf(text).doubleValue();

        }

        return null;

    }



    public String backSpace(String text){

        return text.equals("0") || text.equals("") ? "0" :text.substring(0,text.length()-1);

    }



    public String setNegative(String text){

        if(text.indexOf("-") == 0){

            return text.substring(1,text.length());

        }else{

            return "-" + text;

        }

    }

    public String clearAll(){

        this.firstNum = "0";

        this.secondNum = null;

        return this.firstNum;

    }

    public String clear(String text){

        return "0";

    }



    public String callMethod(String cmd, String text){

        if(cmd.equals("C")){

            return clearAll();

        }else if(cmd.equals("CE")){

            return clear(text);

        }else if (cmd.equals("Back")) {

            return backSpace(text);

        }else if (numString.indexOf(cmd) != -1) {

            return catNum(cmd, text);

        }else if (opString.indexOf(cmd) != -1) {

            return setOp(cmd, text);

        }else if (cmd.equals("+/-")) {

            return setNegative(text);  //设置正负号

        }else if(cmd.equals("1/x")){

            return setReciprocal(text);

        }else if (cmd.equals("sqrt")) {

            return sqrt(text);

        }else if(cmd.equals("%")){

            return cal(text, true);

        }else if(cmd.equals("=")){

            return cal(text, false);

        }else {

            return mCmd(cmd, text);

        }

    }

}

import java.math.BigDecimal;
/**

     * 为一个double类型创建BigDecimal对象

     */
public class MyMath {
    private static BigDecimal getBigDecimal(double number){

        return new BigDecimal(number);

    }

    public static double add(double num1, double num2) {

        BigDecimal first = getBigDecimal(num1);

        BigDecimal second = getBigDecimal(num2);

        return first.add(second).doubleValue();

    }

    public static double subtract(double num1, double num2) {

        BigDecimal first = getBigDecimal(num1);

        BigDecimal second = getBigDecimal(num2);

        return first.subtract(second).doubleValue();

    }

    public static double multiply(double num1, double num2) {

        BigDecimal first = getBigDecimal(num1);

        BigDecimal second = getBigDecimal(num2);

        return first.multiply(second).doubleValue();

    }

    public static double divide(double num1, double num2) {

        BigDecimal first = getBigDecimal(num1);

        BigDecimal second = getBigDecimal(num2);

        return first.divide(second,3,BigDecimal.ROUND_HALF_UP).doubleValue();

    }

}

发布了18 篇原创文章 · 获赞 3 · 访问量 1068

猜你喜欢

转载自blog.csdn.net/hjh_cos/article/details/99622036