Java Swing复习(9)案例:桌面版计算器

package www9m30;

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.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[] allButton;
	private String os;
	private int fi;
	
	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() {
		fi=-1;
		frame=new JFrame("计算器");
		field=new JTextField("0",20);
		clearButton=new JButton("C");
		String s="123+456-789*0.=/";
		allButton=new JButton[s.length()];
		for (int i = 0; i < s.length(); i++) {
			allButton[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 < allButton.length; i++) {
			centerPanel.add(allButton[i]);
		}
		
		frame.add(northPanel,BorderLayout.NORTH);
		frame.add(centerPanel, BorderLayout.CENTER);
	}
	
	//设置样式
	private void setStyle(){
		clearButton.setFont(new Font("Consolas",Font.BOLD+Font.ITALIC,16));
		
		Font font=new Font("Consolas", Font.PLAIN, 15);
		for (int i = 0; i < allButton.length; i++) {
			allButton[i].setFont(font);
		}
		
		field.setBackground(Color.WHITE);
		field.setForeground(new Color(0,0,0));
		//水平对齐方式
		field.setHorizontalAlignment(JTextField.RIGHT);
		
		field.setEditable(false);
		
		frame.setResizable(false);
		
	}
	
	//事件处理
	private void addEventHandler(){
		//Clear button
		clearButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				fi=-1;
				os=null;
				field.setText("0");
			}
		});
		
		String n="0123456789.";
		final String f="+-*/";
		
		for (int i = 0; i < allButton.length; i++) {
			final String s=allButton[i].getActionCommand();
			
			if(n.indexOf(s)!=-1){
				//数字按钮
				allButton[i].addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e) {
						//当当前文本框中是符号,点击数字按钮时
						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){
				//符号按钮
				allButton[i].addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e) {
						if(fi==-1){
							os=field.getText();
						}
						field.setText(s);
						
						fi=f.indexOf(s);
					}
				});
			}
			if("=".equals(s)){
				//计算按钮
				allButton[i].addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e) {
						
						
						if(os==null||fi==-1||f.indexOf(field.getText())!=-1){
							return;
						}
						
						
						String ns=field.getText();
						
						BigDecimal od=new BigDecimal(os);
						BigDecimal nd=new BigDecimal(ns);
						
						BigDecimal result=null;
						
						switch (fi) {
						case ADD:
							result=od.add(nd);
							break;

						case SUBTRACT:
							result=od.subtract(nd);
							break;
							
						case MULIPLY:
							result=od.multiply(nd);
							break;
							
						case DIVIDE:
							result=od.divide(nd, MathContext.DECIMAL128);
							break;
						}
						
						field.setText(result.doubleValue()+"");
					}
				});
			}
		}
	}
	
	//显示组件
	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();
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值