计算器DEMO

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StillOnMyWay/article/details/76652545
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Arrays;
import java.lang.StringBuilder;

/**
* @version 1.0
* @author Sam 
*
*
*/

/*
    三个问题:
        1. 累加等运算功能还没做

        2. 结果会自动保留一位小数,如 2 * 3 = 6.0

        3. 2.3 * 3.2 = 7.359999999  这种会出现很多位,
            应该是string和double类型转换导致的
*/


class CalculatorDemo {
    private Frame mainFrame;    //顶层容器
    private Panel numPanel;     //中间的按钮容器
    private JTextField tf;          //上方的文字域
    private Panel funcPanel;    //功能按键  
    private double num1;            //第一个数字
    private double num2;            //第二个数字
    private int operator;       //运算符
    private String result = ""; //显示结果

    CalculatorDemo () {
        initi();
    }

    private void initi() {
        mainFrame = new Frame("高仿计算器");
        mainFrame.setBounds(300,200,300,200);

        numPanel = new Panel(new GridLayout(4,4,5,5));      //数字和运算符区域
        funcPanel = new Panel(new GridLayout(4,4,5,20));  //功能按键区域
        tf = new JTextField();                                                  //文本域
        tf.setEditable(false);                                                      //文本域不可输入
        tf.setBackground(Color.WHITE);                                      //背景色变白
        tf.setHorizontalAlignment(JTextField.RIGHT);        //文字从右侧输入
        addButton();                                                                // 添加按钮和事件

        // 设定各个组件位置
        mainFrame.setLayout(new BorderLayout());
        mainFrame.add(tf, BorderLayout.NORTH);
        mainFrame.add(numPanel, BorderLayout.CENTER);
        mainFrame.add(funcPanel,BorderLayout.EAST);



        addEvent();                                       //注册窗体事件
        mainFrame.setResizable(false);
        mainFrame.setVisible(true);
    }

    private void addEvent() {
        mainFrame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e) {
                System.exit(0);                                                             //点击 X 退出
            }
        });
    }

    //循环添加button,排版好
    private void addButton() {

        Button del = new Button("退格");
        Button renew = new Button("复位");
        funcPanel.add(del);
        funcPanel.add(renew);

        renew.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = "";
                num1 = 0;
                num2 = 0;
                tf.setText(result);
            }
        });

        del.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                StringBuilder sb = new StringBuilder(result);
                // int i = result.length();
                // char[] chr = new char[i-1];
                // chr = result.toCharArray();
                // chr = chr.dele
                // result = Arrays.toString(chr);
                int i = sb.length();
                if (i - 1 >= 0 ) {
                    sb.deleteCharAt(i -1);
                    result = sb.toString();
                    tf.setText(result);
                } else {
                    result = "";
                    tf.setText(result);
                }
            }
        });

        String[] str = {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
        Button[] btn = new Button[str.length];

        for (int i = 0; i < str.length; i++ ) {
            btn[i] = new Button(str[i]);
            numPanel.add(btn[i]);   
        }

        btn[0].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "7";
                tf.setText(result);
            }
        });

        btn[1].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "8";
                tf.setText(result);
            }
        });

        btn[2].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "9";
                tf.setText(result);
            }
        });

        btn[4].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "4";
                tf.setText(result);
            }
        });

        btn[5].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "5";
                tf.setText(result);
            }
        });

        btn[6].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "6";
                tf.setText(result);
            }
        });

        btn[8].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "1";
                tf.setText(result);
            }
        });

        btn[9].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "2";
                tf.setText(result);
            }
        });

        btn[10].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "3";
                tf.setText(result);
            }
        });

        btn[12].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + "0";
                tf.setText(result);
            }
        });


        // 下标3,7,11,15为运算符,按下运算符的时候,记录下第一个数字
        btn[3].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (result != "") {
                    num1 = Double.parseDouble(result);
                }   
                result = "";
                operator = 1;
                tf.setText("+");
            }
        });

        btn[7].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (result != "") {
                    num1 = Double.parseDouble(result);
                }
                result = "";
                operator = 2;
                tf.setText("-");
            }
        });

        btn[11].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (result != "") {
                    num1 = Double.parseDouble(result);
                }   
                result = "";
                operator = 3;
                tf.setText("*");
            }
        });

        btn[15].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (result != "") {
                    num1 = Double.parseDouble(result);
                }
                result = "";
                operator = 4;
                tf.setText("/");
            }
        });


        // 按下等号之前,记录第二个数字
        btn[14].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {                
                if (result != "") {
                    num2 = Double.parseDouble(result);
                }   
                double d = calcul(num1,num2);               
                result = String.valueOf(d);
                tf.setText(result);
                result = "";
            }
        });

        btn[13].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                result = result + ".";
                tf.setText(result);
            }
        });
    }

    // 计算方法单独封装,便于以后添加其他方法
    private double calcul(double num1, double num2) {
        double d = 0;
        switch (operator) {
            case 1: 
                d = num1 + num2;
                break;
            case 2:
                d = num1 - num2;
                break;
            case 3:
                d = num1 * num2;
                break;
            case 4:
                d = num1 / num2;
                break;  
        }
        return d;
    }

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

猜你喜欢

转载自blog.csdn.net/StillOnMyWay/article/details/76652545