學習java有一段時間了,所以打了一個有關於計算器的代碼。雖然簡單,但是卻是我花了很長一段時間才寫出來的。
思路就是以下的代碼了,關鍵的注釋已經寫出來了,應該可以幫助大家吧。
多的沒啥子寫的,只知道當時寫的時候真的腦子里一團漿糊·······
下面展示代碼:
1 import java.awt.BorderLayout; 2 import java.awt.Container; 3 import java.awt.Font; 4 import java.awt.GridLayout; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.util.Arrays; 8 9 import javax.swing.JButton; 10 import javax.swing.JFrame; 11 import javax.swing.JOptionPane; 12 import javax.swing.JPanel; 13 import javax.swing.JTextField; 14 15 public class Calculator extends JFrame implements ActionListener { 16 // 屬性 17 JTextField txtResult; 18 boolean firstDigit = true;//用於判斷是否是數字 19 String operator = "=";//先初始化為等號,等到執行相應運算時再更改 20 boolean operateValidFlag = true;//判斷除數是否為0 21 double resultNum = 0.0;//可以暫存目前的最終結果 22 // 方法 23 public Calculator() { 24 setTitle("計算器"); 25 setSize(240, 270); 26 setResizable(false); 27 setLocationRelativeTo(null); 28 setDefaultCloseOperation(EXIT_ON_CLOSE); 29 30 Container contentPane = this.getContentPane(); 31 contentPane.setLayout(new BorderLayout(1, 5)); 32 JPanel pnlNorth = new JPanel(); 33 JPanel pnlCenter = new JPanel(); 34 35 pnlNorth.setLayout(new BorderLayout()); 36 pnlCenter.setLayout(new GridLayout(4, 4, 3, 3)); 37 38 Font font = new Font("Times Roman", Font.BOLD, 20); 39 40 contentPane.add(BorderLayout.NORTH, pnlNorth); 41 contentPane.add(BorderLayout.CENTER, pnlCenter); 42 43 txtResult = new JTextField(); 44 txtResult.setFont(font); 45 txtResult.setEnabled(false); 46 JButton btnClear = new JButton("C"); 47 btnClear.setFont(font); 48 btnClear.addActionListener(this); 49 50 pnlNorth.add(BorderLayout.CENTER, txtResult); 51 pnlNorth.add(BorderLayout.EAST, btnClear); 52 53 String[] captions = { "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", "0", ".", "/", "=", }; 54 for (int i = 0; i < captions.length; i++) { 55 JButton btn = new JButton(captions[i]); 56 btn.setFont(font); 57 pnlCenter.add(btn); 58 btn.addActionListener(this); 59 60 } 61 62 } 63 64 public static void main(String[] args) { 65 JFrame frame = new Calculator(); 66 frame.setVisible(true); 67 } 68 //對按鈕進行的反應 69 @Override 70 public void actionPerformed(ActionEvent event) { 71 String label = event.getActionCommand(); 72 if (label.equals("C") ){ 73 handleC(); 74 } else if ("0123456789.".indexOf(label) >= 0) { 75 //無論整數還是小數都一起提取出來 76 handleNumber(label); 77 } else { 78 //將當前要執行的運算的運算符賦給operator 79 handleOperator(label); 80 } 81 } 82 83 //提取數字 84 void handleNumber(String key) { 85 if (firstDigit) { 86 txtResult.setText(key);//在文本框中顯示數字的字符串 87 } else if ((key.equals(".")) && (txtResult.getText().indexOf(".") < 0)) { 88 89 txtResult.setText(txtResult.getText() + ".");//在文本框中顯示整數數字的字符串 90 } else if (!key.equals(".")) { 91 92 txtResult.setText(txtResult.getText() + key);//在文本框中顯示整數數字的字符串 93 } 94 firstDigit = false;//當數字顯示完之后,即可重置為false 95 } 96 97 //實現清零 98 void handleC() { 99 100 txtResult.setText("0"); 101 firstDigit = true; 102 operator = "="; 103 } 104 //進行運算 105 void handleOperator(String key) { 106 if (operator.equals("/")) { 107 //判斷除數是否為0 108 if (getNumberFromText() == 0.0) { 109 //以下代碼很關鍵,不做多余說明,每次看都有不同的理解 110 operateValidFlag = false; 111 txtResult.setText("除數不能為零"); 112 } else { 113 resultNum /= getNumberFromText(); 114 } 115 } else if (operator.equals("+")) { 116 117 resultNum += getNumberFromText(); 118 } else if (operator.equals("-")) { 119 120 resultNum -= getNumberFromText(); 121 } else if (operator.equals("*")) { 122 123 resultNum *= getNumberFromText(); 124 } else if (operator.equals("=")) { 125 126 resultNum = getNumberFromText(); 127 } 128 129 if (operateValidFlag) { 130 long t1; 131 double t2; 132 t1 = (long) resultNum; 133 t2 = resultNum - t1; 134 if (t2 == 0) { 135 txtResult.setText(String.valueOf(t1)); 136 } else { 137 txtResult.setText(String.valueOf(resultNum)); 138 } 139 } 140 operator = key; 141 firstDigit = true; 142 operateValidFlag = true; 143 } 144 145 double getNumberFromText() { 146 double result = 0; 147 try { 148 result = Double.valueOf(txtResult.getText()).doubleValue();//把String轉化成Double類型的對象,並求double的原始值 149 } catch (NumberFormatException e) { 150 } 151 return result; 152 }
運行結果如圖: