java计算器(图型界面)

java计算器(图型界面)_第1张图片

package xjj;

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;
	}
}


你可能感兴趣的:(java计算器(图型界面))