java 计算器。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.MathContext;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Calculator {
	//定义组件
	private JFrame frame;
	private JTextField field;
	private JButton clearButton;
	private JButton[] allButtons;
	
	
//	private double od;
//	private BigDecimal od;
	private String os;
	private int fi=-1;

public static final int ADD=0;
public static final int SUBTRACT=1;
public static final int MULIPLY=2;
public static final int DIVIDE=3;


//创建组件
public Calculator() {
	frame=new JFrame("计算器");
	field=new JTextField("0",19);
	clearButton=new JButton("C");
	String s="123+456-789*0.=/";
	allButtons=new JButton[s.length()];
	for (int i = 0; i < s.length(); i++) {
		allButtons[i]=new JButton(s.charAt(i)+"");
	}
}

//组件布局
private void init(){
	frame.setLayout(new BorderLayout(3,3));
	
	JPanel northPanel=new JPanel();
	JPanel centerPanel=new JPanel();
	
	northPanel.setLayout(new FlowLayout());
	centerPanel.setLayout(new GridLayout(4,4,6,6));
	
	northPanel.add(field);
	northPanel.add(clearButton);
	
	for (int i = 0; i < allButtons.length; i++) {
		centerPanel.add(allButtons[i]);
	}
	
	frame.add(northPanel,BorderLayout.NORTH);
	frame.add(centerPanel,BorderLayout.CENTER);
}


//设置样式
private void setStyle(){
	clearButton.setFont(new Font("Courier New",Font.BOLD+Font.ITALIC,16));
	
	Font font=new Font("Courier New",Font.PLAIN,14);
	for (int i = 0; i < allButtons.length; i++) {
		allButtons[i].setFont(font);
	}

	field.setHorizontalAlignment(JTextField.RIGHT);
	field.setEditable(false);
	field.setBackground(Color.WHITE);
	field.setForeground(new Color(0,0,0));
	frame.setResizable(false);
}

private void addEventHandler(){
	clearButton.addActionListener(new ActionListener(){

		public void actionPerformed(ActionEvent e) {
			//C按钮
			System.out.println("C");
			fi=-1;
			os=null;
			field.setText("0");
		}
		
	});
	
	String n="0123456798.";
	final String f="+-*/";
	
	for (int i = 0; i < allButtons.length; i++) {
		final String s=allButtons[i].getActionCommand();
		
		if(n.indexOf(s)!=-1){
			allButtons[i].addActionListener(new ActionListener(){

				public void actionPerformed(ActionEvent e) {
					//数字按钮包括.
					System.out.println("数字");
					
					if("除数不能为零".equals(field.getText())){
						field.setText("0");
					}
					
					//当前文本框中是符号,点击数字按钮时
					if(f.indexOf(field.getText())!=-1){
						field.setText("0");
					}
					
					//当前文本框中显示0,点击数字按钮不包括小数点时
					if("0".equals(field.getText())&&!".".equals(s)){
						field.setText("");
					}
					
					//当前点击的是小数点,多次点击
					if(".".equals(s)&&!field.getText().matches("\\d+")){
						return;
					}
					
					field.setText(field.getText()+s);
				}
				
			});
		}
		
		if(f.indexOf(s)!=-1){
			allButtons[i].addActionListener(new ActionListener(){

				public void actionPerformed(ActionEvent e) {
					//符号按钮
					System.out.println("符号");
//						od=Double.parseDouble(field.getText());
//						od=new BigDecimal(field.getText());
						if(fi==-1){
							os=field.getText();
						}
			

		
					
					
					field.setText(s);
					fi=f.indexOf(s);
				}
				
			});
			
		}
		
		if("=".equals(s)){
			allButtons[i].addActionListener(new ActionListener(){

				public void actionPerformed(ActionEvent e) {
					//计算按钮
					System.out.println("=");
					
					try {
						//少条件点击等于号时
						if(os==null||fi==-1||f.indexOf(field.getText())!=-1||"除数不能为零".equals(field.getText())){
							return;
						}
						
						String ns=field.getText();
						
						BigDecimal od=new BigDecimal(os);
//						double nd=Double.parseDouble(field.getText());
							BigDecimal nd=new BigDecimal(ns);
							
//						System.out.println(od+" "+fi+" "+nd);
//						double result=0.0;
							BigDecimal result=null;
							switch (fi) {
							case ADD:
//							result=od+nd;
								result=od.add(nd);
								break;

							case SUBTRACT:
//							result=od-nd;
								result=od.subtract(nd);
								break;
								
							case MULIPLY:
//							result=od*nd;
								result=od.multiply(nd);
								break;
								
							case DIVIDE:
//							result=od/nd;
								result=od.divide(nd,MathContext.DECIMAL64);
								break;
							}
							
						field.setText(result.doubleValue()+"");
					} catch (ArithmeticException e1) {
						field.setText("除数不能为零");
					}
				}
				
			});
		}
			
	}
}

//显示组件
public void show(){
	init();
	setStyle();
	addEventHandler();
	frame.setSize(290,180);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
	new Calculator().show();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值