import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//calculator
public class Calculator extends JFrame{
public Calculator(){
setTitle("计算器");
Container con=getContentPane();
con.add(new CalPanel());
setSize(250,250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]){
new Calculator();
}
}
class CalPanel extends JPanel implements ActionListener{
JTextField txt;
JButton [] jb=new JButton[10];
JButton jbadd,jbreduce,jbride,jbdivide,jbequal;
JButton jbcancel,jbsign,jbpoint;
int pointF=0;
int signF=0;
double temp1,temp2;
boolean f=true;
char ch='/0';
public CalPanel(){
//初始化
txt=new JTextField("0");
txt.setHorizontalAlignment(JTextField.RIGHT);
txt.setEditable(false);
txt.setBackground(Color.PINK);
txt.setForeground(Color.blue);
txt.addKeyListener(new MyKeyAdapter());
addKeyListener(new MyKeyAdapter());
jbadd=new JButton("+");
jbadd.addActionListener(this);
jbadd.addKeyListener(new MyKeyAdapter());
jbreduce=new JButton("-");
jbreduce.addActionListener(this);
jbreduce.addKeyListener(new MyKeyAdapter());
jbride=new JButton("*");
jbride.addActionListener(this);
jbride.addKeyListener(new MyKeyAdapter());
jbdivide=new JButton("/");
jbdivide.addActionListener(this);
jbdivide.addKeyListener(new MyKeyAdapter());
jbequal=new JButton("=");
jbequal.addActionListener(this);
jbequal.addKeyListener(new MyKeyAdapter());
jbcancel=new JButton("C");
jbcancel.addActionListener(this);
jbcancel.addKeyListener(new MyKeyAdapter());
jbsign=new JButton("+/-");
jbsign.addActionListener(this);
jbsign.addKeyListener(new MyKeyAdapter());
jbpoint=new JButton(".");
jbpoint.addActionListener(this);
jbpoint.addKeyListener(new MyKeyAdapter());
for(int i=0;i<10;i++){
jb[i]=new JButton(i+"");
jb[i].addActionListener(this);
jb[i].addKeyListener(new MyKeyAdapter());
}
setLayout(new BorderLayout());
JPanel p=new JPanel();
add(txt,BorderLayout.NORTH);
add(p);
p.setLayout(new GridLayout(5,4));
p.add(new JLabel(""));
p.add(new JLabel(""));
p.add(jbsign);
p.add(jbcancel);
p.add(jb[7]);
p.add(jb[8]);
p.add(jb[9]);
p.add(jbdivide);
p.add(jb[4]);
p.add(jb[5]);
p.add(jb[6]);
p.add(jbride);
p.add(jb[1]);
p.add(jb[2]);
p.add(jb[3]);
p.add(jbreduce);
p.add(jb[0]);
p.add(jbpoint);
p.add(jbequal);
p.add(jbadd);
}
//按钮事件
public void actionPerformed(ActionEvent e){
//小数点
if(e.getSource()==jbpoint){
if(pointF==0){
pointF=1;
txt.setText(txt.getText()+".");
}
}
else if(e.getSource()==jbcancel){ //清除C
txt.setText("0");
pointF=0;
temp1=0;
f=true;
signF=0;
ch='/0';
}
else if(e.getSource()==jbsign){ //符号
if(signF==0){
if(!txt.getText().equals("0")){
txt.setText("-"+txt.getText());
signF=1;
}
}
else{
signF=0;
txt.setText(txt.getText().substring(1,txt.getText().length()));
}
}
else if(e.getSource()==jbequal){ //等号
switch(ch){
case '+':
txt.setText(Add(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
case '-':
txt.setText(Reduce(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
case '*':
txt.setText(Ride(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
case '/':
if(Double.parseDouble(txt.getText())==0){
txt.setText("除数不能为0");
break;
}
txt.setText(Divide(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
}
}
else if(e.getSource()==jbadd){ //加号
temp1=Double.parseDouble(txt.getText());
f=false;
ch='+';
signF=0;
pointF=0;
}
else if(e.getSource()==jbreduce){ //减号
temp1=Double.parseDouble(txt.getText());
f=false;
ch='-';
signF=0;
pointF=0;
}
else if(e.getSource()==jbride){ //乘号
temp1=Double.parseDouble(txt.getText());
f=false;
ch='*';
signF=0;
pointF=0;
}
else if(e.getSource()==jbdivide){ //除号
temp1=Double.parseDouble(txt.getText());
f=false;
ch='/';
signF=0;
pointF=0;
}
else{ //数字
for(int i=0;i<10;i++){
if(e.getSource()==jb[i]){
if(!f){
txt.setText("0");
f=true;
}
txt.setText(txt.getText()+jb[i].getText());
if(pointF==0 && txt.getText().substring(0,1).equals("0")){
txt.setText(jb[i].getText());
}
}
}
}
}
//加法
public double Add(double a,double b){
return (a+b);
}
//减法
public double Reduce(double a,double b){
return (a-b);
}
//乘法
public double Ride(double a,double b){
return (a*b);
}
//除发
public double Divide(double a,double b){
return(a/b);
}
private class MyKeyAdapter extends KeyAdapter{
public void keyPressed(KeyEvent e){
//清除
if(e.getKeyCode()==27){
txt.setText("0");
pointF=0;
temp1=0;
f=true;
signF=0;
ch='/0';
}
//回车
if(e.getKeyCode()==10){
switch(ch){
case '+':
txt.setText(Add(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
case '-':
txt.setText(Reduce(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
case '*':
txt.setText(Ride(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
case '/':
if(Double.parseDouble(txt.getText())==0){
txt.setText("除数不能为0");
break;
}
txt.setText(Divide(temp1,Double.parseDouble(txt.getText()))+"");
temp1=Double.parseDouble(txt.getText());
break;
}
}
}
public void keyTyped(KeyEvent e){
//数字
if(e.getKeyChar()>='0' && e.getKeyChar()<='9'){
for(int i=0;i<10;i++){
if(e.getKeyChar()==jb[i].getText().charAt(0)){
if(!f){
txt.setText("0");
f=true;
}
txt.setText(txt.getText()+jb[i].getText());
if(pointF==0 && txt.getText().substring(0,1).equals("0")){
txt.setText(jb[i].getText());
}
}
}
}
//运算符
//小数点
if(e.getKeyChar()=='.'){
if(pointF==0){
pointF=1;
txt.setText(txt.getText()+".");
}
}
//加号
if(e.getKeyChar()=='+'){
temp1=Double.parseDouble(txt.getText());
f=false;
ch='+';
signF=0;
pointF=0;
}
//减号
if(e.getKeyChar()=='-'){
temp1=Double.parseDouble(txt.getText());
f=false;
ch='-';
signF=0;
pointF=0;
}
//乘号
if(e.getKeyChar()=='*'){
temp1=Double.parseDouble(txt.getText());
f=false;
ch='*';
signF=0;
pointF=0;
}
//除号
if(e.getKeyChar()=='/'){
temp1=Double.parseDouble(txt.getText());
f=false;
ch='/';
signF=0;
pointF=0;
}
}
}
}