【Java課程設計】【圖形介面程式】【計算器】

2022-01-03 15:00:02

2022-1-2

【圖形介面程式----計算器】

1. 設計任務

1.1設計題目的描述

設計一個計算器應用程式,基於AWT,可以完成加法、減法、乘法、除法和取餘運算。

1.2設計要求

使用佈局管理器設計一個計算器的介面,練習使用事件監聽器處理資料的輸入,並完成加法、減法、乘法、除法和取餘運算。

2. 設計方案說明

2.1 整體設計思路

使用AWT程式設計,Frame B o r d e r L a y o u t . N O R T H BorderLayout.NORTH BorderLayout.NORTH 區域放置TextField元件,將指定為5行4列 GridLayout 佈局管理器的 Panel 放置於 Frame B o r d e r L a y o u t . C E N T E R BorderLayout.CENTER BorderLayout.CENTER 區域,其中填充操作符和運算元按鈕。

2.2 Calulation類的資料成員

double number1, number2;  							//記錄參與運算的兩個數位
String operator;									//記錄運運算元
boolean unfinishedReading;  						//記錄是否讀數完成
Frame frame = new Frame("高齊勉的計算器!");			// frame視窗物件
TextField inputBox = new TextField(30);				// inputBox 文字方塊物件
Button[] button = new Button[20];					//建立一組按鈕

2.3 Calulation類的構造方法

2.3.1設定文字方塊的位置

設定視窗的開啟位置以及視窗的長和寬

frame.setBounds(200, 200, 400, 320);

將文字方塊新增在視窗北部區域

frame.add(inputBox, BorderLayout.NORTH);

2.3.2 設定按鈕佈局

Panel panel = new Panel();
panel.setLayout(new GridLayout(5, 4, 3, 3));

Panel是內嵌式容器,必須內嵌在其它容器中使用,不能獨立存在。其預設使用FlowLayout佈局管理器。但我使用的是GridLayout網式佈局管理器,可以將區域劃分為 row*col 個小區域,GridLayout構造方法GridLayout(rows,cols,hgap,vgap)四個引數分別指定了要劃分的行、列、水平間距和垂直間距。

2.3.3 設定按鈕

String[] s = {"sqrt", "<-", "AC","%", 
				"7", "8", "9", "+", 
				"4", "5", "6", "-",
				"1", "2", "3", "*",
				"0", ".", "=", "/"};
for (int i = 0; i < s.length; i++) {
     button[i] = new Button(s[i]);//設定按鈕上的字元
     button[i].addActionListener(new ActionListen());//設定按鈕監聽
     panel.add(button[i]);//將按鈕放入Panel容器中
}

2.3.4 設定視窗可見,註冊視窗監聽

將panel設定在中部區域

frame.add(panel,BorderLayout.CENTER);

設定視窗可見

frame.setVisible(true);

視窗監聽器,註冊監聽,可以關閉視窗

frame.addWindowListener(new WindowAdapter() {	//匿名內部類
//視窗監聽器,註冊監聽,可以關閉視窗
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);			//關閉程式
    }
});

WindowAdapter介面卡實現了所有的介面方法,以空方法的形式,在其子類中只要重寫需要的就行,也是一種設計模式,介面卡模式:因為如果要實現所有介面實在太多,不方變,採用這種過渡類.

2.4 ActionListen類實現ActionListener介面

2.4.1 public void actionPerformed(ActionEvent e)

這是介面 ActionListener 裡面定義的一個抽象方法,所有實現這個介面的類都要重寫這個方法。一般情況下,這是在編寫GUI程式時,元件發生「有意義」的事件時會呼叫這個方法,比如按鈕被按下,文字方塊內輸入回車時都會觸發這個事件,然後呼叫你編寫的事件處理程式。實現過程大體如下:編寫一個 ActionListener 類的監聽器,元件註冊該監聽器,監聽器內部要編寫這個 actionPerformed 方法。

2.4.2 動作事件(ActionEvent e)

ActionEvent包含一個事件,該事件為執行動作事件ACTION_PERFORMED.觸發這個事件的動作為:
• 點選按鈕。
• 雙擊列表中選項。
• 選擇選單項。
• 在文字方塊中輸入回車。

常用方法如下:
public String getActionCommand()
返回引發某個事件的命令按鈕的名字,如果名字為空,那麼返回標籤值。
public void setActionCommand(String command)
設定引發事件的按鈕的名字,預設設定為按鈕的標籤。

2.4.3 number1 = Double.parseDouble(inputBox.getText())

Double.parseDouble方法是把數位型別的字串,轉換成double型別。

parseDouble方法得到的資料型別不能繼續編譯,因為這個方法得到的是 double ,是Java的基本資料型別

valueOf 方法得到的資料型別可以繼續往下編,因為這個方法得到的是 Double,是物件,屬於Java的參照資料型別。

2.4.4 inputBox.getText() & inputBox.setText()

獲得文字方塊的內容和設定文字方塊的內容

2.4.5 expression = expression.substring(0, expression.length() - 1);

public String substring (int beginIndex, int endIndex);

這個方法擷取的字串從 beginIndex 開始,到字串索引的 endIndex - 1 結束,即擷取的字串不包括 endIndex 這個索引對應的字元,所以 endIndex 的最大值為整個字串的長度,所以使用這個方法的時候需要特別注意容易發生字串擷取越界的問題

3. 設計題目程式碼清單

3.1 Java版本:

java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

3.2 IDE:

IntelliJ IDEA 2021.2.1

3.3 完整程式碼

