Java計算器V2.0

1.0版的計算器使用中發現了大量bug,比如數字大計算會溢出等,故經過改進後發佈2.0版本如下:
先上效果圖
這裏寫圖片描述

代碼如下:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

class Ans {
    private String num1 = "", num2 = ""; // num1、num2分別表示輸入的第1、2個數,計算結果將刷新num1
    // 賦值與返回num1 num2

    public String getNum1() {
        return num1;
    }

    public void setNum1(String num1) {
        this.num1 = num1;
    }

    public String getNum2() {
        return num2;
    }

    public void setNum2(String num2) {
        this.num2 = num2;
    }



    // 判斷進行了什麼運算
    private int operation = 0,equals=0;//運算符   是否按過等號

    public int getOperation() {
        return operation;
    }

    public void setOperation(int operation) {
        this.operation = operation;
    }

    public int getEquals() {
        return equals;
    }

    public void setEquals(int equals) {
        this.equals = equals;
    }




}

public class MyCalculator {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MyCalculator window = new MyCalculator();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public MyCalculator() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
        double scrh = ScreenSize.getHeight(), scrw = ScreenSize.getWidth();
        int frameh = 307, framew = 450;

        frame = new JFrame();
        frame.setTitle("計算器");
        frame.setBounds((int) (scrw - framew) / 2, (int) (scrh - frameh) / 2, frameh, framew);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(null);
        frame.setContentPane(panel);

        JMenuBar bar = new JMenuBar();
        frame.setJMenuBar(bar);

        JMenu caidan = new JMenu("菜單");
        bar.add(caidan);

