⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.java

📁 java做的一个计算器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 创建日期 2005-12-25
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package 计算器2;

/**
 * @author T~Master
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */



import java.awt.Color;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

/**
 * Calculator - perform calculation as Microsoft's calculator 
 * @copyright Information  :  no limitation, it's shared for study 
 * @author                 :  syakun
 * JDK version used        :  jdk1.4.2
 * @version                :  CalculatorElements.java, v0.1 2005/07/06 12:00:00 $
 * @modified information   :  oncetime : modified on 2005/11/12
 */
public class Calculator extends CalculatorElements {
	public static char chrStates;

	public static String OP_1, OP, OP_2, Result, Zensousa;

	public static boolean IS_OP1_EDITED;

	public static boolean IS_OP2_EDITED;

	public static boolean IS_RESULT_EDITED;

	public static boolean NUMBER_HAS_DOT;

	public static boolean KUGIRU;

	// constructor
	public Calculator() {
		super.elments_init();
	}

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Calculator calculator = new Calculator();
		calculator.dispose();
	}

	public void dispose() {
		chrStates = 'A';
		reset();
		KUGIRU = false;
		fraMain.setResizable(false);
		fraMain.setBackground(Color.LIGHT_GRAY);
		fraMain.pack();
		fraMain.setVisible(true);
		event_set();
	}

	public static void reset() {
		OP_1 = "";
		OP = "";
		OP_2 = "";
		Result = "";
		chrStates = 'A';
		Zensousa = "";
		IS_OP1_EDITED = false;
		IS_OP2_EDITED = false;
		IS_RESULT_EDITED = false;
		NUMBER_HAS_DOT = false;
		txfDisplay.setBufText("0");
	}

	public void event_set() {
		// the main window's event
		fraMain.addWindowListener(new WindowHandler());
		// the menu items' event
		itemCalComm.addActionListener(new MenuItemHandler());
		itemCalFunc.addActionListener(new MenuItemHandler());
		itemKetakugiru.addItemListener(new MenuItemHandler());
		itemCalComm.addActionListener(new MenuItemHandler());
		itemCalFunc.addActionListener(new MenuItemHandler());
		itemCopy.addActionListener(new MenuItemHandler());
		itemPaste.addActionListener(new MenuItemHandler());
		itemTopicFind.addActionListener(new MenuItemHandler());
		itemVersion.addActionListener(new MenuItemHandler());
		ButtonGroup CalType = new ButtonGroup();
		CalType.add(itemCalComm);
		CalType.add(itemCalFunc);
		// the buttons' event
		for (int i = 0; i < 10; i++) {
			btnNum[i].addActionListener(new ButtonHandler());
		}
		btnPlus.addActionListener(new ButtonHandler());
		btnSub.addActionListener(new ButtonHandler());
		btnMulti.addActionListener(new ButtonHandler());
		btnDiv.addActionListener(new ButtonHandler());
		btnDot.addActionListener(new ButtonHandler());
		btnEquals.addActionListener(new ButtonHandler());
		btnSqrt.addActionListener(new ButtonHandler());
		btnParcent.addActionListener(new ButtonHandler());
		btnRecip.addActionListener(new ButtonHandler());
		btnPn.addActionListener(new ButtonHandler());
		btnMc.addActionListener(new ButtonHandler());
		btnMr.addActionListener(new ButtonHandler());
		btnMs.addActionListener(new ButtonHandler());
		btnMp.addActionListener(new ButtonHandler());
		btnBack.addActionListener(new ButtonHandler());
		btnCe.addActionListener(new ButtonHandler());
		btnC.addActionListener(new ButtonHandler());

		// the key event
		fraMain.addKeyListener(new KeyHandler());

	}

	/*
	 * A, B, C, R, E is 5 states in my calculator
	 *   A: OP1 state, OP1 is preparing.
	 *   B: OP  state, OP  is preparing.
	 *   C: OP2 state, OP2 is preparing.
	 *   R: Result state.
	 *   E: Error  state, in this state calculator will not work
	 *      until [C] or [CE] button is pressed. 
	 * (a, b, c, d, e, f, g, h, m) are inputed data's types,
	 *   their meanings are showed as follows:
	 *   a: number(0~9)
	 *   b: operator type 1 (+, -, *, /)
	 *   c: operator type 2 (sqrt, %, +/-, 1/x)
	 *   d: operator type 3 (=)
	 *   e: operation--Backspace  (Back)
	 *   f: operation--Set current number to zero (CE)
	 *   g: operation--Reset  (C)
	 *   h: dot  (".")
	 *   m: memory operation (MC, MR, MS, MP)
	 * */
	public static void state_A_dispose(String strActionCmd) {
		chrStates = 'A';
		//Flag's initializing
		if (txfDisplay.getBufText().equals("0"))
			IS_OP1_EDITED = false;
		if (txfDisplay.getBufText().indexOf(".") >= 0)
			NUMBER_HAS_DOT = true;
		else
			NUMBER_HAS_DOT = false;

		if (strActionCmd.length() == 1
				&& Character.isDigit(strActionCmd.charAt(0))) {// a: 0~9
			if (!IS_OP1_EDITED) {// is not edited
				txfDisplay.setBufText(strActionCmd);
				IS_OP1_EDITED = true;
			} else {
				txfDisplay.concatBufText(strActionCmd);
			}
		} else if (CalUtil.isOperator1(strActionCmd)) {// b: + - * /
			OP_1 = txfDisplay.getBufText();
			OP = strActionCmd;
			chrStates = 'B';
		} else if (CalUtil.isOperator2(strActionCmd)) {// c: operator2=>
													   // sqrt,%,+/-,1/x
			if (strActionCmd.equals("%")) {
				reset();
				return;
			}
			String strTemp = CalUtil.calculate(txfDisplay.getBufText(),
					strActionCmd);
			if (strTemp.length() == 4 && strTemp.startsWith("ERR")) {
				CalUtil.show_error_msg(txfDisplay, Integer.parseInt(strTemp
						.substring(3)));
				chrStates = 'E';
				return;
			} else {
				txfDisplay.setBufText(strTemp);
				IS_OP1_EDITED = false;
			}
		} else if (strActionCmd.equals("=")) {// d: =
			IS_OP1_EDITED = false;
		} else if (strActionCmd.equals("Back")) {// e: Back
			txfDisplay.backSpace(IS_OP1_EDITED);
		} else if (strActionCmd.equals("CE")) {// f: CE
			txfDisplay.setBufText("0");
		} else if (strActionCmd.equals("C")) {// g: Reset
			Calculator.reset();
		} else if (strActionCmd.equals(".")) {// h: Dot
			if (NUMBER_HAS_DOT)
				return;
			else {// no dot
				txfDisplay.concatBufText(strActionCmd);
				NUMBER_HAS_DOT = true;
				IS_OP1_EDITED = true;
			}
		} else if (CalUtil.isMemOp(strActionCmd)) {// m: memory operation
			char chrTemp = strActionCmd.charAt(1);
			switch (chrTemp) {
			case 'C':
				lblMem.memory_mc();
				break;
			case 'R':
				lblMem.memory_mr(txfDisplay);
				IS_OP1_EDITED = false;
				break;
			case 'S':
				lblMem.memory_ms(txfDisplay.getBufText());
				IS_OP1_EDITED = false;
				break;
			case '+':
				if (!txfDisplay.getBufText().equals("0")) {
					lblMem.memory_mp(txfDisplay.getBufText());
				}
				IS_OP1_EDITED = false;
				break;
			default:
			}
		} else {
			return;
		}
	}

	public static void state_B_dispose(String strActionCmd) {
		chrStates = 'B';
		if (strActionCmd.length() == 1
				&& Character.isDigit(strActionCmd.charAt(0))) {// a: 0~9
			txfDisplay.setBufText(strActionCmd);
			chrStates = 'C';
			IS_OP2_EDITED = true;
			return;
		} else if (CalUtil.isOperator1(strActionCmd)) {// b: + - * /
			OP = strActionCmd;
		} else if (CalUtil.isOperator2(strActionCmd)) {// c: operator2=>
													   // sqrt,%,+/-,1/x
			String strTemp = "";
			if (OP.equals("%")) {
				strTemp = CalUtil.calculate(OP_1, OP, OP_1);
			} else {
				strTemp = CalUtil.calculate(OP_1, strActionCmd);
			}
			if (strTemp.length() == 4 && strTemp.startsWith("ERR")) {
				CalUtil.show_error_msg(txfDisplay, Integer.parseInt(strTemp
						.substring(3)));
				chrStates = 'E';
				return;
			} else {// calculated without error
				txfDisplay.setBufText(strTemp);
				chrStates = 'C';
				IS_OP2_EDITED = true;
				return;
			}
		} else if (strActionCmd.equals("=")) {// d: =
			if (Zensousa.equals("M+")) {
				OP = "";
				chrStates = 'A';
				IS_OP1_EDITED = false;
				return;
			}
			OP_2 = txfDisplay.getBufText();
			String strTemp = CalUtil.calculate(OP_1, OP, OP_2);
			if (strTemp.length() == 4 && strTemp.startsWith("ERR")) {
				CalUtil.show_error_msg(txfDisplay, Integer.parseInt(strTemp
						.substring(3)));
				chrStates = 'E';
				return;
			} else {// calculated without error
				txfDisplay.setBufText(strTemp);
				Result = strTemp;
				chrStates = 'R';
				IS_RESULT_EDITED = false;
				return;
			}
		} else if (strActionCmd.equals("CE")) {// f: CE
			state_C_dispose("0");
		} else if (strActionCmd.equals("C")) {// g: Reset
			Calculator.reset();
		} else if (strActionCmd.equals(".")) {// h: Dot
			txfDisplay.setBufText("0.");
			NUMBER_HAS_DOT = true;
			IS_OP2_EDITED = true;
			chrStates = 'C';
		} else if (CalUtil.isMemOp(strActionCmd)) {
			char chrTemp = strActionCmd.charAt(1);
			switch (chrTemp) {
			case 'C':
				lblMem.memory_mc();
				break;
			case 'R':
				txfDisplay.setBufText(lblMem.get_MemValue());
				chrStates = 'C';
				IS_OP2_EDITED = false;
				break;
			case 'S':
				lblMem.memory_mc();
				break;
			case '+':
				break;
			default:
			}
		}
	}

	public static void state_C_dispose(String strActionCmd) {
		chrStates = 'C';
		//Flag's initializing
		if (txfDisplay.getBufText().equals("0"))
			IS_OP2_EDITED = false;
		if (txfDisplay.getBufText().indexOf(".") >= 0)
			NUMBER_HAS_DOT = true;
		else
			NUMBER_HAS_DOT = false;

		if (strActionCmd.length() == 1
				&& Character.isDigit(strActionCmd.charAt(0))) {// a: 0~9
			if (!IS_OP2_EDITED) {// is not edited
				txfDisplay.setBufText(strActionCmd);
				IS_OP2_EDITED = true;
			} else {
				txfDisplay.concatBufText(strActionCmd);
			}
		} else if (CalUtil.isOperator1(strActionCmd)) {// b: + - * /
			OP_2 = txfDisplay.getBufText();
			String strTemp = CalUtil.calculate(OP_1, OP, OP_2);
			if (strTemp.length() == 4 && strTemp.startsWith("ERR")) {
				CalUtil.show_error_msg(txfDisplay, Integer.parseInt(strTemp
						.substring(3)));
				chrStates = 'E';
				return;
			} else {// calculated without error
				txfDisplay.setBufText(strTemp);
				OP_1 = strTemp;
				OP = strActionCmd;
				chrStates = 'B';
				return;
			}
		} else if (CalUtil.isOperator2(strActionCmd)) {// c: operator2=>
													   // sqrt,%,+/-,1/x
			String strTemp = "";
			if (strActionCmd.equals("%")) {
				strTemp = CalUtil.calculate(OP_1, strActionCmd, txfDisplay
						.getBufText());
			} else {
				strTemp = CalUtil.calculate(txfDisplay.getBufText(),
						strActionCmd);
			}
			if (strTemp.length() == 4 && strTemp.startsWith("ERR")) {
				CalUtil.show_error_msg(txfDisplay, Integer.parseInt(strTemp
						.substring(3)));
				chrStates = 'E';
				return;
			} else {// calculated without error
				txfDisplay.setBufText(strTemp);
				return;
			}
		} else if (strActionCmd.equals("=")) {// d: =
			OP_2 = txfDisplay.getBufText();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -