📄 calculator.java~1~
字号:
package bookmanager;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.math.BigDecimal;
class calculator extends JFrame implements ActionListener//这个类用来实现计算器
{
final int INIT=0,RUN=1,ERROR=2,ADD=1,SUB=2,MUL=3,DIV=4;
JTextField screen;
JButton button[]=new JButton[20];
JPanel panel;
String buttonname[]={"7","8","9","/","C","4","5",
"6","*","S","1","2","3","-","%","0",".","←","+","="};
BigDecimal accumulator=new BigDecimal(0);
BigDecimal number=new BigDecimal(0);
boolean decimal=false;
int state=INIT,operate=INIT;
boolean counfinish=true,inputfinish=true;
public calculator()
{
super("计算器");
Container container=getContentPane();
screen=new JTextField();
screen.addKeyListener(
new KeyAdapter()
{
public void KeyTyped(KeyEvent ke)
{
char ch=ke.getKeyChar();
JButton action=null;
switch(ch)
{
case '7':action=button[0];break;
case '8':action=button[1];break;
case '9':action=button[2];break;
case '/':action=button[3];break;
case '4':action=button[5];break;
case '5':action=button[6];break;
case '6':action=button[7];break;
case '*':action=button[8];break;
case '1':action=button[10];break;
case '2':action=button[11];break;
case '3':action=button[12];break;
case '-':action=button[13];break;
case '0':action=button[15];break;
case '.':action=button[16];break;
case '+':action=button[18];break;
default:action=null;
}
if(ke.getKeyChar()==KeyEvent.VK_ENTER)
action=button[19];
if(ke.getKeyChar()==KeyEvent.VK_BACK_SPACE)
action=button[17];
actionmanage(action,ch+"");
}
}
);
screen.setText("0.");
screen.setHorizontalAlignment(JTextField.RIGHT);
screen.setBackground(Color.white);
screen.setEditable(false);
container.add(screen,BorderLayout.NORTH);
Panel panel=new Panel();
panel.setLayout(new GridLayout(4,5,5,5));
for(int i=0;i<buttonname.length;i++)
{
button[i]=new JButton(buttonname[i]);
button[i].addActionListener(this);
panel.add(button[i]);
}
container.add(panel,BorderLayout.SOUTH);
setSize(270,190);
show();
}
public void actionPerformed(ActionEvent ae)
{
JButton action=(JButton)ae.getSource();
actionmanage(action,ae.getActionCommand());
screen.grabFocus();
}
private void actionmanage(JButton action,String num)
{
if(!(state==ERROR && action!=button[4]))
{
for(int i=0;i<button.length;i++)
{
if(action==button[i])
{
switch(i)
{
case 3:
{
manageoperation();
operate=DIV;
};
break;
case 4:
{
screen.setText("0.");
operate=INIT;
state=INIT;
decimal=false;
accumulator=BigDecimal.valueOf(0);
number=BigDecimal.valueOf(0);
counfinish=true;
inputfinish=true;
};
break;
case 8:
{
manageoperation();
operate=MUL;
};
break;
case 9:
squareRoot();
break;
case 13:
{
manageoperation();
operate=SUB;
};
break;
case 14:
{
pressequals();
if(operate==DIV)
{
accumulator=accumulator.movePointRight(2);
setscreentext(accumulator);
}
};
break;
case 16:
decimal=true;
break;
case 17:
{
if(!counfinish)
backspace();
};
break;
case 18:
{
manageoperation();
operate=ADD;
};
break;
case 19:
pressequals();
break;
default:
pressnumber(num);
break;
}
}
}
}
}
private void squareRoot()
{
String result=screen.getText();
double num=Double.parseDouble(result);
if(num<0)
{
state=ERROR;
screen.setText("负数不能开根号!");
}
else
{
num=Math.sqrt(num);
result=num+"";
char ch=result.charAt(result.length()-1);
while(ch=='0')
{
result=result.substring(0,result.length()-1);
ch=result.charAt(result.length()-1);
}
screen.setText(result);
}
inputfinish=true;
}
private void pressequals()
{
inputfinish=true;
decimal=false;
if((!counfinish) || (counfinish && state==RUN))
number=new BigDecimal(screen.getText());
state=INIT;
count(operate);
}
private void manageoperation()
{
inputfinish=true;
decimal=false;
if(!counfinish)
{
if(state!=INIT)
{
number=new BigDecimal(screen.getText());
count(operate);
}
else
{
state=RUN;
counfinish=true;
accumulator=new BigDecimal(screen.getText());
}
}
}
private void count(int operate)
{
switch(operate)
{
case 1:
accumulator=accumulator.add(number);
break;
case 2:
accumulator=accumulator.subtract(number);
break;
case 3:
accumulator=accumulator.multiply(number);
break;
case 4:
{
try
{
accumulator=accumulator.divide(number,15,5);
}catch(ArithmeticException ae){
state=ERROR;
}
};
break;
}
setscreentext(accumulator);
if(state==ERROR)
screen.setText("除数不能为零!");
counfinish=true;
}
private void setscreentext(BigDecimal number)
{
String result=number.toString();
if(result.indexOf(".")!=(-1))
{
char ch=result.charAt(result.length()-1);
while(ch=='0')
{
result=result.substring(0,result.length()-1);
ch=result.charAt(result.length()-1);
}
}
else
{
result+=".";
}
screen.setText(result);
}
private void backspace()
{
try
{
if(screen.getText().length()==2 || screen.getText().length()==3 && decimal==true)
screen.setText("0.");
else if(decimal==false)
{
screen.setText(screen.getText(0,screen.getText().length()-2)+".");
}
else if(decimal==true)
{
if(screen.getText(screen.getText().length()-1,1).equals("."))
decimal=false;
else
screen.setText(screen.getText(0,screen.getText().length()-1));
}
}catch(Exception e){}
}
private void pressnumber(String num)
{
if(inputfinish)
{
screen.setText("0.");
inputfinish=false;
}
counfinish=false;
if(screen.getText().equals("0.") && decimal==false)
screen.setText(num+".");
else
{
if(decimal==false)
{
try
{
screen.setText(screen.getText(0,screen.getText().length()-1)+num+".");
}catch(Exception e){}
}
else
{
screen.setText(screen.getText()+num);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -