Java实例---计算器实例
生活随笔
收集整理的這篇文章主要介紹了
Java实例---计算器实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.計算器上的鍵的顯示名字
1.0 繼承JFrame類
1 public class Calculate extends JFrame { 2 3 } View Code1.1定義常量
1 /** 計算器上的鍵的顯示名字 */ 2 3 public final String[] KEYS = { "7", "8", "9", "/", "sqrt", "4", "5", "6", "*", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" }; 4 5 /** 計算器上的功能鍵的顯示名字 */ 6 7 public final String[] COMMAND = { "Backspace", "CE", "C" }; 8 9 /** 計算器左邊的M的顯示名字 */ 10 11 private final String[] M = { " ", "MC", "MR", "MS", "M+" }; View Code1.2 為對應的按鍵開辟空間
1 /** 計算器上的功能鍵的按鈕 */ 2 3 private JButton commands[] = new JButton[COMMAND.length]; 4 5 /** 計算器左邊的M的按鈕 */ 6 7 private JButton m[] = new JButton[M.length]; 8 9 /** 計算結果文本框 */ 10 11 private JTextField resultText = new JTextField("0"); View Code1.3 最終效果圖:
2 內部布局代碼
2.1 按鍵按鈕代碼
1 // 初始化計算器上鍵的按鈕,將鍵放在一個畫板內 2 3 JPanel keyPanel = new JPanel(); 4 5 // 用網格布局器,4行,5列的網格,網格之間的水平方向間隔為3個象素,垂直方向間隔為3個象素 6 7 keyPanel.setLayout(new GridLayout(4, 5, 3, 3)); 8 9 for (int i = 0; i < KEYS.length; i++) { 10 11 // 數字放入到按鍵中 12 13 keys[i] = new JButton(KEYS[i]); 14 15 // 將按鍵添加到面板 16 17 keyPanel.add(keys[i]); 18 19 // 設置顏色為淡藍色 20 21 keys[i].setForeground(Color.blue); 22 23 } 24 25 // 運算符鍵用紅色標示,其他鍵用藍色表示 26 27 keys[3].setForeground(Color.red); 28 29 keys[8].setForeground(Color.red); 30 31 keys[13].setForeground(Color.red); 32 33 keys[18].setForeground(Color.red); 34 35 keys[19].setForeground(Color.red); View Code2.2 初始化功能鍵代碼
1 // 初始化功能鍵,都用紅色標示。將功能鍵放在一個畫板內 2 3 JPanel commandsPanel = new JPanel(); 4 5 // 用網格布局器,1行,3列的網格,網格之間的水平方向間隔為3個象素,垂直方向間隔為3個象素 6 7 commandsPanel.setLayout(new GridLayout(1,3,3,3)); 8 9 for(int i = 0; i < COMMAND.length; i++){ 10 11 commands[i] = new JButton(COMMAND[i]); 12 13 commandsPanel.add(commands[i]); 14 15 commands[i].setForeground(Color.red); 16 17 } View Code2.3 初始化M鍵代碼
1 // 初始化M鍵,用紅色標示,將M鍵放在一個畫板內 2 3 JPanel calmsPanel = new JPanel(); 4 5 calmsPanel.setLayout(new GridLayout(5,1,3,3)); 6 7 for(int i = 0 ; i < M.length; i++){ 8 9 m[i] = new JButton(M[i]); 10 11 calmsPanel.add(m[i]); 12 13 m[i].setForeground(Color.red); 14 15 } View Code2.3 設置文本框代碼
1 // 文本框中的內容采用右對齊方式 2 3 resultText.setHorizontalAlignment(JTextField.RIGHT); 4 5 // 不允許修改結果文本框 6 7 resultText.setEditable(false); 8 9 // 設置文本框背景顏色為白色 10 11 resultText.setBackground(Color.WHITE); View Code2.4 整體布局代碼
1 JPanel panel1 = new JPanel(); 2 3 // 畫板采用邊界布局管理器,畫板里組件之間的水平和垂直 間隔都為3象素 4 5 panel1.setLayout(new BorderLayout(3, 3)); 6 7 panel1.add("Center", keyPanel); 8 9 panel1.add("North",commandsPanel); View Code 1 // 建立一個畫板放文本框 2 3 JPanel top = new JPanel(); 4 5 top.setLayout(new BorderLayout()); 6 7 top.add("Center", resultText); View Code 1 // 整體布局 2 3 //畫板里組件之間的水平間隔都為3象素,垂直方向上間隔都為5象素 4 5 getContentPane().setLayout(new BorderLayout(3, 5)); 6 7 getContentPane().add("North", top); 8 9 getContentPane().add("Center", panel1); 10 11 getContentPane().add("West", calmsPanel); View Code2.5 添加事件監聽
1 實現ActionListener類,復寫actionPerformed方法 2 3 public class Test1 extends JFrame implements ActionListener {... 4 5 //為各按鈕添加事件偵聽器 6 7 //都使用同一個事件偵聽器,即本對象。本類的聲明中有implements ActionListener 8 9 for(int i = 0; i < KEYS.length; i++){ 10 11 keys[i].addActionListener(this); 12 13 } 14 15 for(int i = 0; i < COMMAND.length; i++){ 16 17 commands[i].addActionListener(this); 18 19 } 20 21 for(int i = 0; i < M.length; i++){ 22 23 m[i].addActionListener(this); 24 25 } 26 27 } View Code2.6 處理回退事件
1 /** 處理Backspace鍵被按下的事件 */ 2 3 private void handleBackspace() { 4 5 //獲取文本框的內容 6 7 String text = resultText.getText(); 8 9 int len = text.length(); 10 11 if( len > 0){ 12 13 //表示有數字寫入 14 15 text = text.substring(0, len - 1); 16 17 if(text.length() == 0){ 18 19 // 如果文本沒有了內容,則初始化計算器的各種值 20 21 resultText.setText("0"); 22 23 }else{ 24 25 resultText.setText(text); 26 27 } 28 29 } View Code2.7 處理CE按鍵
1 // 用戶按了"CE"鍵 2 3 resultText.setText("0"); View Code2.8 處理數字
1 定義變量: 2 3 // 標志用戶按的是否是整個表達式的第一個數字,或者是運算符后的第一個數字 4 5 private boolean firstDigit = true; 6 7 /** 8 9 * 處理數字鍵被按下的事件 10 11 */ 12 13 private void handleNumber(String label) { 14 15 //firstDigit 默認是true 16 17 if(firstDigit){ 18 19 //用戶按的是第一個是數字 20 21 resultText.setText(label); 22 23 }else if((label.equals(".")) && (resultText.getText().indexOf(".") < 0) ){ 24 25 // 輸入的是小數點,并且之前沒有小數點,則將小數點附在結果文本框的后面 26 27 resultText.setText(resultText.getText() + "."); 28 29 }else if(! label.equals(".")){ 30 31 // 如果輸入的不是小數點,則將數字附在結果文本框的后面 32 33 resultText.setText(resultText.getText() + label); 34 35 } 36 37 // 以后輸入的肯定不是第一個數字了 38 39 firstDigit = false; 40 41 } View Code2.9 處理運算符鍵被按下的事件
1 0. 設置操作是否正常標志位operateValidFlag = true 2 3 設置中間變量resultNum = 0.0 4 5 設置操作符變量operator = "" 主要數獲取當前頁顯示的數字 6 7 1. "=" 主要是用來顯示數字,可以是當前輸入的數字, 8 9 也可以是用算后賦值給界面的數字 10 11 2. 賦值當前的操作符號給變量 operator 12 13 3. 設置 firstDigt = true 用于下次界面的顯示 14 15 //當前運算的運算符 16 17 private String operator = "="; 18 19 //設置一個標志位,判斷是否合法 20 21 private boolean operateValidFlag = true; 22 23 // 計算的中間結果。 24 25 private double resultNum = 0.0; 26 27 * 處理運算符鍵被按下的事件 28 29 * @param key 30 31 */ 32 33 private void handleOperator(String label) { 34 35 // 除法運算 36 37 if (operator.equals("/")) { 38 39 if (getNumberFromText() == 0.0) { 40 41 // 操作不合法 42 43 operateValidFlag = false; 44 45 resultText.setText("除數不能為零"); 46 47 } else { 48 49 resultNum /= getNumberFromText(); 50 51 } 52 53 // 倒數運算 54 55 } else if (operator.equals("1/x")) { 56 57 if (resultNum == 0.0) { 58 59 operateValidFlag = false; 60 61 resultText.setText("除數不能為零"); 62 63 } else { 64 65 resultNum = 1 / resultNum; 66 67 } 68 69 } else if (operator.equals("+")) { 70 71 // 加法運算 72 73 resultNum += getNumberFromText(); 74 75 } else if (operator.equals("-")) { 76 77 // 減法運算 78 79 resultNum -= getNumberFromText(); 80 81 } else if (operator.equals("*")) { 82 83 // 乘法運算 84 85 resultNum *= getNumberFromText(); 86 87 } else if (operator.equals("sqrt")) { 88 89 // 開方運算 90 91 resultNum = Math.sqrt(resultNum); 92 93 } else if (operator.equals("+/-")) { 94 95 // 正數負數運算 96 97 resultNum = resultNum * (-1); 98 99 } else if (operator.equals("=")) { 100 101 // 賦值運算 102 103 resultNum = getNumberFromText(); 104 105 } 106 107 if(operateValidFlag){ 108 109 // 雙精度浮點數的運算 110 111 long t1 ; 112 113 double t2; 114 115 t1 = (long) resultNum; 116 117 t2 = resultNum - t1; 118 119 if(t2 == 0){ 120 121 resultText.setText(String.valueOf(t1)); 122 123 System.out.println("resultText.setText(String.valueOf(t1))" + String.valueOf(t1)); 124 125 }else{ 126 127 resultText.setText(String.valueOf(resultNum)); 128 129 System.out.println("resultText.setText(String.valueOf(resultNum))" + String.valueOf(resultNum)); 130 131 } 132 133 } 134 135 // 運算符等于用戶按的按鈕 136 137 operator = label; 138 139 firstDigit = true; 140 141 operateValidFlag = true; 142 143 } 144 145 /** 146 147 * 從結果文本框中獲取數字 148 149 */ 150 151 private double getNumberFromText() { 152 153 double result = 0; 154 155 result = Double.valueOf(resultText.getText()); 156 157 return result; 158 159 } View Code2.10 處理 C 按鍵
1 /** 2 3 * 處理C鍵被按下的事件 4 5 */ 6 7 private void handleC() { 8 9 // 初始化計算器的各種值 10 11 resultText.setText("0"); 12 13 this.firstDigit = true; 14 15 } View Code3. 完整代碼
1 package test; 2 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 import java.awt.GridLayout; 6 import java.awt.event.ActionEvent; 7 import java.awt.event.ActionListener; 8 9 import javax.swing.JButton; 10 import javax.swing.JFrame; 11 import javax.swing.JPanel; 12 import javax.swing.JTextField; 13 14 /** 15 * 一個計算器,與Windows附件自帶計算器的標準版功能、界面相仿。 但還不支持鍵盤操作。 16 */ 17 public class Calculator extends JFrame implements ActionListener { 18 /** 計算器上的鍵的顯示名字 */ 19 private final String[] KEYS = { "7", "8", "9", "/", "sqrt", "4", "5", "6", 20 "*", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" }; 21 /** 計算器上的功能鍵的顯示名字 */ 22 private final String[] COMMAND = { "Backspace", "CE", "C" }; 23 /** 計算器左邊的M的顯示名字 */ 24 private final String[] M = { " ", "MC", "MR", "MS", "M+" }; 25 /** 計算器上鍵的按鈕 */ 26 private JButton keys[] = new JButton[KEYS.length]; 27 /** 計算器上的功能鍵的按鈕 */ 28 private JButton commands[] = new JButton[COMMAND.length]; 29 /** 計算器左邊的M的按鈕 */ 30 private JButton m[] = new JButton[M.length]; 31 /** 計算結果文本框 */ 32 private JTextField resultText = new JTextField("0"); 33 34 // 標志用戶按的是否是整個表達式的第一個數字,或者是運算符后的第一個數字 35 private boolean firstDigit = true; 36 // 計算的中間結果。 37 private double resultNum = 0.0; 38 // 當前運算的運算符 39 private String operator = "="; 40 // 操作是否合法 41 private boolean operateValidFlag = true; 42 43 /** 44 * 構造函數 45 */ 46 public Calculator() { 47 super(); 48 // 初始化計算器 49 init(); 50 // 設置計算器的背景顏色 51 this.setBackground(Color.LIGHT_GRAY); 52 this.setTitle("計算器"); 53 // 在屏幕(500, 300)坐標處顯示計算器 54 this.setLocation(500, 300); 55 // 不許修改計算器的大小 56 this.setResizable(false); 57 // 使計算器中各組件大小合適 58 this.pack(); 59 } 60 61 /** 62 * 初始化計算器 63 */ 64 private void init() { 65 // 文本框中的內容采用右對齊方式 66 resultText.setHorizontalAlignment(JTextField.RIGHT); 67 // 不允許修改結果文本框 68 resultText.setEditable(false); 69 // 設置文本框背景顏色為白色 70 resultText.setBackground(Color.WHITE); 71 72 // 初始化計算器上鍵的按鈕,將鍵放在一個畫板內 73 JPanel calckeysPanel = new JPanel(); 74 // 用網格布局器,4行,5列的網格,網格之間的水平方向間隔為3個象素,垂直方向間隔為3個象素 75 calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3)); 76 for (int i = 0; i < KEYS.length; i++) { 77 keys[i] = new JButton(KEYS[i]); 78 calckeysPanel.add(keys[i]); 79 keys[i].setForeground(Color.blue); 80 } 81 // 運算符鍵用紅色標示,其他鍵用藍色表示 82 keys[3].setForeground(Color.red); 83 keys[8].setForeground(Color.red); 84 keys[13].setForeground(Color.red); 85 keys[18].setForeground(Color.red); 86 keys[19].setForeground(Color.red); 87 88 // 初始化功能鍵,都用紅色標示。將功能鍵放在一個畫板內 89 JPanel commandsPanel = new JPanel(); 90 // 用網格布局器,1行,3列的網格,網格之間的水平方向間隔為3個象素,垂直方向間隔為3個象素 91 commandsPanel.setLayout(new GridLayout(1, 3, 3, 3)); 92 for (int i = 0; i < COMMAND.length; i++) { 93 commands[i] = new JButton(COMMAND[i]); 94 commandsPanel.add(commands[i]); 95 commands[i].setForeground(Color.red); 96 } 97 98 // 初始化M鍵,用紅色標示,將M鍵放在一個畫板內 99 JPanel calmsPanel = new JPanel(); 100 // 用網格布局管理器,5行,1列的網格,網格之間的水平方向間隔為3個象素,垂直方向間隔為3個象素 101 calmsPanel.setLayout(new GridLayout(5, 1, 3, 3)); 102 for (int i = 0; i < M.length; i++) { 103 m[i] = new JButton(M[i]); 104 calmsPanel.add(m[i]); 105 m[i].setForeground(Color.red); 106 } 107 108 // 下面進行計算器的整體布局,將calckeys和command畫板放在計算器的中部, 109 // 將文本框放在北部,將calms畫板放在計算器的西部。 110 111 // 新建一個大的畫板,將上面建立的command和calckeys畫板放在該畫板內 112 JPanel panel1 = new JPanel(); 113 // 畫板采用邊界布局管理器,畫板里組件之間的水平和垂直方向上間隔都為3象素 114 panel1.setLayout(new BorderLayout(3, 3)); 115 panel1.add("North", commandsPanel); 116 panel1.add("Center", calckeysPanel); 117 118 // 建立一個畫板放文本框 119 JPanel top = new JPanel(); 120 top.setLayout(new BorderLayout()); 121 top.add("Center", resultText); 122 123 // 整體布局 124 getContentPane().setLayout(new BorderLayout(3, 5)); 125 getContentPane().add("North", top); 126 getContentPane().add("Center", panel1); 127 getContentPane().add("West", calmsPanel); 128 // 為各按鈕添加事件偵聽器 129 // 都使用同一個事件偵聽器,即本對象。本類的聲明中有implements ActionListener 130 for (int i = 0; i < KEYS.length; i++) { 131 keys[i].addActionListener(this); 132 } 133 for (int i = 0; i < COMMAND.length; i++) { 134 commands[i].addActionListener(this); 135 } 136 for (int i = 0; i < M.length; i++) { 137 m[i].addActionListener(this); 138 } 139 } 140 141 /** 142 * 處理事件 143 */ 144 public void actionPerformed(ActionEvent e) { 145 // 獲取事件源的標簽 146 String label = e.getActionCommand(); 147 if (label.equals(COMMAND[0])) { 148 // 用戶按了"Backspace"鍵 149 handleBackspace(); 150 } else if (label.equals(COMMAND[1])) { 151 // 用戶按了"CE"鍵 152 resultText.setText("0"); 153 } else if (label.equals(COMMAND[2])) { 154 // 用戶按了"C"鍵 155 handleC(); 156 } else if ("0123456789.".indexOf(label) >= 0) { 157 // 用戶按了數字鍵或者小數點鍵 158 handleNumber(label); 159 // handlezero(zero); 160 } else { 161 // 用戶按了運算符鍵 162 handleOperator(label); 163 } 164 } 165 166 /** 167 * 處理Backspace鍵被按下的事件 168 */ 169 private void handleBackspace() { 170 String text = resultText.getText(); 171 int i = text.length(); 172 if (i > 0) { 173 // 退格,將文本最后一個字符去掉 174 text = text.substring(0, i - 1); 175 if (text.length() == 0) { 176 // 如果文本沒有了內容,則初始化計算器的各種值 177 resultText.setText("0"); 178 firstDigit = true; 179 operator = "="; 180 } else { 181 // 顯示新的文本 182 resultText.setText(text); 183 } 184 } 185 } 186 187 /** 188 * 處理數字鍵被按下的事件 189 * 190 * @param key 191 */ 192 private void handleNumber(String key) { 193 if (firstDigit) { 194 // 輸入的第一個數字 195 resultText.setText(key); 196 } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) { 197 // 輸入的是小數點,并且之前沒有小數點,則將小數點附在結果文本框的后面 198 resultText.setText(resultText.getText() + "."); 199 } else if (!key.equals(".")) { 200 // 如果輸入的不是小數點,則將數字附在結果文本框的后面 201 System.out.println("resultText.getText()" + resultText.getText()); 202 resultText.setText(resultText.getText() + key); 203 System.out.println("resultText.getText()" + resultText.getText() + key); 204 } 205 // 以后輸入的肯定不是第一個數字了 206 firstDigit = false; 207 } 208 209 /** 210 * 處理C鍵被按下的事件 211 */ 212 private void handleC() { 213 // 初始化計算器的各種值 214 resultText.setText("0"); 215 firstDigit = true; 216 operator = "="; 217 } 218 219 /** 220 * 處理運算符鍵被按下的事件 221 */ 222 private void handleOperator(String key) { 223 System.out.println(operator.equals("/")); 224 if (operator.equals("/")) { 225 System.out.println("進入到除法里面"); 226 // 除法運算 227 // 如果當前結果文本框中的值等于0 228 if (getNumberFromText() == 0.0) { 229 // 操作不合法 230 operateValidFlag = false; 231 resultText.setText("除數不能為零"); 232 } else { 233 System.out.println("resultNum:" + resultNum); 234 resultNum /= getNumberFromText(); 235 System.out.println("resultNum /= getNumberFromText():" + resultNum); 236 237 } 238 } else if (operator.equals("1/x")) { 239 // 倒數運算 240 if (resultNum == 0.0) { 241 // 操作不合法 242 operateValidFlag = false; 243 resultText.setText("零沒有倒數"); 244 } else { 245 resultNum = 1 / resultNum; 246 } 247 } else if (operator.equals("+")) { 248 // 加法運算 249 resultNum += getNumberFromText(); 250 } else if (operator.equals("-")) { 251 // 減法運算 252 resultNum -= getNumberFromText(); 253 } else if (operator.equals("*")) { 254 // 乘法運算 255 resultNum *= getNumberFromText(); 256 } else if (operator.equals("sqrt")) { 257 // 平方根運算 258 resultNum = Math.sqrt(resultNum); 259 } else if (operator.equals("%")) { 260 // 百分號運算,除以100 261 resultNum = resultNum / 100; 262 } else if (operator.equals("+/-")) { 263 // 正數負數運算 264 resultNum = resultNum * (-1); 265 } else if (operator.equals("=")) { 266 // 賦值運算 267 resultNum = getNumberFromText(); 268 } 269 if (operateValidFlag) { 270 // 雙精度浮點數的運算 271 long t1; 272 double t2; 273 t1 = (long) resultNum; 274 System.out.println(t1); 275 t2 = resultNum - t1; 276 System.out.println(t2); 277 if (t2 == 0) { 278 resultText.setText(String.valueOf(t1)); 279 } else { 280 resultText.setText(String.valueOf(resultNum)); 281 System.out.println("resultText.setText(String.valueOf(resultNum))" + String.valueOf(resultNum)); 282 } 283 } 284 // 運算符等于用戶按的按鈕 285 operator = key; 286 firstDigit = true; 287 operateValidFlag = true; 288 } 289 290 /** 291 * 從結果文本框中獲取數字 292 * 293 * @return 294 */ 295 private double getNumberFromText() { 296 double result = 0; 297 try { 298 result = Double.valueOf(resultText.getText()).doubleValue(); 299 } catch (NumberFormatException e) { 300 } 301 return result; 302 } 303 304 public static void main(String args[]) { 305 Calculator calculator1 = new Calculator(); 306 calculator1.setVisible(true); 307 calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 308 } 309 } View Code?
點擊下載
轉載于:https://www.cnblogs.com/ftl1012/p/calc.html
總結
以上是生活随笔為你收集整理的Java实例---计算器实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BZOJ3261] 最大异或和 (异或
- 下一篇: 一些日常工具集合(C++代码片段)