java swing实现的计算器

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

  
import java.awt.Color;  
import java.awt.Dimension;  
import java.awt.Font;  
import java.awt.Rectangle;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.math.BigDecimal;  
  
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JTextField;  
  
public class Calculator extends JFrame implements ActionListener{  
    private JTextField text;  
    private BigDecimal bigDecimal_a,bigDecimal_b,bigDecimal_result;  
    private boolean isFirst=true,isPoint=true,isEqual=false;  
    private String str;  
    private int operator;  
    private JButton[] jbtns=new JButton[21];  
    private String[] buttonName={"",  
                                 "±","C","←","÷",  
                                 "7","8","9","×",  
                                 "4","5","6","+",  
                                 "1","2","3","-" ,  
                                 "0",".","=",""};  
    public Calculator(){  
        super("计算器");  
        Dimension dim=this.getToolkit().getScreenSize();  
        this.getContentPane().setLayout(null);  
        //this.getContentPane().setBackground(Color.CYAN);  
        this.setBounds(dim.width*2/5, dim.height/4, dim.width/4, dim.height/2);  
        this.setResizable(false);  
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);  
        text=new JTextField(20);  
        text.setBounds(new Rectangle(5, 3, 325, 40));  
        text.setHorizontalAlignment(JTextField.RIGHT);  
        text.setBackground(Color.CYAN);  
        this.getContentPane().add(text);  
        int count=1;  
        for(int i=1;i<20;i++){  
            jbtns[i]=new JButton();  
            jbtns[i] = new JButton(buttonName[i]);  
            jbtns[i].addActionListener(this);  
            this.getContentPane().add(jbtns[i]);  
            int k=i%4;  
            if(i%4==0){  
                k=4;  
                jbtns[i].setBounds(5+(k-1)*85, 60*count, 70, 42);  
                count++;  
            }else{  
                jbtns[i].setBounds(5+(k-1)*85, 60*count, 70, 42);  
            }  
        }  
        jbtns[19].setBounds(5+2*85, 300, 155, 42);  
  
        text.setFont(new Font("xjj",Font.BOLD,20));  
          
        this.setVisible(true);  
    }  
      
    public static void main(String[] args) {  
        new Calculator();  
    }  
  
    public void actionPerformed(ActionEvent e) {  
        if(e.getSource()==jbtns[19]){  
            str=text.getText();  
            if(!haveSign(str) && !isEqual){  
                return ;  
            }  
            int i=calculator();  
            if(i==0){  
                return ;  
            }  
            isEqual=true;  
            isFirst=true;  
            text.setText(""+bigDecimal_result);  
        }  
        if(e.getSource()==jbtns[18] && isPoint ){  
            isAddPoint();  
            String s=str.substring(0,str.length()-1);  
            if(havePoint(s)){  
                return ;  
            }  
            isEqual=false;  
            isPoint=false;  
            text.setText(str);  
        }  
        if(e.getSource()==jbtns[1]){  
            str=text.getText();  
            if(str.length()==0){  
                str="-";  
                text.setText(str);  
                return ;  
            }  
            if(str.charAt(str.length()-1)=='-'||str.charAt(str.length()-1)=='+'||str.charAt(str.length()-1)=='×'||str.charAt(str.length()-1)=='÷'){  
                str=str+"-";  
                text.setText(str);  
                return ;  
            }  
        }  
        if(e.getSource()==jbtns[3]&& !isEqual){  
            str=text.getText();  
            if(str.length()==0){  
                return ;  
            }  
            if(str.length()==1){  
                str="";  
            }  
            if(str.length()>=2){  
                if(str.charAt(str.length()-1)=='÷' || str.charAt(str.length()-1)=='×' ||str.charAt(str.length()-1)=='+' ||str.charAt(str.length()-1)=='-'){  
                    isFirst=true;  
                }  
                str=str.substring(0, str.length()-1);  
                if(havePoint(str)){  
                    isPoint=false;  
                }else{  
                    isPoint=true;  
                }  
            }  
            text.setText(str);  
            return ;  
        }  
        if(e.getSource()==jbtns[2]){  
            str="";  
            isFirst=true;isPoint=true;isEqual=false;  
            text.setText(str);  
            return ;  
        }  
        JButton jbtn=(JButton)e.getSource();  
        if(jbtn.getText().compareTo("0")>=0 && jbtn.getText().compareTo("9") <=0){  
            str=text.getText()+jbtn.getText();  
            isEqual=false;  
            text.setText(str);  
        }  
        for(int i=4;i<=16;i+=4){  
            if(e.getSource()==jbtns[i]&&isFirst){  
                str=text.getText();  
                if(str.length()==0){  
                    return ;  
                }  
                isEqual=false;  
                operator=i;  
                str=text.getText()+jbtns[i].getText();  
                isFirst=false;  
                isPoint=true;  
                text.setText(str);  
            }  
        }  
    }  
  
    private int calculator() {  
        str=text.getText();  
        if(operator==4){  
            String[] string=str.split("÷");  
            if(string.length==1){  
                bigDecimal_result=bigDecimal_result.divide(bigDecimal_b,5,BigDecimal.ROUND_HALF_UP);  
                bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
                return 1;  
            }  
            bigDecimal_a=new BigDecimal(string[0]);  
            bigDecimal_b=new BigDecimal(string[1]);  
            if(bigDecimal_b.compareTo(BigDecimal.ZERO)==0){  
                return 0;  
            }  
            bigDecimal_result=bigDecimal_a.divide(bigDecimal_b,20,BigDecimal.ROUND_HALF_UP);  
            bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
              
        }  
        if(operator==8){  
            String[] string=str.split("×");  
            if(string.length==1){  
                bigDecimal_result=bigDecimal_result.multiply(bigDecimal_b);  
                bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
                return 1;  
            }  
            bigDecimal_a=new BigDecimal(string[0]);  
            bigDecimal_b=new BigDecimal(string[1]);  
            bigDecimal_result=bigDecimal_a.multiply(bigDecimal_b);  
            bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
        }  
        if(operator==12){  
            String[] string=str.split("+");  
            if(string.length==1){  
                bigDecimal_result=bigDecimal_result.add(bigDecimal_b);  
                bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
                return 1;  
            }  
            bigDecimal_a=new BigDecimal(string[0]);  
            bigDecimal_b=new BigDecimal(string[1]);  
            bigDecimal_result=bigDecimal_a.add(bigDecimal_b);  
            bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
        }  
        if(operator==16){  
            String[] string=str.split("-");  
            if(string.length==1){  
                bigDecimal_result=bigDecimal_result.subtract(bigDecimal_b);  
                bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
                return 1;  
            }  
            bigDecimal_a=new BigDecimal(string[0]);  
            bigDecimal_b=new BigDecimal(string[1]);  
            bigDecimal_result=bigDecimal_a.subtract(bigDecimal_b);  
            bigDecimal_result=bigDecimal_result.stripTrailingZeros();  
        }  
        return 1;  
    }  
    public void isAddPoint(){  
        str=text.getText();  
        if(str.length()==0){  
            str="0.";  
            return ;  
        }  
        if(str.charAt(str.length()-1)>'9'||str.charAt(str.length()-1)<'0'){  
            str=str+"0.";  
            return ;  
        }  
        str=text.getText()+".";  
    }  
    public boolean haveSign(String s){  
        for(int i=0;i<s.length();i++){  
            if(s.charAt(i)=='+' || s.charAt(i)=='-' ||s.charAt(i)=='÷' ||s.charAt(i)=='×'){  
                return true;  
            }  
        }  
        return false;  
    }  
    public boolean havePoint(String s){  
        int count=0;  
        for(int i=0;i<s.length();i++){  
            if(s.charAt(i)=='.' ){  
                count++;  
            }  
        }  
        if(count==1 && haveSign(s)){  
            return false;  
        }  
        if(count==0 ){  
            return false;  
        }  
        return true;  
    }  
}