[Java小程序] 實現簡單計算器

     這學期沒事學了一點點Java,想寫個程序練手,因爲只學了一點點,所以暫時只能先寫個實現簡單功能的計算器練練。感覺寫完後不是很好,如果路過的哪位高手給點建議,小弟萬分感激啊。

       由於期末來了,沒太多時間,所以暫時就實現最簡單的功能,等考試結束有時間再搗騰吧。

       個人不喜歡用大量文字記敘程序,而且該程序也相對簡單,所以直接畫了張程序框架圖,再配合代碼的註釋,就明白程序的原理了。



圖 計算器程序框架

代碼如下:

package tst.jframe;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.SwingConstants;
public class javaAP {
      
    /**
     * 各控件對象的建立
     *
     * */
    private JFrame frame;
    private JTextField result;
    private JButton button_1;
    private JButton button_2;
    private JButton button_3;
    private JButton button_4;
    private JButton button_5;
    private JButton button_6;
    private JButton button_7;
    private JButton button_8;
    private JButton button_9;
    private JButton button_0;
    private JButton Button_equal;
    private JButton button_dot;
    private JButton button_d0;
    private JButton button_plus;
    private JButton button_sub;
    private JButton button_clr;
    private JButton button_dlt;
    private JButton button_mul;
    private JButton button_div;
      
    /**
     * 幾個變量,用於計算、判定,存放結構等。
     * */
    private boolean numflag = false;     //用於標識是否輸入數字
    private boolean opflag = false;      //用於標識是否輸入運算操作符
    private String txt = null;           //顯示結果的文本框的文本內容,用於存放計算結果的字符串形式
    private String num_txt = "";         //每次輸入一個數,以字符的形式加到該字符創變量,後面運算直接將該字符創轉成double類型進行運算
    private String op = " ";             //存放輸入的運算操作符
    private double num1 = 0;             //num1和num2用作運算   
    private double num2 = 0;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    javaAP window = new javaAP();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     *  調用控件初始化函數,創建程序。
     */
    public javaAP() {
        initialize();
    }
      
