本項目課程使用 Java 語言完成了一個簡單的計算機。將使用到 Java Swing 圖形組件等等。
一、實驗簡介
本次實驗製作一個可以進行簡單的四則運算的計算機,會使用到 Java swing 進行開發。 1.1 知識點 Java Swing 介面編程 計算機邏輯運算實現 1.2 實驗環境介紹
本實驗環境採用帶案頭的 Ubuntu Linux 環境,實驗中會用到案頭上的程式: Eclipse:一個開放原始碼的、基於Java的可擴充開發平台,用於 Java 程式開發。 1.3 實驗完成效果圖
最終效果圖如下圖所示:
二、項目建立
請雙擊開啟案頭上的 eclipse ,等待啟動完成後,按照下面的步驟來建立項目。
如果你對該步驟已經非常熟悉,可以直接跳轉到下一小節學習。
(1)在檔案菜單 File 中選擇 New -> Project 來建立項目。
(2)在彈出的建立項目對話方塊中選擇 Java Project,並點擊 Next 按鈕進入下一步。
(3)在 Project name 一欄填寫項目名稱 Calculator,並點擊 Finish 按鈕完成建立。
(4)如果遇到下圖所示的對話方塊,點擊 Yes 按鈕確認即可。
(5)在建立好後的項目目錄 src 上右鍵點擊,在右鍵菜單中選擇 New -> Class 來建立一個類。
(6)在建立類對話方塊中填寫包名 com.shiyanlou.calculator 和類名 Calculator (首字母大寫)。點擊 Finish 按鈕完成建立。
(7)按照本課程後面的內容編輯 Calculator.java 檔案。 三、介面設計和實現
要製作一個計算機,首先需要知道它由哪些部分組成。
從結構上來說,一個簡單的圖形介面,需要由介面組件、組件的事件監聽器(響應各類事件的邏輯)和具體的事件處理邏輯組成。
整個代碼結構如下圖所示:
我們首先需要製作介面部分。這部分主要的工作就是建立各個介面組件對象,對其進行初始化,以及控制各組件之間的層次關係和布局。 3.1 UI 組件建立和初始化
首先我們需要將介面中要用到的 UI 組件作為 Calculator 類的成員變數在一開始聲明。在閱讀代碼之前,可以思考一下都要用到哪些 UI 組件,以及這些代碼應當寫在哪個位置等等。
// 建立一個 JFrame 對象並初始化。JFrame 可以理解為程式的主表單。 JFrame frame = new JFrame("Calculator"); // 建立一個 JTestField 對象並初始化。 JTestField 是用於顯示操作和計算結果的文字框。 // 參數 20 表明可以顯示 20 列的常值內容 JTextField result_TextField = new JTextField(result, 20); // 清除按鈕 JButton clear_Button = new JButton("Clear"); // 數字鍵0到9 JButton button0 = new JButton("0"); JButton button1 = new JButton("1"); JButton button2 = new JButton("2"); JButton button3 = new JButton("3"); JButton button4 = new JButton("4"); JButton button5 = new JButton("5"); JButton button6 = new JButton("6"); JButton button7 = new JButton("7"); JButton button8 = new JButton("8"); JButton button9 = new JButton("9"); // 計算命令按鈕,加減乘除以及小數點等 JButton button_Dian = new JButton("."); JButton button_jia = new JButton("+"); JButton button_jian = new JButton("-"); JButton button_cheng = new JButton("*"); JButton button_chu = new JButton("/"); // 計算按鈕 JButton button_dy = new JButton("=");
3.2 在表單中添加 UI 組件
這個計算機有兩個 JPanel。
什麼是 JPanel:JPanel 是一般輕量級容器。如上圖所示,你可以將其理解為一個盛放其他 UI 組件的“籃子”。 JPanel 位於 javax.swing 包中,為面板容器,可以加入到 JFrame 中 , 它自身是個容器,也可以把其他 component (組件) 加入到 JPanel 中,例如 JButton、JTextArea、JTextField 等。
在這個項目中,兩個 JPanel 分別對應這個計算機按鍵除 “Clear” 鍵外其他的鍵,另個面板則是輸出欄跟 “Clear” 鍵(截取部分代碼)。
同樣,在書寫本段代碼時,你應當思考它應該放在哪個部分。如果不清楚,可以回到上面的代碼結構中查看。
可供參考的代碼如下所示:
// 建立一個 Jpanel 對象並初始化 JPanel pan = new JPanel(); // 設定該容器的布局為四行四列,邊距為5像素 pan.setLayout(new GridLayout(4, 4, 5, 5)); // 將用於計算的按鈕添加到容器內 pan.add(button7); pan.add(button8); pan.add(button9); pan.add(button_chu); pan.add(button4); pan.add(button5); pan.add(button6); pan.add(button_cheng); pan.add(button1); pan.add(button2); pan.add(button3); pan.add(button_jian); pan.add(button0); pan.add(button_Dian); pan.add(button_dy); pan.add(button_jia); // 設定 pan 對象的邊距 pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // 按照同樣的方式設定第二個JPanel JPanel pan2 = new JPanel(); pan2.setLayout(new BorderLayout()); pan2.add(result_TextField, BorderLayout.WEST); pan2.add(clear_Button, BorderLayout.EAST);
布局結束後,就是計算機的痛點:事件處理常式。 四、添加事件響應邏輯
對於計算機而言,涉及到的事件響應邏輯主要有:數字鍵、加減乘除運算、小數點處理、等於以及清除。
請你思考一下,這裡的幾個開關狀態是用於什麼目的。
代碼如下(截取部分代碼,這裡是通過類方法處理的):
// 等於按鍵的邏輯,即在輸入完成後開始計算class Listener_dy implements ActionListener { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { store = (JButton) e.getSource(); vt.add(store); yuns(); // 還原開關k1狀態 k1 = 1; // 還原開關k2狀態 k2 = 1; // 還原開關k3狀態 k3 = 1; // 還原開關k4狀態 k4 = 1; // 為 7+5=12 +5=17 這種計算做準備 str1 = result; } }
五、計算邏輯的實現
計算的邏輯要針對輸入的不同運算子來對運算元進行運算,同時還要考慮到除以0這種不合理的演算法容錯。
主要代碼如下:
public void cal() { // 運算元1 double a2; // 運算元2 double b2; // 運算子 String c = signal; // 運算結果 double result2 = 0; if (c.equals("")) { result_TextField.setText("Please input operator."); } else { // 字串 "." 轉換成double型資料時,會出錯,所以自己編寫邏輯來轉換 if (str1.equals(".")) str1 = "0.0"; if (str2.equals(".")) str2 = "0.0"; a2 = Double.valueOf(str1).doubleValue(); b2 = Double.valueOf(str2).doubleValue(); if (c.equals("+")) { result2 = a2 + b2; } if (c.equals("-")) { result2 = a2 - b2; } if (c.equals("*")) { result2 = a2 * b2; } if (c.equals("/")) { if (b2 == 0) { // 防止除0這種不合理的運算出現 result2 = 0; } else { result2 = a2 / b2; } } result = ((new Double(result2)).toString()); result_TextField.setText(result); } }
至此,整個計算機的主要邏輯就已經講解完畢,請自行補充其他的細節。 六、項目完整源碼
整個程式完整的原始碼如下,相關的講解已在注釋中給出,請仔細閱讀。
package com.shiyanlou.calculator;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.Vector;public class Calculator { // 運算元1,為了程式的安全,初值一定設定,這裡我們設定為0。 String str1 = "0"; // 運算元2 String str2 = "0"; // 運算子 String signal = "+"; // 運算結果 String result = ""; // 以下k1至k2為狀態開關 // 開關1用於選擇輸入方向,將要寫入str1或str2 int k1 = 1; // 開關2用於記錄符號鍵的次數,如果 k2>1 說明進行的是 2+3-9+8 這樣的多符號運算 int k2 = 1; // 開關3用於標識 str1 是否可以被清0 ,等於1時可以,不等於1時不能被清0 int k3 = 1; // 開關4用於標識 str2 是否可以被清0 int k4 = 1; // 開關5用於控制小數點可否被錄入,等於1時可以,不為1時,輸入的小數點被丟掉 int k5 = 1; // store的作用類似於寄存器,用於記錄是否連續按下符號鍵 JButton store;