java版計算器

fp34 9年前發布 | 2K 次閱讀 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; // 用于標記是否進行連續操作(例如按鍵順序為“99====”,第一次等于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;
        
        } } }

} </pre>

 本文由用戶 fp34 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!