package Calculator;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Calculation{
    double number1, number2;//記錄運算的兩個數位
    String operator;
    boolean unfinishedReading;
    Frame frame = new Frame("高齊勉的計算器!");
    TextField inputBox = new TextField(30);
    Button[] button = new Button[20];

    Calculation() {
        //設定輸入文字方塊位置
        frame.setBounds(200, 200, 400, 320);
        frame.add(inputBox, BorderLayout.NORTH);
        //設定按鈕佈局
        Panel panel = new Panel();
        panel.setLayout(new GridLayout(5, 4, 3, 3));
        //設定按鈕,並將按鈕加入panel
        String[] s = {"sqrt", "<-", "AC","%", "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", "0", ".", "=", "/"};
        for (int i = 0; i < s.length; i++) {
            button[i] = new Button(s[i]);
            button[i].addActionListener(new ActionListen());
            panel.add(button[i]);
        }
        frame.add(panel,BorderLayout.CENTER);//將panel設定在中部區域
        frame.setVisible(true);//設定視窗可見
        frame.addWindowListener(new WindowAdapter() {//視窗監聽器,註冊監聽,可以關閉視窗
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    public class ActionListen implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {//獲取事件源的標籤
            String label = e.getActionCommand();
            if (label.equals("=")) {
                number2 = Double.parseDouble(inputBox.getText());
                unfinishedReading = true;
                switch (operator) {
                    case "+":
                        inputBox.setText(number1 + number2 + "");
                        break;
                    case "-":
                        inputBox.setText(number1 - number2 + "");
                        break;
                    case "*":
                        inputBox.setText(number1 * number2 + "");
                        break;
                    case "/":
                        if (number2 != 0)
                            inputBox.setText(number1 / number2 + "");
                        else
                            inputBox.setText("inf");
                        break;
                    case "%":
                        inputBox.setText(number1 % number2 + "");
                        break;
                    case "sqrt":
                        inputBox.setText( Math.sqrt(number1) + "");
                        break;
                    case "^2":
                        inputBox.setText(number2 * number2 + "");
                        break;
                }
            } else if (label.equals("+") || label.equals("*") || label.equals("/") || label.equals("%") || label.equals("sqrt")) {
                number1 = Double.parseDouble(inputBox.getText());
                operator = e.getActionCommand();
                unfinishedReading = false;
            } else if (label.equals("-")) {
                if (!unfinishedReading) {
                    inputBox.setText("-");
                    unfinishedReading = true;
                } else {
                    number1 = Double.parseDouble(inputBox.getText());
                    operator = e.getActionCommand();
                    unfinishedReading = false;
                }
            } else if (label.equals("<-")) {
                String expression = inputBox.getText();
                if (expression.length() != 0) {
                    expression = expression.substring(0, expression.length() - 1);
                    inputBox.setText(expression);
                } else if (expression.length() == 0 && inputBox.getText().length() != 0)
                    // 對於計算結果後避免刪除鍵不能清楚結果顯示
                    inputBox.setText(expression);
            } else if (label.equals("AC")) {
                inputBox.setText("");
                unfinishedReading = false;
            } else {
                String s = inputBox.getText();
                if (!unfinishedReading)
                    inputBox.setText(label);
                else
                    inputBox.setText(s + label);
                unfinishedReading = true;
            }
        }
    }
    public static void main(String[] args) {
        new Calculation();
    }
}

4. 程式測試

4.1執行程式,出現計算器:

在這裡插入圖片描述

4.2加法運算(1+2):

在這裡插入圖片描述

4.3減法運算(2-1):

在這裡插入圖片描述

4.4乘法運算(1*2):

在這裡插入圖片描述

4.5除法運算(4/3):

在這裡插入圖片描述

4.6取餘運算(15%4):

在這裡插入圖片描述

5. 課程設計總結

Java語言是計算機程式設計的重要理論基礎,在我們今後的學習生活中都有著十分重要的地位。要學好Java語言,僅僅通過課本上的知識是遠遠不夠的,我們要經常動手,鍛鍊實踐能力。

只有多動手,多去實現程式功能開發,才能發現我們的一些問題,不斷提高我們的學習能力,改進完善自己的知識體系,在我獨立完成這個專案的過程中,我也遇到了一些之前不懂的知識點,特別是圖形介面設計實現操作,由於之前對圖形介面知識的欠缺,導致一開始根本無從下手,通過這個課程設計也鍛鍊了我自主學習的能力,經過老師的講解和網上資料的閱讀學習,我基本上掌握了圖形介面的建立,設計,新增監聽器,輸出結果,通過本次專案的應用,我進一步熟悉物件導向程式設計中圖形介面的流程,為以後的程式開發打下基礎,也培養了自己開發一個程式的思維,從功能構思,到虛擬碼設計,再到程式實現,最後的偵錯執行修改。

通過一週的學習和不斷完善,開發的計算器完美實現專案要求,通過測試,各模組功能正常,感謝老師對我的指導,使我能夠用這一週的時間開發出我自己的第一個Java語言程式。我相信,有了這第一個程式的經驗積累,今後一定能寫出更加高效簡潔的程式。

6. 參考文獻

[1] 趙莉,孫喁喁,潘煜,徐飛,Java程式設計教學(第二版),西安:西安電子科技大學出版社,2019
[2] Cay s.Horstman Gary Cornell,Java核心技術 卷Ⅰ 基礎知識(原書第11版),林琪,蘇鈺涵,譯. 北京:機械工業出版社,2019
[3] 柴田望洋,明解Java,侯振龍,譯,北京:人民郵電出版社,2018