📄 calculator.java
字号:
/*
* 创建日期 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 + -