java swing實現的計算器

jopen 9年前發布 | 1K 次閱讀 Java


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.width2/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, 60count, 70, 42);
count++;
}else{
jbtns[i].setBounds(5+(k-1)
85, 60count, 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;  
}  

} </pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!