        JMenuItem exit = new JMenuItem("退出");
        caidan.add(exit);
        exit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int xz = JOptionPane.showConfirmDialog(frame, "要退出計算器嗎?", "確定退出", JOptionPane.YES_NO_OPTION);
                if (xz == 0)
                    System.exit(0);
            }
        });

        JMenu bangzhu = new JMenu("幫助");
        bar.add(bangzhu);

        JMenuItem sm=new JMenuItem("說明");
        bangzhu.add(sm);
        sm.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String shuoming="Ⅰ.每次運算以等號結束,連續按等號可以連續運算,但按等號後不按數字按運算符無效\nⅡ.最高精確到小數點後16位,數字不要超過10^99999\nⅢ.正負號按鈕和百分號運算均不會結束一次運算";
                JOptionPane.showMessageDialog(frame, shuoming,"操作說明",JOptionPane.PLAIN_MESSAGE);}
        });

        JMenuItem gy = new JMenuItem("關於");
        bangzhu.add(gy);
        gy.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "軟件名:計算器\n版本號:2.0\n製作時間:2017年4月16日\n製作人:muyangren907\n          軟件持續更新完善中,敬請期待", "版權信息",
                        JOptionPane.PLAIN_MESSAGE);
            }
        });

        JButton[] button = new JButton[10];
        int j = 0, k = 0;
        for (int i = 1; i < 10; i++) {
            button[i] = new JButton(String.valueOf(i));
            button[i].setBackground(Color.LIGHT_GRAY);
            button[i].setBounds(50 + 50 * k, 220 - 50 * j, 50, 50);
            k++;
            if (k == 3) {
                j++;
                k = 0;
            }
            panel.add(button[i]);
        }

        button[0] = new JButton("0");
        button[0].setBackground(Color.LIGHT_GRAY);
        button[0].setBounds(50, 270, 100, 50);
        panel.add(button[0]);

        JButton buttondot = new JButton(".");
        buttondot.setBackground(Color.LIGHT_GRAY);
        buttondot.setBounds(150, 270, 50, 50);
        panel.add(buttondot);

        JButton buttonadd = new JButton("+");
        buttonadd.setBackground(Color.LIGHT_GRAY);
        buttonadd.setBounds(200, 220, 50, 50);
        panel.add(buttonadd);

        JButton buttonminus = new JButton("-");
        buttonminus.setBackground(Color.LIGHT_GRAY);
        buttonminus.setBounds(200, 170, 50, 50);
        panel.add(buttonminus);

        JButton buttonmultiply = new JButton("×");
        buttonmultiply.setBackground(Color.LIGHT_GRAY);
        buttonmultiply.setBounds(200, 120, 50, 50);
        panel.add(buttonmultiply);

        JButton buttondivide = new JButton("÷");
        buttondivide.setBackground(Color.LIGHT_GRAY);
        buttondivide.setBounds(200, 70, 50, 50);
        panel.add(buttondivide);

        JButton buttonequals = new JButton("=");
        buttonequals.setBackground(Color.LIGHT_GRAY);
        buttonequals.setBounds(200, 270, 50, 50);
        panel.add(buttonequals);

        JButton buttonac = new JButton("AC");
        buttonac.setBackground(Color.LIGHT_GRAY);
        buttonac.setBounds(50, 70, 50, 50);
        panel.add(buttonac);

        JButton buttonzf = new JButton("+/-");
        buttonzf.setBackground(Color.LIGHT_GRAY);
        buttonzf.setBounds(100, 70, 50, 50);
        panel.add(buttonzf);

        JButton buttonbfh = new JButton("%");
        buttonbfh.setBackground(Color.LIGHT_GRAY);
        buttonbfh.setBounds(150, 70, 50, 50);
        panel.add(buttonbfh);

        JLabel labelans = new JLabel("0");
        labelans.setHorizontalAlignment(SwingConstants.RIGHT);
        labelans.setBounds(50, 20, 200, 50);
        panel.add(labelans);

        Ans ans = new Ans();//創建答案對象

        //以下爲按鈕動作監聽

        button[0].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    if(ans.getNum1().charAt(0)=='0'&&ans.getNum1().indexOf(".")==-1){                       
                    }
                    else{
                        ans.setNum1(ans.getNum1()+"0");
                    }
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"0");
                    labelans.setText(ans.getNum2());
                }
            }
        });

        button[1].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"1");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"1");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[2].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"2");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"2");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[3].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"3");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"3");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[4].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"4");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"4");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[5].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"5");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"5");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[6].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"6");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"6");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[7].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"7");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"7");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[8].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"8");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"8");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        button[9].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()!=0){
                    ans.setNum1("");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                }
                if(ans.getOperation()==0){
                    ans.setNum1(ans.getNum1()+"9");
                    labelans.setText(ans.getNum1());
                }else{
                    ans.setNum2(ans.getNum2()+"9");
                    labelans.setText(ans.getNum2());
                }

            }
        });

        //"."按鈕
        buttondot.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(ans.getEquals()==0){
                    if (ans.getOperation() == 0) {
                        if (ans.getNum1().indexOf(".") == -1)
                            ans.setNum1(ans.getNum1() + ".");
                        labelans.setText(ans.getNum1());
                    } else {
                        if (ans.getNum2().indexOf(".") == -1)
                            ans.setNum2(ans.getNum2() + ".");
                        labelans.setText(ans.getNum2());
                    }   
                }else{
                    ans.setNum1("0.");
                    ans.setNum2("");
                    ans.setOperation(0);
                    ans.setEquals(0);
                    labelans.setText(ans.getNum1());
                }

            }
        });

    //"+-*/"
    buttonadd.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            ans.setOperation(1);
            labelans.setText("+");
        }
    });
    buttonminus.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            ans.setOperation(2);
            labelans.setText("-");
        }
    });
    buttonmultiply.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            ans.setOperation(3);
            labelans.setText("×");
        }
    }); 
    buttondivide.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            ans.setOperation(4);
            labelans.setText("÷");
        }
    });

    //"="的動作監聽
    buttonequals.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                ans.setEquals(1);
                if (ans.getNum1().equals(""))
                    ans.setNum1("0");
                if (ans.getNum2().equals(""))
                    ans.setNum2("0");

                BigDecimal b1 = new BigDecimal(ans.getNum1()).stripTrailingZeros(); // 去除末尾多餘的0
                BigDecimal b2 = new BigDecimal(ans.getNum2()).stripTrailingZeros();
                ans.setNum1(b1.toPlainString());
                ans.setNum2(b2.toPlainString()); // 防止科學記數法輸出

                DecimalFormat df = new DecimalFormat();
                String style = "0.00000000000E00000";
                df.applyPattern(style);

                if (ans.getOperation() == 1) {
                    if (b1.add(b2).toPlainString().length() <= 27)
                        ans.setNum1(b1.add(b2).toPlainString());
                    else
                        ans.setNum1(df.format(b1.add(b2)));              //科學計數法
                } else if (ans.getOperation() == 2) {
                    if (b1.subtract(b2).toPlainString().length() <= 27)
                        ans.setNum1(b1.subtract(b2).toPlainString());
                    else
                        ans.setNum1(df.format(b1.subtract(b2)));
                } else if (ans.getOperation() == 3) {
                    if (b1.multiply(b2).toPlainString().length() <= 27)
                        ans.setNum1(b1.multiply(b2).toPlainString());
                    else
                        ans.setNum1(df.format(b1.multiply(b2)));
                } else if (ans.getOperation() == 4) {
                    if(b1.divide(b2, 16, RoundingMode.HALF_UP).toPlainString().length() <= 27)
                    ans.setNum1(b1.divide(b2, 16, RoundingMode.HALF_UP).toPlainString());
                    else
                        ans.setNum1(df.format(b1.divide(b2, 16, RoundingMode.HALF_UP)));
                }

                labelans.setText(ans.getNum1().replace("E", "×10^"));

            }
    });

    buttonac.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ans.setNum1("");
            ans.setNum2("");
            ans.equals(0);
            ans.setOperation(0);
            labelans.setText("0");
        }
    });

    buttonbfh.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                BigDecimal b1 = new BigDecimal(ans.getNum1()).stripTrailingZeros(); // 去除末尾多餘的0
                BigDecimal b2 = new BigDecimal("100").stripTrailingZeros();
                ans.setNum1(b1.toPlainString()); // 防止科學記數法輸出

                DecimalFormat df = new DecimalFormat();
                String style = "0.0000E00";
                df.applyPattern(style);
                if (b1.divide(b2, 16, RoundingMode.HALF_UP).toPlainString().length() <= 27)
                    ans.setNum1(b1.divide(b2, 16, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString());
                else
                    ans.setNum1(df.format(b1.divide(b2, 16, RoundingMode.HALF_UP).stripTrailingZeros()));
                labelans.setText(ans.getNum1().replace("E", "×10^"));
            }
    });

    buttonzf.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if(ans.getOperation()==0){
                if(ans.getNum1().indexOf("-")==-1)
                    ans.setNum1("-"+ans.getNum1());
                labelans.setText(ans.getNum1().replace("E", "×10^"));
            }else{
                if(ans.getNum2().indexOf("-")==-1)
                    ans.setNum2("-"+ans.getNum2());
                labelans.setText(ans.getNum2().replace("E", "×10^"));
            }


        }
    });
        //end
    }

}

104行改爲

frame.setType(Type.UTILITY);

貌似比較好看

源碼及打包生成的jar及exe文件均已上傳至網盤(2.0爲本計算器)
鏈接: https://pan.baidu.com/s/1skQnqhf
密碼: 牛B
僅供交流,引用請註明作者

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章