swing计算器

//MyCalculator.java
package test3;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
import java.math.BigInteger;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

public class MyCalculator extends JFrame {
	
	JPanel mainPanel=new JPanel();
	private JTextField textFiled;
	private String a;
	private char c='#';
	private JButton numButton[]=new JButton[10];
	public final static String About="Version : 1.0.0\n"
			                       +"Arthur  : kkke\n"
			                       +"csdnBlog: http://blog.csdn.net/tookkke/article/\n";

	private void initText() {
		textFiled.setText("0");
	}
	
	private void initFrame() {
		setSize(400, 250);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().add(mainPanel,BorderLayout.CENTER);
		mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		mainPanel.setLayout(new BorderLayout(0, 5));
	}
	
	private class MyActionListener implements ActionListener {
		private String num;
		
		public MyActionListener(int num) {
			this.num=Integer.toString(num);
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			if(textFiled.getText().equals("0"))textFiled.setText(num);
			else textFiled.setText(textFiled.getText()+num);
		}
		
		
	}
	
	public MyCalculator() {
		super("Calculator");
		initFrame();
		JPanel panel = new JPanel();
		mainPanel.add(panel, BorderLayout.NORTH);
		panel.setLayout(new BorderLayout(0, 0));
		
		textFiled = new JTextField();
		textFiled.setHorizontalAlignment(SwingConstants.RIGHT);
		textFiled.setEditable(false);
		textFiled.setPreferredSize(new Dimension(0, 25));
		panel.add(textFiled, BorderLayout.NORTH);
		
		JPanel PCenter = new JPanel();
		mainPanel.add(PCenter, BorderLayout.CENTER);
		PCenter.setLayout(new BorderLayout(3, 3));
		
		JPanel PNorth = new JPanel();
		PCenter.add(PNorth, BorderLayout.NORTH);
		PNorth.setLayout(new GridLayout(1, 4, 2, 0));
		JButton btnBack = new JButton("Back");
		btnBack.setForeground(Color.blue);
		btnBack.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				String text=textFiled.getText();
				if(text.equals("0"))
				{
					if(c!='#')
					{
						c='#';
						textFiled.setText(a);
					}
				}
				else
				{
					if(text.length()==1)textFiled.setText("0");
					else
					{
						textFiled.setText(text.substring(0,text.length()-1));
						if(textFiled.getText().equals("-"))textFiled.setText("0");
					}
				}
					
			}
		});
		PNorth.add(btnBack);
		
		JButton btnCE = new JButton("CE");
		btnCE.setForeground(Color.blue);
		btnCE.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				c='#';
				textFiled.setText("0");
			}
		});
		PNorth.add(btnCE);
		
	    JButton btnC = new JButton("C");
	    btnC.setForeground(Color.blue);
	    btnC.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				textFiled.setText("0");
			}
		});
		PNorth.add(btnC);
		
		JButton btnAbout = new JButton("About");
		btnAbout.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(MyCalculator.this, About, "About", JOptionPane.INFORMATION_MESSAGE);
			}
		});
		btnAbout.setForeground(Color.blue);
		
		JPanel PWest = new JPanel();
		PWest.setLayout(new GridLayout(4, 3, 2, 2));
		PNorth.add(btnAbout);
		for(int i=9;i>=0;i--)
		{
			numButton[i]=new JButton(Integer.toString(i));
			numButton[i].addActionListener(new MyActionListener(i));
			PWest.add(numButton[i]);
		}
		JPanel PEX = new JPanel();
		PEX.setLayout(new GridLayout(1, 2, 8, 0));
		PCenter.add(PEX, BorderLayout.CENTER);
		
		JButton btnPositive = new JButton("+/-");
		btnPositive.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				String text=textFiled.getText();
				if(!text.equals("0"))
				{
					if(text.charAt(0)=='-')textFiled.setText(text.substring(1));
					else textFiled.setText("-"+text);
				}
			}
		});
		PWest.add(btnPositive);
		
		JButton btnDot = new JButton(".");
		PWest.add(btnDot);
		btnDot.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if(!textFiled.getText().contains("."))textFiled.setText(textFiled.getText()+".");
			}
		});
		PEX.add(PWest, BorderLayout.WEST);
		
		
		JPanel PEast = new JPanel();
		PEast.setLayout(new GridLayout(4, 2, 2, 2));
		JButton btnDevide = new JButton("/");
		btnDevide.setForeground(Color.red);
		btnDevide.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				a=textFiled.getText();
				c='/';
				textFiled.setText("0");
			}
		});
		PEast.add(btnDevide);
		
		JButton btnSqrt = new JButton("sqrt");
		btnSqrt.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				textFiled.setText(BigDecimal.valueOf(Math.sqrt(Double.parseDouble(textFiled.getText()))).stripTrailingZeros().toPlainString());
			}
		});
		PEast.add(btnSqrt);
		
		JButton btnMultiply = new JButton("*");
		btnMultiply.setForeground(Color.red);
		btnMultiply.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				a=textFiled.getText();
				c='*';
				textFiled.setText("0");
			}
		});
		PEast.add(btnMultiply);
		
		JButton btnMod = new JButton("%");
		PEast.add(btnMod);
		btnMod.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				a=textFiled.getText();
				c='%';
				textFiled.setText("0");
			}
		});
		
		JButton btnSubtract = new JButton("-");
		btnSubtract.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				a=textFiled.getText();
				c='-';
				textFiled.setText("0");
			}
		});
		btnSubtract.setForeground(Color.red);
		PEast.add(btnSubtract);
		
		JButton btnReverse = new JButton("1/x");
		btnReverse.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				try{
					textFiled.setText(new BigDecimal("1").divide(new BigDecimal(textFiled.getText())).stripTrailingZeros().toPlainString());
				}
				catch(ArithmeticException e1) {
					textFiled.setText(new BigDecimal("1").divide(new BigDecimal(textFiled.getText()),15,BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString());
				}
			}
		});
		PEast.add(btnReverse);
		
		JButton btnAdd = new JButton("+");
		btnAdd.setForeground(Color.red);
		btnAdd.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				a=textFiled.getText();
				c='+';
				textFiled.setText("0");
			}
		});
		PEast.add(btnAdd);
		
		JButton btnEnter = new JButton("=");
		btnEnter.setForeground(Color.red);
		btnEnter.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				switch(c)
				{
				case '+':
					textFiled.setText(new BigDecimal(a).add(new BigDecimal(textFiled.getText())).stripTrailingZeros().toPlainString());
					break;
				case '-':
					textFiled.setText(new BigDecimal(a).subtract(new BigDecimal(textFiled.getText())).stripTrailingZeros().toPlainString());
					break;
				case '*':
					textFiled.setText(new BigDecimal(a).multiply(new BigDecimal(textFiled.getText())).stripTrailingZeros().toPlainString());
					break;
				case '/':
					try{
						textFiled.setText(new BigDecimal(a).divide(new BigDecimal(textFiled.getText())).stripTrailingZeros().toPlainString());
					}
					catch(ArithmeticException e1) {
						try{
						    textFiled.setText(new BigDecimal(a).divide(new BigDecimal(textFiled.getText()),15,BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString());
						}
						catch(ArithmeticException e2) {
							JOptionPane.showMessageDialog(null, "除数不能为0");
						}
					}
					break;
				case '%':
					a=a.split("[.]")[0];
					String b=textFiled.getText().split("[.]")[0];
					try{
					    textFiled.setText(new BigInteger(a).mod(new BigInteger(b)).toString());
					}
					catch(ArithmeticException e2) {
						JOptionPane.showMessageDialog(null, "除数不能为0");
					}
					break;
				}
				c='#';
			}
		});
		PEast.add(btnEnter);
		
		PEX.add(PEast, BorderLayout.EAST);
		
		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {
			
			private long lastPress=0;
			
			@Override
			public boolean postProcessKeyEvent(KeyEvent e) {
				if(e.getID()==KeyEvent.KEY_PRESSED)
				{
					long time=System.currentTimeMillis();
					if(time-lastPress>68)
					{
						lastPress=time;
						if(Character.isDigit(e.getKeyChar()))
						{
							numButton[e.getKeyChar()-'0'].doClick();
						}
						else if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE)btnBack.doClick();
						else switch(e.getKeyChar())
						{
						case '.':
							btnDot.doClick();
							break;
						case '+':
							btnAdd.doClick();
							break;
						case '-':
							btnSubtract.doClick();
							break;
						case '*':
							btnMultiply.doClick();
							break;
						case '/':
							btnDevide.doClick();
							break;
						case '%':
							btnMod.doClick();
							break;
						case '=':
						case '\n':
						    btnEnter.doClick();
							break;
						}
					}
				}
				return false;
			}
		});
		
		
	}
	
	public static void main(String[] args) {
		MyCalculator myCalculator=new MyCalculator();
		myCalculator.setVisible(true);
		myCalculator.requestFocus();
		myCalculator.initText();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值