1. 程式人生 > >java GUI 實現簡單計算器

java GUI 實現簡單計算器

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);
    }
}
右邊的清除一次只能清除一個字元,特殊功能雙擊=可以實現資料的清空,例如:輸入一個233之後直接按=就會清空資料。