/**
* 计算器
* @author 刘兴
*
*/
//定义创建组件
String[] s
={"Backspace",
"CE",
"C",
"MC","7","8","9","/","sqrt",
"MR","4","5","6","*","%",
"MS","1","2","3","-","1/x",
"M+","0","+/-",".","+","="
};
public Calculator() {
this.setLayout(null);
this.add(t);
t.setEditable(false);
t.setBounds(10,10,400,30);
//添加按钮,同时注册监听
for(int i=0;i<27;i++){
b[i].addActionListener(this);//注册监听
b[i].setActionCommand(s[i]);
this.add(b[i]);
}
//下面设置各个按钮之间的距离以及按钮的大小
//前三个按钮设置为大小100,30,间距为10
for(int i=0;i<3;i++){
b[i].setBounds(90+110*i,50,100,30);
}
//剩余的按钮大小相同,只是间距有所不同
int n=3;
for(int i=0;i<4;i++){
for(int j=0;j<6;j++){
if((n-3)%6==0){
b[n].setBounds(10,90+35*i,60,30);
}else{
b[n].setBounds(90+65*(j-1),90+35*i,60,30);
}
n++;
}
}
//设置菜单
this.setJMenuBar(jmb);
jmb.add(jm1);
jmb.add(jm2);
jmb.add(jm3);
jmi1.setMnemonic('C');
jmi2.setMnemonic('V');
jm1.add(jmi1);
jm1.add(jmi2);
jmi1.addActionListener(this);//注册菜单监听
jmi2.addActionListener(this);
jmi1.setActionCommand("copy");
jmi2.setActionCommand("paste");
//设置窗体
this.setTitle("计算器");
this.setIconImage(icon.getImage());
this.setSize(430,290);
this.setLocation(200,200);
this.
setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
}
public static void main
(String[] args
) {
new Calculator();
}
String showString
= "";//要显示的字符串
int dotCount = 0;//点击小数点的次数
int j = 0;//用来表示是第几个操作数
int op = -1; //操作类型,0:/;1:*;2:-;3:+;4:%
int flag = 0;
@Override
String comand
= e.
getActionCommand();
if("copy".equals(comand)){
copyedString = t.getText();
}
if("paste".equals(comand)){
if(!("".equals(copyedString))){
showString = copyedString;
text[j] = copyedString;
}
}
for(int i = 4; i<7; i++){ //点击7、8、9
if(s[i].equals(comand)) text[j] += s[i];
showString = text[j];
}
for(int i = 10; i<13; i++){//点击4、5、6
if(s[i].equals(comand)) text[j] += s[i];
showString = text[j];
}
for(int i = 16; i<19; i++){//点击1、2、3
if(s[i].equals(comand)) text[j] += s[i];
showString = text[j];
}
if(s[22].equals(comand)) {//点击0
text[j] += s[22];
showString = text[j];
}
if(s[24].equals(comand)){ //点击".",只允许点一次,点第二次不给反应
if(dotCount == 0) {
text[j] += s[24];
showString = text[j];
dotCount ++;
}
}
if(s[7].equals(comand)){//点击"/"
showString = operator();
text[0] = showString;
text[1] = "";
op = 0;
j = 1;//下面要换成text[1]来记录第二个操作数
}
if(s[13].equals(comand)){//点击"*",只能点一次
showString = operator();
text[0] = showString;
text[1] = "";
op = 1;
j = 1;//下面要换成text[1]来记录第二个操作数
}
if(s[19].equals(comand)){//点击"-",只能点一次
showString = operator();
text[0] = showString;
text[1] = "";
op = 2;
j = 1;//下面要换成text[1]来记录第二个操作数
}
if(s[25].equals(comand)){//点击"+",只能点一次
showString = operator();
text[0] = showString;
text[1] = "";
op = 3;
j = 1;//下面要换成text[1]来记录第二个操作数
}
if(s[14].equals(comand)){//点击%
if(j==0) {
op = 4;
j = 1;
}
}
if(s[0].equals(comand)){//点击Backspace
int len = text[j].length();
if(len > 0){
text[j] = text[j].substring(0,text[j].length()-1);
showString = text[j];
}
}
if(s[2].equals(comand)){//点击c
text[j] = "";
showString = "";
}
if(s[23].equals(comand)){//点击+/-
if(flag == 0){
text[j] = "-"+text[j];
showString = text[j];
flag = 1;
}else if(flag==1){
text[j] = showString.substring(1,showString.length());
showString = text[j];
flag = 0;
}
System.
out.
println("flag===="+flag
);
}
if(s[26].equals(comand)){//点击=
showString = operator();
}
if(s[1].equals(comand)){//点击CE
//此处直接将所有的数据全部恢复初始值,同时将文本框中的数值清空
text[0] = "";
text[1] = "";
t.setText("");
showString = "";
dotCount = 0;
op = -1;
j = 0;
}
if(s[20].equals(comand)){//点击1/x
if(!("".equals(text[j]))){
double num
= Double.
parseDouble(text
[j
]);
num = 1/num;
text[j] = num+"";
showString = num+"";
}
}
if(s[8].equals(comand)){//点击sqrt
if(!("".equals(text[j]))){
double num
= Double.
parseDouble(text
[j
]);
text[j] = dealResult(num+"");
showString = text[j];
}
}
t.setText(showString);
}
public String operator
(){//进行计算
if("".equals(text[1]) || "".equals(text[0])){
return text[0];
}
double op1
= Double.
parseDouble(text
[0]);//得到第一个操作数
double op2
= Double.
parseDouble(text
[1]);//得到第二个操作数
double result = 0.0;
//进行计算
switch (op) {
case 0://除
if(op2 != 0){//除法时第二操作数不能是0
result = op1 / op2;
}
break;
case 1://乘
result = op1*op2;
break;
case 2://减
result = op1-op2;
break;
case 3://加
result = op1 + op2;
break;
case 4:
int mu1 = (int)op1;
int mu2 = (int)op2;
if((op1 == mu1) && (op1 == mu2)){//整除需要两个操作数都是整数
result = (int)op1%(int)op2;
}else{
result = op2;
}
break;
default:
break;
}
resString = dealResult(resString);
return resString;
}
int dotpos = resString.indexOf(".");
if(resString.substring(dotpos+1, resString.length()).equals("0")){
resString = resString.substring(0,dotpos);
}
return resString;
}
}