1 package com.lovo.calculator; 2 3 import java.awt.BorderLayout; 4 import java.awt.GridLayout; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.event.KeyAdapter; 8 import java.awt.event.KeyEvent; 9 10 import javax.swing.JButton; 11 import javax.swing.JFrame; 12 import javax.swing.JPanel; 13 import javax.swing.JTextField; 14 15 /** 16 * 計算器類 17 * 18 * @author Administrator 19 * 20 */ 21 public class Calculator extends JFrame implements ActionListener { 22 23 private static final long serialVersionUID = 3868243398506940702L; 24 25 // 文本框 26 private JTextField result; 27 // 按鈕數組 28 private JButton[] buttons; 29 // 按鈕文本 30 private final String[] characters = { "7", "8", "9", "/", "4", "5", "6", 31 "*", "1", "2", "3", "-", "0", ".", "=", "+" }; 32 // 是否為第一個輸入的數字 33 private boolean isFirstDigit = true; 34 // 運算結果 35 private double resultNum = 0.0; 36 // 運算符 37 private String operator = "="; 38 39 public Calculator(String title) { 40 // 設置標題欄 41 super(title); 42 // 初始化各組件 43 init(); 44 // 注冊各組件監聽器 45 registerListener(); 46 47 // 顯示窗體 48 setVisible(true); 49 } 50 51 /** 52 * 初始化各組件 53 */ 54 private void init() { 55 // 常用屬性初始化 56 setSize(220, 200); 57 setResizable(false); 58 setLocationRelativeTo(null); 59 setDefaultCloseOperation(EXIT_ON_CLOSE); 60 61 /* 文本框對象初始化 */ 62 result = new JTextField("0"); 63 // 文本右對齊 64 result.setHorizontalAlignment(JTextField.RIGHT); 65 // 設置是否可編輯 66 result.setEditable(false); 67 /* 按鈕初始化 */ 68 buttons = new JButton[characters.length]; 69 for (int i = 0; i < buttons.length; i++) { 70 buttons[i] = new JButton(characters[i]); 71 buttons[i].setFocusable(false); // 不允許按鈕定位焦點 72 } 73 /* 將文本框與按鈕添加到窗體中 */ 74 add(result, BorderLayout.NORTH); 75 JPanel pnl = new JPanel(new GridLayout(4, 4, 5, 5)); 76 for (JButton jButton : buttons) { 77 pnl.add(jButton); 78 } 79 add(pnl); 80 81 this.getContentPane().setFocusable(true); 82 } 83 84 /** 85 * 注冊監聽器 86 */ 87 private void registerListener() { 88 for (JButton jButton : buttons) { 89 jButton.addActionListener(this); 90 } 91 92 // 注冊鍵盤事件 93 this.getContentPane().addKeyListener(new KeyAdapter() { 94 @Override 95 public void keyPressed(KeyEvent e) { 96 String text = String.valueOf(e.getKeyChar()); 97 if (Character.isDigit(text.charAt(0)) || ".".equals(text)) { // 數字或小數點 98 handleNumber(text); 99 } else if ("+-*/=".indexOf(text) != -1) { // 運算符 100 handleOperator(text); 101 } else if (e.getKeyCode() == 8) { // 退格鍵 102 String tmp = result.getText().trim(); 103 if (tmp.length() == 1) { 104 result.setText("0"); 105 isFirstDigit = true; 106 } else { 107 result.setText(tmp.substring(0, tmp.length() - 1)); 108 } 109 } 110 } 111 }); 112 } 113 114 @Override 115 public void actionPerformed(ActionEvent e) { 116 JButton btn = (JButton) e.getSource(); 117 String text = btn.getText().trim(); 118 119 if (Character.isDigit(text.charAt(0)) || ".".equals(text)) { // 處理數字和小數點 120 handleNumber(text); 121 } else { // 處理運算符 122 handleOperator(text); 123 } 124 } 125 126 /** 127 * 處理數字和小數點 128 * 129 * @param text 130 */ 131 private void handleNumber(String text) { 132 if (isFirstDigit) { // 第一次輸入 133 if (".".equals(text)) { 134 this.result.setText("0."); 135 } else { 136 this.result.setText(text); 137 } 138 } else if ("0".equals(text) && "0".equals(this.result.getText())) { 139 isFirstDigit = true; 140 return; 141 } else if (".".equals(text) && this.result.getText().indexOf(".") == -1) { 142 this.result.setText(this.result.getText() + "."); 143 } else if (!".".equals(text)) { 144 this.result.setText(this.result.getText() + text); 145 } 146 147 isFirstDigit = false; 148 } 149 150 /** 151 * 處理運算符 152 * 153 * @param text 154 */ 155 private void handleOperator(String text) { 156 switch (operator) { // 處理各項運算 適用於JDK1.7版本的 157 case "+": 158 resultNum += Double.parseDouble(this.result.getText()); 159 break; 160 case "-": 161 resultNum -= Double.parseDouble(this.result.getText()); 162 break; 163 case "*": 164 resultNum *= Double.parseDouble(this.result.getText()); 165 break; 166 case "/": 167 resultNum /= Double.parseDouble(this.result.getText()); 168 break; 169 case "=": 170 resultNum = Double.parseDouble(this.result.getText()); 171 break; 172 } 173 // 將文本框的值修改為運算結果 174 this.result.setText(String.valueOf(resultNum)); 175 // 將點擊的運算符放入operator保存 176 operator = text; 177 // 下一個數字第一次點擊 178 isFirstDigit = true; 179 } 180 }
測試類
1 package com.lovo.calculator; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 new Calculator("My Calculator"); 7 } 8 }