2022-1-2
文章目錄
- 2022-1-2
- 【圖形界面程式----計算器】
- 1. 設計任務
- 1.1設計題目的描述
- 1.2設計要求
- 2. 設計方案說明
- 2.1 整體設計思路
- 2.2 Calulation類的資料成員
- 2.3 Calulation類的構造方法
- 2.3.1設定文本框的位置
- 2.3.2 設定按鈕布局
- 2.3.3 設定按鈕
- 2.3.4 設定視窗可見,注冊視窗監聽
- 2.4 ActionListen類實作ActionListener介面
- 2.4.1 public void actionPerformed(ActionEvent e)
- 2.4.2 動作事件`(ActionEvent e)`
- 2.4.3 number1 = Double.parseDouble(inputBox.getText())
- 2.4.4 inputBox.getText() & inputBox.setText()
- 2.4.5 expression = expression.substring(0, expression.length() - 1);
- 3. 設計題目代碼清單
- 3.1 Java版本:
- 3.2 IDE:
- 3.3 完整代碼
- 4. 程式測驗
- 4.1運行程式,出現計算器:
- 4.2加法運算(1+2):
- 4.3減法運算(2-1):
- 4.4乘法運算(1*2):
- 4.5除法運算(4/3):
- 4.6取余運算(15%4):
- 5. 課程設計總結
- 6. 參考文獻
【圖形界面程式----計算器】
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/401626.html
標籤:java
