java GUI 實現簡單計算器
阿新 • • 發佈:2018-12-26
右邊的清除一次只能清除一個字元,特殊功能雙擊=可以實現資料的清空,例如:輸入一個233之後直接按=就會清空資料。package calclutor; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame { // 這一句的作用是什麼? private static final long serialVersionUID = -1047298397568411277L; private JTextField textField; private ActionListener myListener; public Calculator() { setTitle("計算器"); // 設定名字為計算器 setSize(300, 300); // 設定大下為 300x300 setLocationRelativeTo(null); // 設定位置為居中 setResizable(false); // 設定為大小不可變的 setDefaultCloseOperation(EXIT_ON_CLOSE); // 可以退出 Container container = getContentPane(); // 新建一個容器 container.setLayout(new BorderLayout(5, 5)); // 設定左右間距為5畫素 JPanel pnlNorth = new JPanel(); // 北面面板 JPanel pnlCenter = new JPanel(); // 中間面板 // 把textFeild和panel 都放到容器上 container.add(pnlNorth, BorderLayout.NORTH); // 把pnlNorth放在北面 container.add(pnlCenter, BorderLayout.CENTER); // 把pnlCenter放在center面 textField = new JTextField(); // 文字框設定 textField.setFont(new Font("宋體", Font.PLAIN, 16)); textField.setEditable(false); // 不可修改 textField.setHorizontalAlignment (JTextField.RIGHT); //設定輸出右對齊 //--------------- pnlNorth.setLayout(new BorderLayout(5, 5)); // 設定上邊的文字框和按鈕的位置為邊界佈局 //--------------- JButton btnClear = useButton("<<<"); // new一個button按鈕 pnlNorth.add(textField, BorderLayout.CENTER); // 將文字框放到中間 pnlNorth.add(btnClear, BorderLayout.EAST); // 將按鈕放到做左邊(西) String[] titles = { "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", "0", ".", "/", "=" }; // 設定下面放按鈕的位置的panel為網格佈局 // 4x4的網格 button與button之間的距離為3畫素 pnlCenter.setLayout(new GridLayout(4, 4, 3, 3)); for (int i = 0; i < titles.length; i++) { JButton btnNum = useButton(titles[i]); // btnNum.setFont(new Font("宋體", Font.PLAIN, 16)); // 三個引數分別表示: 字型,樣式(粗體,斜體等),字號 btnNum.setFont(new Font("微軟雅黑",Font.PLAIN, 24)); pnlCenter.add(btnNum); } } public JButton useButton (final String titles) { /* * String.valueof(x) 返回x的字串表示 * 這裡的titles之所以要用final修飾 是為了不被修改 * 然後後面使用String的valueof方法是為了將 */ JButton button = new JButton(String.valueOf(titles)); if(myListener == null){ myListener = new ActionListener(){ public void actionPerformed(ActionEvent event){ String btnInformation = event.getActionCommand(); char key2 = btnInformation.charAt(0); action(key2); } }; } button.addActionListener(myListener); return button; } int len; String a, b, value; char exit = '0'; // 初始化為=進入的時候避免多次進入case '=': 出錯 ,在使用完之後置為= char op = 'n'; // 最聽話的op 始終指向前一個操作符 這裡的=是邏輯意義上的得到運算結果的意思 boolean flag = false; // flag 為false的時候進行數字長度增加的操作 // flag 為true的時候進行數字首次輸入的操作 private void action(char key2){ /* * 在計算器的運算中整體的數字都是被轉化為了double型的 * Double.parseDouble ... * */ String text; switch(key2){ /* * 例如: * 首先你輸入一串數字:如果下一個符號為 + - * / 中的任意一個 * 首先將textfeild裡面的值清空 * 再將操作符置為 + - * / * * !"".equals(textField.getText()) 在textField上不存在字串的時候 * * 多個點的時候 兩個數之間多次點選加減乘除的時候 * 多次加減乘除 */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': /* * 當flag為true的時候進行前面的字串的清空,後面的第一個字元的輸入 * 當flag為false的時候進行後面的字串的輸入 */ if (flag) { textField.setText(""); textField.setText(String.valueOf(key2)); flag = false; } else { text = textField.getText() + key2; textField.setText(text); text = ""; // 因為text公用每次使用完了之後進行清空的操作 } break; case '.': if("".equals(textField.getText())) break; // 第一個元素不能為. if(!"".equals(textField.getText())){ text = textField.getText(); len = text.length(); int i = 0; for(; i<len; i++) { if('.' == text.charAt(i)){ break; // 出現兩個點的情況 } } // 確認字元竄中是否已經存在. if(i<len) // 一個字串中不能出現多個. break; text = textField.getText() + key2; textField.setText(text); text = ""; } break; case '+': if(!"".equals(textField.getText())){ if ('n' == op) { a = textField.getText(); op = '+'; flag = true; } else { b = textField.getText(); calculation(a, b); a = value; textField.setText(value); op = '+'; flag = true; } exit = '1'; } break; case '-': if(!"".equals(textField.getText())){ if ('n' == op) { a = textField.getText(); op = '-'; flag = true; } else { b = textField.getText(); calculation(a, b); a = value; textField.setText(value); op = '-'; flag = true; } exit = '1'; } break; case '*': if(!"".equals(textField.getText())){ if ('n' == op) { a = textField.getText(); op = '*'; flag = true; } else { b = textField.getText(); calculation(a, b); a = value; textField.setText(value); op = '*'; flag = true; } exit = '1'; } break; case '/': if(!"".equals(textField.getText())){ if ('n' == op) { a = textField.getText(); op = '/'; flag = true; } else { b = textField.getText(); calculation(a, b); a = value; textField.setText(value); op = '/'; flag = true; } exit = '1'; } break; case '<': text = textField.getText(); // 獲取當前的字串 if(!"".equals(text)){ len = text.length(); text = text.substring(0, len-1); textField.setText(text); } text=""; break; case '=': if('0' == exit){ textField.setText(""); break; } if("".equals(textField.getText())) // 排除 7*= 7+= 之類錯誤 break; b = textField.getText(); calculation(a, b); textField.setText(String.valueOf(value)); break; default: ; // 在本計算器程式中沒有其它情況 } } private void calculation(String a, String b){ double v1 = Double.parseDouble(a); double v2 = Double.parseDouble(b); double v=0; switch(op){ case '+': v = v1 + v2; exit = '0'; a = b = null; op = 'n'; break; case '-': v = v1 - v2; exit = '0'; a = b = null; op = 'n'; break; case '*': v = v1 * v2; exit = '0'; a = b = null; op = 'n'; break; case '/': if(v2==0) break; v = v1 / v2; exit = '0'; a = b = null; op = 'n'; break; default: ; } value = String.valueOf(v); } public static void main(String[] args) { new Calculator().setVisible(true); } }