首页 > 代码库 > java swing 计算器

java swing 计算器

package calc;

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(new BorderLayout());



       // 设置窗口位置


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


       // 添加计算器按钮面板


       myPanel = new MyPanel();


       this.add(myPanel, BorderLayout.CENTER);


       // 窗口配置


       this.setTitle("java版计算器");


       this.validate();


       this.setResizable(false);


       this.setVisible(true);


       this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

   }



   public static void main(String[] args) {


       new Calculator();


   }



   /**


    * 计算器按钮面板类


    */


   class MyPanel extends JPanel implements ActionListener {



 private static final long serialVersionUID = 1L;


 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;


           }


       }


   }



}


本文出自 “cto” 博客,请务必保留此出处http://8200037.blog.51cto.com/8190037/1408900