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
仅供交流,引用请注明作者

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值