JAVA----計算器

前言

學習了 JAVA 的 Swing 編程,不由得興趣做了一個計算器,其中也參考了網上的一些例子,再加上自己的一些想法,花了大概半天的時間總算做出來了,總體來說,寫計算器的邏輯還是讓人受益匪淺的。

由於在代碼中我大部分做了註釋,在這裏就不多說了

package calcutor;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import java.util.*;
/**
 * 計算器
 * @author Mr.W
 * @version 1.0
 */
//聲明:沒有按到等於號的運算稱爲連續運算
 class CalculatorTest implements ActionListener
{    

     JFrame f = new JFrame("計算器");
     JTextField tf = new JTextField();
     Press press = null;
    //初始化窗口,構建計算器界面
    public void init()
    {

     JPanel p1 = new JPanel();//此面板放置文本框和清除按鈕

     Container ct = f.getContentPane();
     //文本框的處理
     tf.setPreferredSize(new Dimension(195,50));//設置文本框的理想大小
     tf.setHorizontalAlignment(JTextField.RIGHT);//設置文本的水平右對齊
     p1.add(tf);

     //清除按鈕
     JButton C = new JButton("CE");
     C.addActionListener(this);
     C.setPreferredSize(new Dimension(69,50));
     p1.add(C);
     //將畫板放置在最上面,北面
     ct.add(p1,"North");

     JPanel p2 = new JPanel();  
     ct.add(p2,"Center");

     GridLayout c = new GridLayout(5,4); //網格佈局           
     p2.setLayout(c); 
     //按鈕的字符
     String[] str ={
                    "sqrt","^","1/x","+/-",
                    "1", "2", "3", "+", 
                    "4", "5", "6", "-" , 
                    "7", "8", "9", "x" ,  
                    ".", "0", "=", "/"
             };
     //循環添加按鈕到網格佈局的面板中,並設置按鈕監聽器
     for(int i=0 ; i<str.length ; i++){
         JButton b = new JButton(str[i]);
         p2.add(b);
         b.addActionListener(this);
     }

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關閉窗口即關閉程序
        f.setSize(290,282);
        f.setVisible(true);//窗口可見

    }



public CalculatorTest(){

     press = new Press(tf);
      //其中v只存放四則運算操作,v2是存放所有操作
}

public void actionPerformed(ActionEvent e){
    //獲取上次的文本框內容,也就是sum的值
        String str=tf.getText(); 
        //獲得按到的鍵
        String er = e.getActionCommand();
        switch (er) {
        case "+":
            press.Pressplus(str);//加法
            break;
        case "-":
            press.PressCut(str);//減法
            break;
        case "x":
            press.PressMu(str);//乘法
            break;
        case "/":
            press.PressExc(str);//除法
            break;
        case "=":
            press.Pressequal(str);
            break;
        case "1/x":
            press.PressDown(str);
            break;
        case "^":
            press.Presspow(str);
            break;
        case "sqrt":
            press.Presssqrt(str);
            break;
        case "CE":
            press.PressCE();
            break;
        case "+/-":
            press.Pressagain(str);
            break;
        default:
            press.PressNum(er, str);
            break;
        }       
}



public static void main(String args[])
    {
        try {
            //界面風格
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
       new CalculatorTest().init();        
    }

}  
package calcutor;

import java.util.Vector;
import javax.swing.JTextField;

public class Press {
    private double sum=0;//用於盛放計算結果
    private double mark = 0;//盛放冪數
    private JTextField tf = null;

    private Vector<String> v=new Vector(1,1);//存放運算符操作
    private Vector<String> v2=new Vector(1,1);//存放所有操作


    public Press(JTextField tf){
        this.tf = tf;
        v2.addElement(new String("init"));//addElement添加到末尾且自動加1,默認未按鍵存放init
          v.addElement(new String("init"));
    }
    /*
     * 按下等於號
     */
    public void Pressequal(String str) {

             common(str);
            v.addElement(new String("="));
            v2.addElement(new String("="));             


    }
    /*
     * 按下數字鍵
     */
    public void PressNum(String e,String str){
//      if (e.equals("1") ||                       
//              e.equals("2") ||
//              e.equals("3") ||
//              e.equals("4") ||
//              e.equals("5") ||
//              e.equals("6") ||
//              e.equals("7") ||
//              e.equals("8") ||
//              e.equals("9") ||
//              e.equals("0") ||
//              e.equals(".")           
//             )                              //1,2,3,4,5,6,7,8,9,0,.的實現;
//          {     
              if(
                  //第一次是按數字或者在四則運算之後按數字,注意這裏不包括數字前面是等於號
                  ("+").equals((String)v2.lastElement()) ||
                   ("-").equals((String)v2.lastElement()) ||
                   ("x").equals((String)v2.lastElement()) ||
                   ("/").equals((String)v2.lastElement()) ||
                   ("init").equals((String)v2.lastElement())||
                   ("sqrt").equals((String)v2.lastElement()) ||
                   ("1/x").equals((String)v2.lastElement()) ||
                   ("+/-").equals((String)v2.lastElement()) ||
                   ("CE").equals((String)v2.lastElement())
                )
              {          
                  tf.setText(e.toString());
              }
              else if(("^").equals((String)v2.lastElement())){

                  tf.setText(e.toString());
                 mark = Double.parseDouble(tf.getText());

              }
            //按了等於號後置sum爲0重新開始新的計算
            else if (("=").equals((String)v2.lastElement()))
                 {
                  sum=0;
                  tf.setText(e.toString());//顯示按下的數字
                 }
            //連續按下數字則連成字符串顯示出來
              else
               {
                   tf.setText(tf.getText()+e.toString());//調用其父類中的getText()方法
                   mark = Double.parseDouble(tf.getText());

                }

                v2.addElement(new String(e.toString()));//將數字添加到向量中
         // }   
    }
    /**
     * 除法鍵
     */
    public void PressExc(String str) {    
              common(str);
              v.addElement(new String("/"));
              v2.addElement(new String("/"));              
    }
    /*
     * 按下.
     */
//  public void Presspoint(String str){
//      if((".").equals((String)v2.lastElement()
//              )
//  }
    /**
     * 公共方法
     * @param str
     */