    /**
     * 初始化計算器的各個控件。
     */
    private void initialize() {
        frame = new JFrame();                                   //-----------------------------------------------
        frame.setResizable(false);                              //
        frame.setBounds(100, 100, 371, 371);                    //  窗口各個屬性的初始化
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //
        frame.getContentPane().setLayout(null);                 //-----------------------------------------------
          
        result = new JTextField();                              //-----------------------------------------------
        result.setFont(new Font("Lao UI", Font.BOLD, 15));      //
        result.setHorizontalAlignment(SwingConstants.RIGHT);    //
        result.setBounds(29, 28, 308, 50);                      //  顯示結果的文本框的各個屬性的初始化
        frame.getContentPane().add(result);                     //
        result.setColumns(10);                                  //
        result.setText(txt);                                    //-----------------------------------------------
          
          
        /**
         * 0-9, 小數點,00 各個控件的初始化,給每個控件添加動作監聽事件,每個控件被按下則調用numBtnAction函數。
         *
         * */
          
        button_0 = new JButton("0");
        button_0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("0");
            }
        });
        button_0.setBounds(99, 273, 50, 50);
        frame.getContentPane().add(button_0);
          
        button_1 = new JButton("1");
        button_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                    numBtnAction("1");
            }
        });
        button_1.setBounds(99, 213, 50, 50);
        frame.getContentPane().add(button_1);
          
        button_2 = new JButton("2");
        button_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                    numBtnAction("2");
            }
        });
        button_2.setBounds(159, 213, 50, 50);
        frame.getContentPane().add(button_2);
          
        button_3 = new JButton("3");
        button_3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("3");
            }
        });
        button_3.setBounds(219, 213, 50, 50);
        frame.getContentPane().add(button_3);
          
        button_4 = new JButton("4");
        button_4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("4");
            }
        });
        button_4.setBounds(99, 157, 50, 50);
        frame.getContentPane().add(button_4);
          
        button_5 = new JButton("5");
        button_5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("5");
            }
        });
        button_5.setBounds(159, 157, 50, 50);
        frame.getContentPane().add(button_5);
          
        button_6 = new JButton("6");
        button_6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("6");
            }
        });
        button_6.setBounds(219, 157, 50, 50);
        frame.getContentPane().add(button_6);
          
        button_7 = new JButton("7");
        button_7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("7");
            }
        });
        button_7.setBounds(99, 97, 50, 50);
        frame.getContentPane().add(button_7);
          
        button_8 = new JButton("8");
        button_8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("8");
            }
        });
        button_8.setBounds(159, 97, 50, 50);
        frame.getContentPane().add(button_8);
          
        button_9 = new JButton("9");
        button_9.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("9");
            }
        });
        button_9.setBounds(219, 97, 50, 50);
        frame.getContentPane().add(button_9);
                  
        button_dot = new JButton(".");
        button_dot.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction(".");
            }
        });
        button_dot.setFont(new Font("宋體", Font.BOLD, 15));
        button_dot.setBounds(159, 273, 50, 50);
        frame.getContentPane().add(button_dot);
          
        button_d0 = new JButton("00");
        button_d0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                numBtnAction("00");
            }
        });
        button_d0.setBounds(219, 273, 50, 50);
        frame.getContentPane().add(button_d0);
          
        /**
         * 運算符  =,+,-,*,/ 的初始化。
         * */
          
        Button_equal = new JButton("=");
        Button_equal.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(opflag == true){
                    num2 = Double.parseDouble(num_txt);  //如果此時opflag爲true的話,證明已經輸入運算符,這時候剛輸入的數爲另外一個操作數,所以賦給num2。
                    calc(op);                           //num1和num2進行運算。
                }
                result.setText(new Double(num1).toString());   //顯示結果。
            }
        });
        Button_equal.setBounds(279, 213, 50, 110);
        frame.getContentPane().add(Button_equal);
          
        button_plus = new JButton("+");
        button_plus.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                opBtnAction("+");
            }
        });
        button_plus.setBounds(279, 97, 50, 50);
        frame.getContentPane().add(button_plus);
          
        button_sub = new JButton("-");
        button_sub.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                opBtnAction("-");
            }
        });
        button_sub.setBounds(279, 157, 50, 50);
        frame.getContentPane().add(button_sub);
          
        button_mul = new JButton("*");
        button_mul.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                opBtnAction("*");
            }
        });
        button_mul.setBounds(39, 157, 50, 50);
        frame.getContentPane().add(button_mul);
          
        button_div = new JButton("/");
        button_div.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                opBtnAction("/");
            }
        });
        button_div.setBounds(39, 97, 50, 50);
        frame.getContentPane().add(button_div);
          
        /**
         * 功能鍵clr:清空   和  dlt回刪   兩個按鍵的初始化。
         *
         * */
          
        button_clr = new JButton("clr");
        button_clr.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                result.setText(null);                           //清楚文本框和num_txt,num1和num2全部置爲0,
                txt = null;                                     //numflag和opflag均置爲false,全部置爲程序開始的默認值。
                numflag = opflag = false;
                num1 = num2 = 0;
                num_txt = "";
            }
        });
        button_clr.setBounds(39, 273, 50, 50);
        frame.getContentPane().add(button_clr);
          
        button_dlt = new JButton("dlt");
        button_dlt.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(num_txt != "" && num_txt.length() > 0) {
                    num_txt = num_txt.substring(0, num_txt.length() - 1);  //通過截取字符串的方式回刪一個字符
                }
                if(txt != null && txt.length() > 0) {
                    txt = result.getText().substring(0,txt.length() - 1);  //結果文本框的回刪
                    result.setText(txt);
                }
            }
        });
        button_dlt.setBounds(39, 213, 50, 50);
        frame.getContentPane().add(button_dlt);
              
    }
      
    /**
     * 每個數字按鍵按下後觸發的功能。
     *
     * @param num 傳入字符串形式的數字
     *
     * */
    private void numBtnAction(String num) {
        if(num_txt == "" && opflag == false) {    //判斷是否num_txt是否爲空,opflag是否爲false,若滿足這兩個
            result.setText(null);                 //條件,則爲一次運算完畢,切新運算不以該次結果繼續做運算。
            num_txt = "";
        }  
        numflag = true;                           //只要輸入一個數,則把numflag置爲true,表示已有數字輸入
        num_txt += num;                           //把輸入的數加入到最終要轉換成都double運算的字符串
        txt = result.getText() + num;             //加到txt,使輸入的數顯示到文本框中。
        result.setText(txt);
          
    }
      
    /**
     * 點下運算符鍵觸發的動作
     *
     * @param operator 點擊的運算符
     *
     * */
    private void opBtnAction(String operator) {
          
        if(opflag == false && num_txt != "") {    //進行判斷,如果opflag爲false,則表示還沒輸入運算符,                                
            num1 = Double.parseDouble(num_txt);   //這個時候把num_txt轉換成double賦給num1。
        }
        if(opflag == true && num_txt != ""){
            num2 = Double.parseDouble(num_txt);   //如果opflag爲true,表示第一個數輸入完畢,且已輸入相應的運算符,這個時候是在輸入第二個要參與運算的數,則加到num2
            calc(op);                             //先計算兩數結果,賦給num1,num2置爲0,以便後面多層混合運算使用。
        }
        numflag = false;                          //numflag置爲0,表示當前需要輸入數進行運算
        op = operator;                            //把新輸入的運算符賦給op
        result.setText(operator + " ");           //在文本框顯示
        opflag = true;                            //opflag置爲true,表示當前已輸入一個或多個操作數。
        num_txt = "";                             //num_txt置爲空,爲了存儲下一個操作數。
    }
      
    /**
     * 進行  +、-、*、/ 的運算
     * @param op 運算符
     *
     * */
    private void calc(String op) {
        switch(op){
        case "+" :
                   num1 = num1 + num2;
                   num2 = 0;
                   opflag = false;
                   num_txt = "";
                   break;
                     
        case "-" :
                   num1 = num1 - num2;
                   num2 = 0;
                   opflag = false;
                   num_txt = "";
                   break;
                     
        case "*" :
                    if(num2 != 0) {
                        num1 = num1 * num2;
                        num2 = 0;
                        opflag = false;
                        num_txt = "";
                    }
                    break;
                      
        case "/" :
                    if(num2 != 0) {
                        num1 = num1 / num2;
                        num2 = 0;
                        opflag = false;
                        num_txt = "";
                    }  
                    break;
                      
        default:   opflag = false;
                   num_txt = "";
                   break;
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章