學習實驗樓課程:Java實現簡單計算器(三)

整體代碼如下:

package kant.learning;

//其實我不太清楚需要用到哪些包,因此,都是用到了之后再點擊導入的;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MyCalculator {
    /*基本參數定義并初始化*/
    float ans = 0;                  //用于存儲答案,初始為0;
    String ans_dis = "0";           //用于存儲顯示字段,初始為“0”;
    float tmp = 0;                  //用于存儲輸入,初始為0;
    String act = "+";               //用于存儲符號,默認為“+”;
    int arg_point = 0;              //判斷是否在小數點之后,默認為0,即不在小數點后;
    static int arg_mtinput1 = 10;   //如果不在小數點后,多次輸入處理時使用的常數,處理方式為 tmp = tmp * 10 + new_input,這個參數其實不需要,寫出來方便解釋,如果必要,可以用來調整進制;
    float arg_mtinput2 = 1;         //如果在小數點后,多次輸入處理時使用的變量,arg = arg / 10,tem = tem + new_input * arg;
    
    /*創建UI組件*/
    JFrame calFrame = new JFrame("cal");
    JTextField ansField = new JTextField(ans_dis, 20);  //用于顯示答案的文本框,第一個參數是顯示的對象,第二個參數是文本框顯示的列數(長度);
    
    JButton button_0 = new JButton("0");    //參數為按鈕上顯示的內容;
    JButton button_1 = new JButton("1");
    JButton button_2 = new JButton("2");
    JButton button_3 = new JButton("3");
    JButton button_4 = new JButton("4");
    JButton button_5 = new JButton("5");
    JButton button_6 = new JButton("6");
    JButton button_7 = new JButton("7");
    JButton button_8 = new JButton("8");
    JButton button_9 = new JButton("9");
    JButton button_point = new JButton(".");
    JButton button_mtp = new JButton("*");
    JButton button_div = new JButton("/");
    JButton button_add = new JButton("+");
    JButton button_sub = new JButton("-");
    JButton button_eql = new JButton("=");
    JButton button_clear = new JButton("clear");
    
    /*MyCalculator的構造器*/
    public MyCalculator() {
        /*第一步,先把界面做出來*/
        //創建容器,將UI組建放上去
        JPanel pan = new JPanel();
        pan.setLayout(new GridLayout(4,4,5,5));                     //GridLayout是一個矩陣式布局的控件,用處很大,這里創建一個控件,四個參數分別為行數、列數、橫向間隔、縱向間隔;
        pan.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));    //設置四邊邊距;
        
        pan.add(button_7);
        pan.add(button_8);
        pan.add(button_9);
        pan.add(button_div);
        pan.add(button_4);
        pan.add(button_5);
        pan.add(button_6);
        pan.add(button_mtp);
        pan.add(button_1);
        pan.add(button_2);
        pan.add(button_3);
        pan.add(button_sub);
        pan.add(button_0);
        pan.add(button_point);
        pan.add(button_eql);
        pan.add(button_add);
        
        JPanel pan_up = new JPanel();
        pan_up.setLayout(new BorderLayout());                       //BorderLayout也是一個布局管理器,只有東南西北中五種位置,默認為中間;
        pan_up.setBorder(BorderFactory.createEmptyBorder(10,5,5,5));
        ansField.setHorizontalAlignment(JTextField.RIGHT);
        pan_up.add(ansField, BorderLayout.NORTH);
        pan_up.add(button_clear, BorderLayout.SOUTH);
        pan_up.add(button_clear, BorderLayout.EAST);                //這邊可以看到,可以重疊使用,即同時靠下并靠右;
        
        //界面設置
        calFrame.setLocation(500, 300);                             //設置窗口在屏幕上的位置;
        calFrame.setResizable(true);                                //設置大小可調整;
        calFrame.getContentPane().setLayout(new BorderLayout());
        calFrame.getContentPane().add(pan_up, BorderLayout.NORTH);
        calFrame.getContentPane().add(pan, BorderLayout.CENTER);
        calFrame.pack();                                            //記得整體打包;
        calFrame.setVisible(true);
        //增加窗口關閉時退出程序的動作,否則不會自動退出
        calFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        /*處理計算邏輯*/
        
        //如果輸入的是數字
        class LisnNum implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                
                //取得輸入值文本;
                String inputTmp = ((JButton) e.getSource()).getText();
                
                //如果之前沒有小數點;
                if(arg_point == 0) {
                    //將輸入的文本轉換為數字;
                    tmp = tmp * arg_mtinput1 + Integer.parseInt(inputTmp);
                    
                    //調整顯示器的顯示內容;
                    //因為一開始有設定一個0,就沒法直接在后面接上輸入的數字,多了一個判斷;
                    if(ans_dis.equals("0"))
                        ans_dis = inputTmp;
                    else
                        ans_dis = ans_dis + inputTmp;
                    ansField.setText(ans_dis);
                }
                
                //如果還在小數點后的輸入狀態;
                else {
                    arg_mtinput2 = arg_mtinput2 / arg_mtinput1;
                    tmp = Integer.parseInt(inputTmp) * arg_mtinput2 + tmp;
                    ans_dis = Float.toString(tmp);
                    ansField.setText(ans_dis);
                }
            }
        }
        
        //如果輸入的是小數點
        class LisnPoint implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                arg_point = 1;
                ans_dis = ans_dis + ".";
                ansField.setText(ans_dis);
            }
        }
        
        //如果輸入的是符號
        class LisnSign implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                //計算上一步的答案;
                if(act.equals("+"))
                    ans = ans + tmp;
                if(act.equals("-"))
                    ans = ans - tmp;
                if(act.equals("*"))
                    ans = ans * tmp;
                if(act.equals("/"))
                    ans = ans / tmp;
                
                //輸入暫存復位為0;
                tmp = 0;
                //小數點復位為0,即之后的輸入沒有小數點;
                arg_point = 0;
                arg_mtinput2 = 1;
                //下一步計算的符號為當前輸入的符號;
                act = ((JButton) e.getSource()).getText();  
                
                ans_dis = Float.toString(ans) + act;
                ansField.setText(ans_dis);
                
            }
        }
        
        //如果輸入的是等于號
        class LisnEql implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(act.equals("+"))
                    ans = ans + tmp;
                if(act.equals("-"))
                    ans = ans - tmp;
                if(act.equals("*"))
                    ans = ans * tmp;
                if(act.equals("/"))
                    ans = ans / tmp;
                
                ans_dis = Float.toString(ans);
                ansField.setText(ans_dis);
                
                tmp = 0;
                act = "+";
                arg_point = 0;
                arg_mtinput2 = 1;
            }
        }
        
        //如果輸入的是clear
        class LisnClear implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                //各參數復位;
                ans = 0;
                ans_dis = "0";
                tmp = 0;
                act = "+";
                arg_point = 0;
                arg_mtinput1 = 10;
                arg_mtinput2 = 1;
                ansField.setText(ans_dis);
            }
        }
        
        /*構建運算所需的實體,綁定按鈕與運算邏輯*/
        LisnNum lisnNum = new LisnNum();
        LisnPoint lisnPoint = new LisnPoint();
        LisnSign lisnSign = new LisnSign();
        LisnEql lisnEql = new LisnEql();
        LisnClear lisnClear = new LisnClear();
        
        button_0.addActionListener(lisnNum);
        button_1.addActionListener(lisnNum);
        button_2.addActionListener(lisnNum);
        button_3.addActionListener(lisnNum);
        button_4.addActionListener(lisnNum);
        button_5.addActionListener(lisnNum);
        button_6.addActionListener(lisnNum);
        button_7.addActionListener(lisnNum);
        button_8.addActionListener(lisnNum);
        button_9.addActionListener(lisnNum);
        button_point.addActionListener(lisnPoint);
        button_div.addActionListener(lisnSign);
        button_mtp.addActionListener(lisnSign);
        button_add.addActionListener(lisnSign);
        button_sub.addActionListener(lisnSign);
        button_eql.addActionListener(lisnEql);
        button_clear.addActionListener(lisnClear);  
    }
    
    /*主函數*/
    public static void main(String[] args) {
        /*構建一個計算器實體*/
        MyCalculator calculator = new MyCalculator();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容