    public void common(String str){
        //getActionCommand返回與此命令相關的字符串
        if(
           /**
            * 用戶按了倆次運算符,包括上次的等於號,
                       也就是用戶不進行連續運算時,則顯示原來的數,
                       開機第一次按鍵   或者  第二次以後按鍵運算符沒有連續此條件不走
                      例如6++
            */
           //lastELement指向最後一個元素
        ("+").equals((String)v2.lastElement()) ||
         ("-").equals((String)v2.lastElement()) ||
         ("x").equals((String)v2.lastElement()) ||
         ("/").equals((String)v2.lastElement()) ||
         ("=").equals((String)v2.lastElement()) ||
         ("sqrt").equals((String)v2.lastElement()) ||
         ("1/x").equals((String)v2.lastElement()) ||
         ("^").equals((String)v2.lastElement()) ||
         ("+/-").equals((String)v2.lastElement())
      )
        {

            tf.setText(String.valueOf(sum));
        }

        /**
        * 當第一次按鍵是+時,也只有開機第一次纔會執行此語句
        */
        else if(("init").equals((String)v2.lastElement()))
        {
            tf.setText(String.valueOf(sum));//顯示初始化的值
        }
            /**
            * 用戶進行連續運算時
            * 或者
            * 第一次按+鍵時
            * (不是開機的第一次,開機的第一次按+鍵走上面的語句初始化文本框爲0)
            * 例如 0+ 而不是+0
            */
            else
            {

                double d=Double.parseDouble(str);
                /*************!!!注意:這裏不是第一次相加***************/
                //距離上次按+沒有出現其他的三種運算即 X,/,-,可理解爲連加
                if (("+").equals((String)v.lastElement()))
                {        
                        sum=sum+d;
                        tf.setText(String.valueOf(sum));
                }
                    //距離上次按-沒有出現其他的三種運算即 X,/,+,可理解爲 先減後加
                    else if (("-").equals((String)v.lastElement()))
                    {
                        //System.out.println("我連續按了倆次運算咯");
                        sum=sum-d;
                        tf.setText(String.valueOf(sum));
                    }
                    //距離上次按x沒有出現其他的三種運算即 +,/,-,可理解爲  先乘後加
                    else if(("x").equals((String)v.lastElement()))
                    {
                      sum=sum*d;
                      tf.setText(String.valueOf(sum));
                    }
                    //距離上次按/沒有出現其他的三種運算即 X,+,-,可理解爲   先除後加
                    else if(("/").equals((String)v.lastElement()))
                    {
                              sum=sum/d;
                             tf.setText(String.valueOf(sum));
                    }
                    else if(("^").equals((String)v.lastElement()))
                    {
                        Presspow();
                    }

                    else
                    {                        
                            sum=sum+d;
                             tf.setText(String.valueOf(sum));
                     }           
          }
    }
    /*
     * 按下1/x
     */
    public void PressDown(String str){

             common(str);
             sum = 1.0/sum ;
             tf.setText(String.valueOf(sum));
            v.addElement(new String("1/x"));
            v2.addElement(new String("1/x"));              

    }
    /*
     * 按下x號
     */
    public void PressMu(String str) {


             common(str);
            v.addElement(new String("x"));
            v2.addElement(new String("x"));              

    }
    /*
     * 按下sqrt
     */
    public void Presssqrt(String str){

            common(str);
            //System.out.println(sum);
            sum = Math.sqrt(sum);
            tf.setText(String.valueOf(sum));
            v.addElement(new String("sqrt"));
            v2.addElement(new String("sqrt")); 

    }
    /*
     * 按下^號
     */
    public void Presspow(String str){

            common(str);//先獲得sum的值
            v.addElement(new String("^"));
            v2.addElement(new String("^"));

    }
    public void Presspow(){
        //System.out.println(sum+"sum=====mark"+mark);
        sum = Math.pow(sum, mark);
        tf.setText(String.valueOf(sum));

    }
    /**
     * 按下加號鍵
     */
    public void Pressplus(String str){

        common(str);
       //將分別按鍵添加到倆個向量去,
        v.addElement(new String("+"));
        v2.addElement(new String("+"));              


    }
    /*
     * 按下減號
     */
    public void PressCut(String str){

             common(str);
            v.addElement(new String("-"));
            v2.addElement(new String("-"));              

    }
    /**
     * 按下清除鍵
     */
    public void PressCE(){
            //按下了清除鍵就什麼都沒啦

                sum = 0;
                 tf.setText("0.0");
                 v.addElement(new String("CE"));
                 v2.addElement(new String("CE"));

    }
    /*
     * 按下+/-號
     */
    public void Pressagain(String str){

            common(str);
            sum =  -1.0*sum;
            tf.setText(String.valueOf(sum));
            v.addElement(new String("+/-"));
            v2.addElement(new String("+/-"));

    }


}

下面是程序運行結果哦
這裏寫圖片描述

最近有點忙可能更新博客的速度會慢了一點,但還是會繼續堅持下去的,希望每天都能進步一點點~~~

發佈了42 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章