| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
fp34
11年前发布

java版计算器

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;     }    }   }    }