Java 計算器

CN_swords發表於2017-06-05


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class BorderLayoutWindow extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	// private 私密, final 只讀(無法更改),按鈕名稱。
	private final String str[] = {
			"", "CE", "C", "←", "÷", 
			"Pi", "7", "8", "9", "×", 
			"n!", "4", "5", "6", "-", 
			"+/-", "1", "2", "3", "+",
			"(", ")", "0", ".", "="
	};
	private JButton buttonstr[] = new JButton[str.length];
	
	// 其他未實現功能名稱。
	private final String key[] = {
			"x^2", "x^y", "sin", "cos", "tan",
			"sqrt", "10^x", "log", "Exp", "Mod"
	};
	private JButton buttonkey[] = new JButton[key.length];
	// 文字框
	private JTextField resultText = new JTextField("0");
	
	// 標誌使用者按的是否是整個表示式的第一個數字,或者是運算子後的第一個數字
	private boolean firstDigit = true;
	// 計算的中間結果。
	private double resultNum = 0.0;
	// 當前運算的運算子
	private String operator = "=";
	// 操作是否合法
	private boolean operateValidFlag = true;
	
	/**
	 * 建構函式
	 */
	public BorderLayoutWindow(){
		//建立一個名字為“”的視窗
		super("計算器(zmy)");
		//設定視窗的佈局為邊緣佈局
		setLayout(new BorderLayout());
		
		// 編輯選單
		JMenuBar bar = new JMenuBar();
		JMenu menu = new JMenu("編輯");
		JMenuItem item = new JMenuItem("標準型");
		JMenuItem item1 = new JMenuItem("科學型");
		menu.add(item);
		menu.add(item1);
		bar.add(menu);
		this.setJMenuBar(bar);
		
		/*
		 * 		setBorderPainted(false);
         *		去除此元件的邊框。
		 * 		setPreferredSize(Dimension preferredSize)
         *		設定此元件的首選大小。
		 * 		setBackground(Color bg)
		 *		設定此元件的背景色。
		 * 		setForeground(Color fg)
		 * 		設定此元件的前景色。
		 * 		setFont(Font font)
		 * 		設定此元件的字型。
		 *  	Font(String name, int style, int size)
		 *		根據指定名稱、樣式和磅值大小,建立一個新 Font。
		 * 		style:ITALIC = 2, BOLD = 1, PLAIN = 0;
		 */
		//建立具有指定佈局管理器的新皮膚。
		JPanel top = new JPanel(new BorderLayout());
		top.setPreferredSize(new Dimension(0,150));
		JPanel pstr = new JPanel(new GridLayout(5, 5));
		JPanel pkey = new JPanel(new GridLayout(2, 5));
		pstr.setPreferredSize(new Dimension(0,280));
		// 編輯按鈕外觀
		for (int i = 0; i < str.length; i++) {
			buttonstr[i] = new JButton(str[i]);
			if(i==6||i==7||i==8||i==11||i==12||i==13||i==16||i==17||i==18||i==22||i==23){
				buttonstr[i].setForeground(Color.blue);
				buttonstr[i].setFont(new Font("加粗",1,25));
			}
			else if(i%5 == 4 || i == 3)
				buttonstr[i].setFont(new Font("正常",0,25));
			else
				buttonstr[i].setFont(new Font("正常",0,20));
			buttonstr[i].setBackground(new Color(245,245,245));
			buttonstr[i].setBorderPainted(false);
			pstr.add(buttonstr[i]);
		}
		for (int i = 0; i < key.length; i++) {
			buttonkey[i] = new JButton(key[i]);
			buttonkey[i].setFont(new Font("正常",0,18));
			buttonkey[i].setBackground(Color.white);
			buttonkey[i].setBorderPainted(false);
			pkey.add(buttonkey[i]);
		}
		
		top.add("Center", resultText);
		// 文字框中的內容採用右對齊方式
		resultText.setHorizontalAlignment(JTextField.RIGHT);
		// 不允許修改結果文字框
		resultText.setEditable(false);
		// 設定文字框背景顏色為白色
		resultText.setBackground(Color.white);
		resultText.setFont(new Font("加粗",1,50));
		
		getContentPane().add(top, BorderLayout.NORTH);
		getContentPane().add(pkey, BorderLayout.CENTER);
		getContentPane().add(pstr, BorderLayout.SOUTH);
		
		// 為各按鈕新增事件偵聽器
		for (int i = 0; i < str.length; i++) {
			buttonstr[i].addActionListener(this);
		}
		for (int i = 0; i < key.length; i++) {
			buttonkey[i].addActionListener(this);
		}
	}
	
	/**
	 * 處理事件
	 */
	public void actionPerformed(ActionEvent e) {
		// 獲取事件源的標籤
		String label = e.getActionCommand();
		if (label.equals(str[1])) {
			// 使用者按了"CE"鍵
			resultText.setText("0");
		} else if (label.equals(str[2])) {
			// 使用者按了"C"鍵
			// 初始化計算器的各種值
			resultText.setText("0");
			firstDigit = true;
			operator = "=";
		} else if (label.equals(str[3])) {
			// 使用者按了"Backspace"鍵
			handleBackspace();
		} else if ("0123456789.".indexOf(label) >= 0) {
			// 使用者按了數字鍵或者小數點鍵
			handleNumber(label);
		} else if(label.equals(str[5])) {
			// 使用者按了Pi
			if (firstDigit) {
				resultText.setText("3.1415926");
			}
		} else {
			// 使用者按了運算子鍵
			handleOperator(label);
		}
	}
	
	/**
	 * 處理Backspace鍵被按下的事件
	 */
	private void handleBackspace() {
		String text = resultText.getText();
		int i = text.length();
		if (i > 0) {
			// 退格,將文字最後一個字元去掉
			text = text.substring(0, i - 1);
			if (text.length() == 0) {
				// 如果文字沒有了內容,則初始化計算器的各種值
				resultText.setText("0");
				firstDigit = true;
				operator = "=";
			} else {
				// 顯示新的文字
				resultText.setText(text);
			}
		}
	}

	/**
	 * 處理數字鍵被按下的事件
	 */
	private void handleNumber(String key) {
		if (firstDigit) {
			// 輸入的第一個數字
			resultText.setText(key);
		} else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {
			// 輸入的是小數點,並且之前沒有小數點,則將小數點附在結果文字框的後面
			resultText.setText(resultText.getText() + ".");
		} else if (!key.equals(".")) {
			// 如果輸入的不是小數點,則將數字附在結果文字框的後面
			resultText.setText(resultText.getText() + key);
		}
		// 以後輸入的肯定不是第一個數字了
		firstDigit = false;
	}

	/**
	 * 處理運算子鍵被按下的事件
	 */
	private void handleOperator(String key) {
		if (operator.equals("÷")) {
			// 除法運算
			// 如果當前結果文字框中的值等於0
			if (getNumberFromText() == 0.0) {
				// 操作不合法
				operateValidFlag = false;
				resultText.setText("除數不能為零");
			} else {
				resultNum /= getNumberFromText();
			}
		} else if (operator.equals("+")) {
			// 加法運算
			resultNum += getNumberFromText();
		} else if (operator.equals("-")) {
			// 減法運算
			resultNum -= getNumberFromText();
		} else if (operator.equals("×")) {
			// 乘法運算
			resultNum *= getNumberFromText();
		} else if (operator.equals("sqrt")) {
			// 平方根運算
			resultNum = Math.sqrt(resultNum);
		} else if (operator.equals("Mod")) {
			// 模運算
			double temp = getNumberFromText();
			if((int)resultNum == resultNum && (int)temp == temp)
				resultNum = (int)resultNum%(int)temp;
			else{
				operateValidFlag = false;
				resultText.setText("浮點數不能Mod");
			}
		} else if (operator.equals("+/-")) {
			// 正數負數運算
			resultNum = resultNum * (-1);
		} else if (operator.equals("=")) {
			// 賦值運算
			resultNum = getNumberFromText();
		}
		if (operateValidFlag) {
			// 雙精度浮點數的運算
			int t1;
			double t2;
			t1 = (int) resultNum;
			t2 = resultNum - t1;
			if (t2 == 0) {
				resultText.setText(String.valueOf(t1));
			} else {
				resultText.setText(String.valueOf(resultNum));
			}
		}
		// 運算子等於使用者按的按鈕
		operator = key;
		firstDigit = true;
		operateValidFlag = true;
	}

	/**
	 * 從結果文字框中獲取數字
	 */
	private double getNumberFromText() {
		double result = 0;
		try {
			result = Double.valueOf(resultText.getText()).doubleValue();
		} catch (NumberFormatException e) {
		}
		return result;
	}
}

運算這部分是搬別人程式碼的┭┮﹏┭┮

相關文章