本專案使用 Java Swing 實作一款標準型計算器,支援四則運算、百分比、開根號、倒數、正負號切換、記憶體功能 (MC/MR/MS/M+)、退位/清除、複製貼上、說明系統。代碼採用單類實作 ActionListener,邏輯集中在 actionPerformed,適合初學者理解事件驅動 GUI 程式設計。
public class Calculator implements ActionListener {
// UI 元件
JFrame frame; JTextField textAnswer, textMemory;
JPanel panel, panel1, panel2, panel3;
JMenuBar mainMenu; JMenu editMenu, viewMenu, helpMenu;
JButton[] button = new JButton[10]; // 0-9 數字鍵
JButton buttonAdd, buttonSub, buttonMul, buttonDiv, buttonMod;
JButton buttonSqrt, buttonDao, buttonEqual, buttonDot, buttonAddAndSub;
JButton buttonMC, buttonMR, buttonMS, buttonMAdd;
JButton buttonBk, buttonCe, buttonC;
// 狀態變數
DecimalFormat df = new DecimalFormat("0.##############");
boolean clickable = true; // 防止連續運算符輸入
double memoryd = 0, memoryi = 0; // 記憶體雙槽 (double/int)
double vard = 0, answerd = 0; // 運算中間值、結果值
short key = -1, prekey = -1; // 當前/上一運算符編碼
String copy = ""; // 剪貼板
}
frame (BorderLayout)
├─ NORTH: JMenuBar (編輯/查看/幫助)
├─ CENTER: textAnswer (顯示區)
└─ SOUTH: panel1 (BorderLayout)
├─ NORTH: panel2 (FlowLayout RIGHT) → textMemory + buttonBk/CE/C
└─ CENTER: panel3 (GridLayout 4x6) → 數字鍵、運算符、功能鍵
panel3.setLayout(new GridLayout(4, 6));
// 按行序加入:MC 7 8 9 / sqrt | MR 4 5 6 * % | MS 1 2 3 - 1/x | M+ 0 +/- . + =
// 共 24 個按鈕,每行 6 個
// 數字鍵 0-9
for (int i=0; i<=9; i++)
if (e.getSource()==button[i] && clickable)
textAnswer.setText(textAnswer.getText() + i);
// 小數點:防止重複
if (e.getSource()==buttonDot && clickable) {
if (!textAnswer.getText().contains("."))
textAnswer.setText(textAnswer.getText() + ".");
}
// 以加法為例,減乘除同理
if (e.getSource()==buttonAdd && clickable) {
// 先結算上一個運算 (prekey)
switch (prekey) {
case 0: answerd += Double.parseDouble(textAnswer.getText()); break; // +
case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; // -
case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; // *
case 3:
double val = Double.parseDouble(textAnswer.getText());
if (val == 0) { showError("除數不能為零"); return; }
answerd /= val; break; // /
default: answerd = Double.parseDouble(textAnswer.getText());
}
textAnswer.setText(""); // 清空輸入區
prekey = key = 0; // 記錄當前為加法
}
if (e.getSource()==buttonEqual && clickable) {
if (prekey == 5) { // 連續按 =
// 使用上一個運算數 vard 重複運算
switch (key) { case 0: answerd += vard; break; ... }
} else {
vard = Double.parseDouble(textAnswer.getText()); // 記住本次運算數
switch (key) { case 0: answerd += vard; break; ... }
prekey = -1; // 重置上一運算符
}
prekey = 5; // 標記剛按過 =
textAnswer.setText(df.format(answerd));
}
| 鍵 | 邏輯重點 |
|---|---|
| % | 第二運算數除 100,智能處理整數/小數 |
| √ | 負數報錯,Math.sqrt() |
| 1/x | 零報錯,結果去尾小數點 |
| +/- | 字串層面切換首字符 +/- |
| MC/MR/MS/M+ | 雙槽記憶體 (double/int 分離),M+ 智能型別合併 |
| Backspace | 字串刪除最後一字符 |
| CE | 清空輸入區,重置 clickable |
| C | 全清:vard/answerd 歸零 |
// 複製/貼上
if (e.getSource()==copyItem) copy = textAnswer.getText();
if (e.getSource()==pasteItem) textAnswer.setText(copy);
// 幫助/關於
if (e.getSource()==topHelp)
JOptionPane.showMessageDialog(panel, scrollHelp);
if (e.getSource()==aboutCal)
JOptionPane.showMessageDialog(panel, "計算器 1.00\n開發者:樓競");
catch (Exception ex) {
textAnswer.setText("操作非法");
clickable = false;
}
public static void main(String[] args) {
new Calculator(); // 建構子內完成 UI 建立、事件綁定、frame.show()
}
ActionListener 透過 getSource() 分派key/prekey/clickable 控制運算流程DecimalFormat 控制精度DecimalFormat("#,###.##")KeyBindingJList + 雙擊帶入CalculatorModel、CalculatorView、CalculatorController這款計算器雖功能基礎,但涵蓋了 GUI 程式設計的核心要素:視窗建構、佈局管理、事件監聽、狀態維護、異常處理。建議初學者手敲代碼、斷點調試 actionPerformed 流程,體會「事件→狀態變更→視圖更新」的循環。掌握此模式,即可應對更複雜的 Swing/JavaFX 桌面應用開發。