📄 simplecalculator.java
字号:
//如果按下的是清空键
if (event == buttonC)
{
reSet();
}
//如果按下的是正负标志键
if (event == buttonSign)
{
if (result!=0)
{
result*=-1;
textBuffer=new StringBuffer(Double.toString(result));
AddNum();
showScreenValue();
}
}
//如果按下的是加法键
if (event == buttonAdd) AddFunction(1);
//如果按下的是减法键
if (event == buttonSub) AddFunction(2);
//如果按下的是乘法键
if (event == buttonMul) AddFunction(3);
//如果按下的是除法键
if (event == buttonDiv) AddFunction(4);
//如果按下的是等号键
if (event == buttonEqual) OnGo();
//如果按下的是根号键
if (event == buttonSqrt)
{
if (result < 0)
{
answerText.setText("负数不能开根号");
}
else
{
result = Math.sqrt(result);
showScreenValue();
b_remFir = true; remFir = result;
enterSecond = false; forFirOrSec = 2;
}
}
//如果按下的是百分号键
if (event == buttonMod)
{
result /= 100;
showScreenValue();
b_remFir = true; remFir = result;
enterSecond = false; forFirOrSec = 2;
}
//如果按下的是倒数键
if (event == buttonReciprocal)
{
result = 1/result;
showScreenValue();
b_remFir = true; remFir = result;
enterSecond = false; forFirOrSec = 2;
}
//内存键操作部分
//如果按下的是MC键
if (event == buttonMC)
{
memory = 0;
memoryState.setText("");
}
//如果按下的是MR键
if (event == buttonMR)
{
//若memory值为整数,怎把小数点后的零给去掉。
int resInteger = (int)memory;
if ( Math.abs(memory-resInteger) == 0 )
{
StringBuffer tmp = new StringBuffer(Double.toString(memory));
tmp.deleteCharAt(tmp.length()-1);
answerText.setText(tmp.toString());
}
else answerText.setText(Double.toString(memory));
if (isNumGroup == true)
{
showNumGroup();
}
}
//如果按下的是MS键
if (event == buttonMS)
{
memory = Double.parseDouble(textBuffer.toString());
memoryState.setText("M");
}
//如果按下的是M+键
if (event == buttonMADD)
{
memory += Double.parseDouble(textBuffer.toString());
}
//如果按下的是关于计算器键
if (event == aboutCal)
{
JOptionPane jop = new JOptionPane();
jop.showMessageDialog(mainFrame,"计算器1.00版\n开发者:胡勇健");
}
}//End actionPerformed(ActionEvent e)
/*
* itemStateChanged(ItemEvent e) 时为菜单项添加相应的属性
*/
public void itemStateChanged(ItemEvent e)
{
Object event = e.getSource();
//如果按下的是数字分组键
if (event == numGroup)
{
if (isNumGroup == true)
{
isNumGroup = false;
deleteNumGroup();
}
else
{
isNumGroup = true;
showNumGroup();
}
}
}
// reSet() 是把各属性设置为原始值
void reSet()
{
answerText.setText("0.");
textBuffer = new StringBuffer("");
numDot=0;
remFun = operator = 0;
firstValue = secondValue = result = 0.0;
enterSecond = false;
forFirOrSec = 1;
b_remFir = b_remSec = b_remFun = false;
remFir = remSec = 0.0;
canBeBack = true;
}
// showScreen() 是当按下了数字键后,在屏幕上显示。如果有数字分组项,
// 则调用数字分组函数。如为整数则在其后只显示一个小数点,例如:数值
// 5 应该显示为 5. 若为小数,则直接显示。
void showScreen()
{
if (numDot==0)
answerText.setText(textBuffer.toString()+".");
else
answerText.setText(textBuffer.toString());
if (isNumGroup == true)
{
showNumGroup();
}
}
// showScreenValue() 是用于显示计算后的结果值,具体的功能同上。
void showScreenValue()
{
int resInteger = (int)result;
if ( Math.abs(result-resInteger) == 0 )
{
StringBuffer tmp = new StringBuffer(Double.toString(result));
tmp.deleteCharAt(tmp.length()-1);
answerText.setText(tmp.toString());
}
else answerText.setText(Double.toString(result));
if (isNumGroup == true)
{
showNumGroup();
}
}
// 数字分组的显示:每隔三位显示一个逗号以示分隔。
void showNumGroup()
{
int i,cnt=0;
String string = answerText.getText();
String interge,fraction;
interge = fraction = string;
for (i=0;i<string.length();i++)
{
if (string.charAt(i)=='.')
{
interge = string.substring(0,i);
fraction = string.substring(i+1,string.length());
break;
}
}
StringBuffer sb = new StringBuffer(interge);
sb.reverse();
for (i=0;i<sb.length() ;i++ )
{
if (Character.isDigit(sb.charAt(i)))
{
cnt++;
if (cnt>3)
{
cnt = 0;
sb.insert(i,",");
}
}
}
sb.reverse();
answerText.setText(sb.toString()+"."+fraction);
}
//deleteNumGroup() 是当已经数字分组时,再次按下该键,消除数字分组的效果;
void deleteNumGroup()
{
StringBuffer sb = new StringBuffer(answerText.getText());
for (int i=0;i<sb.length() ;i++ )
{
if (sb.charAt(i)==',')
{
sb.deleteCharAt(i);
}
}
answerText.setText(sb.toString());
}
//当输入了四则运算符时
void AddFunction(int op)
{
//如果此时第二个数存在.则运算,例如输入2+3=5后按*4 +
if (b_remFir==true && b_remFun==false && enterSecond==true)
{
if (operator == 1) result = remFir + secondValue;
else if (operator == 2) result = remFir - secondValue;
else if (operator == 3) result = remFir * secondValue;
else if (operator == 4) result = remFir / secondValue;
b_remFir = true; remFir = result; enterSecond = false;
forFirOrSec = 2; operator = op;
showScreenValue();
}
//如果此时第二个数存在.则运算,例如输入2+3后按*键
else if (b_remFir==false && b_remFun==false && enterSecond==true)
{
if (operator == 1) result = firstValue + secondValue;
else if (operator == 2) result = firstValue - secondValue;
else if (operator == 3) result = firstValue * secondValue;
else if (operator == 4) result = firstValue / secondValue;
b_remFir = true; remFir = result; enterSecond = false;
forFirOrSec = 2; operator = op;
showScreenValue();
}
else
{
operator = op;
forFirOrSec = 2;
}
b_remFun = false; remFun = 0;
textBuffer = new StringBuffer("");
}
// 把屏幕上的值存入result 和 firstValue secondValue 中。
void AddNum()
{
if (forFirOrSec == 1)
{
result = firstValue = Double.parseDouble(textBuffer.toString());
b_remFir = false; remFir = 0;
}
else if (forFirOrSec == 2)
{
enterSecond = true;
secondValue = Double.parseDouble(textBuffer.toString());
b_remSec = false; remSec = 0;
}
}
//当按下了等于号时
void OnGo()
{
//如果记着第一,二个数和运算符,即上次算完后未输入数,而再次按=
if (b_remFir==true && b_remSec==true && b_remFun==true)
{
if (remFun==1) result = remFir + remSec;
else if (remFun==2) result = remFir - remSec;
else if (remFun==3) result = remFir * remSec;
else if (remFun==4) result = remFir / remSec;
b_remFir=true; b_remSec=true; b_remFun=true;
remFir = result; remSec = remSec; remFun = remFun;
}
//只记的第一数,如算完2+3=5后按*4=
else if (b_remFir==true && b_remSec==false && b_remFun==false)
{
if (operator == 1) result = remFir + secondValue;
else if (operator == 2) result = remFir - secondValue;
else if (operator == 3) result = remFir * secondValue;
else if (operator == 4) result = remFir / secondValue;
b_remFir=true; b_remSec=true; b_remFun=true;
remFir = result; remSec = secondValue; remFun = remFun;
}
//记住了第一个数,未输入第二个数,输入了运算符.如算完2+3=5后按*=结果为5*5=25;
else if (b_remFir==true && b_remSec==true && b_remFun==false)
{
secondValue = remFir;
if (operator == 1) result = remFir + secondValue;
else if (operator == 2) result = remFir - secondValue;
else if (operator == 3) result = remFir * secondValue;
else if (operator == 4) result = remFir / secondValue;
b_remFir=true; b_remSec=true; b_remFun=true;
remFir = result; remSec = secondValue; remFun = remFun;
}
//第一二个数和运算符都不记的,记全重新输入,如算完2+3=5后输入4*6=
else if (b_remFir==false && b_remSec==false && b_remFun==false)
{
if (enterSecond == false) secondValue = firstValue;
if (operator == 1) result = firstValue + secondValue;
else if (operator == 2) result = firstValue - secondValue;
else if (operator == 3) result = firstValue * secondValue;
else if (operator == 4) result = firstValue / secondValue;
b_remFir=true; b_remSec=true; b_remFun=true;
remFir = result; remSec = secondValue; remFun = remFun;
}
showScreenValue();
// if (result - (int)result == 0) textBuffer = new StringBuffer(Integer.toString((int)result));
// else textBuffer = new StringBuffer(Double.toString(result));
textBuffer = new StringBuffer("");
firstValue = secondValue = 0;
forFirOrSec = 1;
enterSecond = false;
canBeBack = false;
}
//以下定义的两个私有成员类是用于复制和粘贴文本区的数字的:
private class CopyNum implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
StringBuffer selection = new StringBuffer(answerText.getText());
if (selection == null)
return;
if ( selection.charAt(selection.length()-1)=='.' )
{
selection.deleteCharAt(selection.length()-1);
}
StringSelection clipString = new StringSelection(selection.toString());
clipbd.setContents(clipString,clipString);
}
};
private class PasteNum implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Transferable clipData = clipbd.getContents(SimpleCalculator.this);
try
{
String clipString = (String)clipData.getTransferData(DataFlavor.stringFlavor);
for (int i=0;i<clipString.length();i++)
{
if ( !(Character.isDigit(clipString.charAt(i)) || clipString.charAt(i)=='.') )
{
clipString = new String("0.");
break;
}
}
answerText.setText(clipString);
}
catch (Exception ex)
{
System.out.println("Couldn't get contents in format: "+
DataFlavor.stringFlavor.getHumanPresentableName());
}
}
};
public static void main(String args[])
{
new SimpleCalculator();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -