java版计算器详解编程语言

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import java.awt.*; 
import java.math.BigDecimal; 
import java.math.MathContext; 
import java.math.RoundingMode; 
import java.awt.Color; 
 
/** 
 * java版计算器 
 */ 
public class Calculator extends JFrame { 
	final int WIN_W = 250, WIN_H = 250; 
	JPanel myPanel, panelSuper; 
 
	public Calculator() { 
 
		// 主面板 
		panelSuper = new JPanel(); 
		panelSuper.setLayout(null); 
 
		// 设置窗口位置 
		double width = Toolkit.getDefaultToolkit().getScreenSize().width; 
		double height = Toolkit.getDefaultToolkit().getScreenSize().height; 
		this.setBounds((int) (width - WIN_W) / 2, (int) (height - WIN_H) / 2, 
				WIN_W, WIN_H); 
 
		// 窗口配置 
		this.setTitle("java版计算器"); 
		this.validate(); 
		this.setResizable(false); 
		this.setVisible(true); 
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
 
		// 添加计算器按钮面板 
		myPanel = new MyPanel(); 
		this.add(myPanel, BorderLayout.CENTER); 
 
	} 
 
	public static void main(String[] args) { 
		new Calculator(); 
	} 
 
	/** 
	 * 计算器按钮面板类 
	 */ 
	class MyPanel extends JPanel implements ActionListener { 
		JButton button1, button2, button3, button4, button5, button6, button7, 
				button8, button9, button0, buttonJia, buttonJian, buttonCheng, 
				buttonChu, buttonDeng, buttonDian, buttonC, buttonDel, 
				buttonZF, buttonGH; 
		JTextField jTextField; // 计算器显示屏 
		char oper; // 操作符 
		String key, allKey = "1234567890.±del", jjccKey = "+-*/"; 
		BigDecimal d1, d2; 
		boolean first; 
 
		public MyPanel() { 
 
			// 设置布局 
			this.setLayout(new FlowLayout(FlowLayout.LEFT, 4, 5)); 
 
			// 计算器显示屏 
			jTextField = new JTextField(21); 
			jTextField.setHorizontalAlignment(JTextField.RIGHT); 
			jTextField.setEditable(false); 
			jTextField.setBackground(new Color(255, 255, 255)); 
			jTextField.setText("0"); 
			this.add(jTextField); 
 
			// 计算器按钮 
			button1 = new JButton("1"); 
			button2 = new JButton("2"); 
			button3 = new JButton("3"); 
			button4 = new JButton("4"); 
			button5 = new JButton("5"); 
			button6 = new JButton("6"); 
			button7 = new JButton("7"); 
			button8 = new JButton("8"); 
			button9 = new JButton("9"); 
			button0 = new JButton("0"); 
			buttonJia = new JButton("+"); 
			buttonJian = new JButton("-"); 
			buttonCheng = new JButton("*"); 
			buttonChu = new JButton("/"); 
			buttonDeng = new JButton("="); 
			buttonDian = new JButton("."); 
			buttonDel = new JButton("del"); 
			buttonC = new JButton("c"); 
			buttonZF = new JButton("±"); 
			buttonGH = new JButton("√"); 
			button1.setPreferredSize(new Dimension(55, 30)); 
			button2.setPreferredSize(new Dimension(55, 30)); 
			button3.setPreferredSize(new Dimension(55, 30)); 
			button4.setPreferredSize(new Dimension(55, 30)); 
			button5.setPreferredSize(new Dimension(55, 30)); 
			button6.setPreferredSize(new Dimension(55, 30)); 
			button7.setPreferredSize(new Dimension(55, 30)); 
			button8.setPreferredSize(new Dimension(55, 30)); 
			button9.setPreferredSize(new Dimension(55, 30)); 
			button0.setPreferredSize(new Dimension(55, 30)); 
			buttonJia.setPreferredSize(new Dimension(55, 30)); 
			buttonJian.setPreferredSize(new Dimension(55, 30)); 
			buttonCheng.setPreferredSize(new Dimension(55, 30)); 
			buttonChu.setPreferredSize(new Dimension(55, 30)); 
			buttonDeng.setPreferredSize(new Dimension(55, 30)); 
			buttonDian.setPreferredSize(new Dimension(55, 30)); 
			buttonDel.setPreferredSize(new Dimension(55, 30)); 
			buttonC.setPreferredSize(new Dimension(55, 30)); 
			buttonZF.setPreferredSize(new Dimension(55, 30)); 
			buttonGH.setPreferredSize(new Dimension(55, 30)); 
			this.add(buttonDel); 
			this.add(buttonC); 
			this.add(buttonZF); 
			this.add(buttonGH); 
			this.add(button1); 
			this.add(button2); 
			this.add(button3); 
			this.add(buttonJia); 
			this.add(button4); 
			this.add(button5); 
			this.add(button6); 
			this.add(buttonJian); 
			this.add(button7); 
			this.add(button8); 
			this.add(button9); 
			this.add(buttonCheng); 
			this.add(button0); 
			this.add(buttonDian); 
			this.add(buttonDeng); 
			this.add(buttonChu); 
			buttonDel.addActionListener(this); 
			buttonC.addActionListener(this); 
			buttonZF.addActionListener(this); 
			buttonGH.addActionListener(this); 
			button1.addActionListener(this); 
			button2.addActionListener(this); 
			button3.addActionListener(this); 
			button4.addActionListener(this); 
			button5.addActionListener(this); 
			button6.addActionListener(this); 
			button7.addActionListener(this); 
			button8.addActionListener(this); 
			button9.addActionListener(this); 
			button0.addActionListener(this); 
			buttonJia.addActionListener(this); 
			buttonJian.addActionListener(this); 
			buttonCheng.addActionListener(this); 
			buttonChu.addActionListener(this); 
			buttonDeng.addActionListener(this); 
			buttonDian.addActionListener(this); 
 
			// 计算器初始化 
			init(); 
		} 
 
		/** 
		 * 计算器初始化 
		 */ 
		public void init() { 
			d1 = new BigDecimal("0"); 
			d1 = new BigDecimal("0"); 
			key = "="; 
			oper = '='; 
			jTextField.setText("0"); 
			first = true; // 用于标记是否进行连续操作(例如按键顺序为“9*9====”,第一次等于first由true变为false,如果!first,按等号相当于用上一次的结果与第二个操作数相乘) 
		} 
 
		/** 
		 * 按钮监听 
		 */ 
		public void actionPerformed(ActionEvent e) { 
			JButton b = (JButton) e.getSource(); 
			if (b == buttonDian) { // 按下. 
 
				jTextField.setText(jTextField.getText() + "."); 
				if (first) { 
					d2 = d1 = getNum(); 
				} else { 
					d2 = getNum(); 
				} 
			} else if (b == buttonZF) {// 按下± 
				BigDecimal d = getNum(); 
				d = new BigDecimal("0").subtract(d); 
				setFormatNum(d); 
				if (first) { 
					d2 = d1 = getNum(); 
				} else { 
					d2 = getNum(); 
				} 
			} else if (b == buttonDel) {// 按下del 
				if (jTextField.getText().length() == 1 
						|| jTextField.getText().length() == 2 
						&& jTextField.getText().startsWith("-")) { 
					jTextField.setText("0"); 
 
				} else { 
					String s = jTextField.getText(); 
					s = s.substring(0, s.length() - 1); 
					if (s.endsWith("E+") || s.endsWith("E-")) 
						s = s.substring(0, s.length() - 2); 
					jTextField.setText(s); 
					if (first) { 
						d2 = d1 = getNum(); 
					} else { 
						d2 = getNum(); 
					} 
				} 
			} else if (b == buttonC) {// 按下c 
				init(); 
			} else if (b == buttonJia) {// 按下+ 
				BigDecimal s; 
				if (!first && allKey.indexOf(key) >= 0) { 
					if (oper == '-' || oper == '/') { 
						s = operate(d1, oper, d2); 
					} else { 
						s = operate(d2, oper, d1); 
					} 
					setFormatNum(s); 
				}// 如果不是第一次,且上一次操作是对数字进行操作 
				else { 
 
					first = false; 
				} 
				d2 = d1 = getNum(); 
				// System.out.print("111我执行啦/n"); 
				oper = '+'; 
			} else if (b == buttonJian) {// 按下- 
				BigDecimal s; 
				if (!first && allKey.indexOf(key) >= 0) { 
					s = operate(d1, oper, d2); 
					setFormatNum(s); 
				}// 如果不是第一次,且上一次操作是对数字进行操作 
				else { 
					first = false; 
				} 
				d2 = d1 = getNum(); 
				oper = '-'; 
			} else if (b == buttonCheng) {// 按下* 
				BigDecimal s; 
				if (!first && allKey.indexOf(key) >= 0) { 
					if (oper == '-' || oper == '/') { 
						s = operate(d1, oper, d2); 
					} else { 
						s = operate(d2, oper, d1); 
					} 
					setFormatNum(s); 
				}// 如果不是第一次,且上一次操作是对数字进行操作 
				else { 
					first = false; 
				} 
				d2 = d1 = getNum(); 
				oper = '*'; 
			} else if (b == buttonChu) {// 按下/ 
				BigDecimal s; 
				if (!first && allKey.indexOf(key) >= 0) { 
					s = operate(d1, oper, d2); 
					setFormatNum(s); 
				}// 如果不是第一次,且上一次操作是对数字进行操作 
				else { 
					first = false; 
				} 
				d2 = d1 = getNum(); 
				oper = '/'; 
			} else if (b == buttonGH) {// 按下平方根 
				if (jTextField.getText().startsWith("-")) { 
					init(); 
					return; 
				} 
				BigDecimal d = getNum(); 
				MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN); 
				d = new BigDecimal(Math.sqrt(d.doubleValue()), mc); 
				setFormatNum(d); 
				if (first) { 
					d2 = d1 = getNum(); 
				} else { 
					d2 = getNum(); 
				} 
			} else if (b == buttonDeng) {// 按下= 
				BigDecimal s = null; 
				d2 = getNum(); 
				if (!key.equals("=")) { 
					s = operate(d1, oper, d2); 
				} else { 
					s = operate(d2, oper, d1); 
				} 
				if (oper != '=' && !key.equals("=")) {// 上一次操作为 +-*/ 
					d1 = getNum(); 
 
				} 
				setFormatNum(s); 
				first = true; 
			} else { // 按下其他按钮 
				if (this.jTextField.getText().equals("0") 
						|| allKey.indexOf(key) == -1) { 
					this.jTextField.setText(b.getText()); 
				} else { 
					this.jTextField.setText(jTextField.getText() + b.getText()); 
				} 
				if (first) { 
					d2 = d1 = getNum(); 
				} else { 
					d2 = getNum(); 
				}// d2作被加数:d2+d1 
			} 
			key = b.getText(); 
		} 
 
		/** 
		 * 获取操作数 
		 *  
		 * @return 操作数 
		 */ 
		public BigDecimal getNum() { 
			BigDecimal d = new BigDecimal(jTextField.getText()); 
			return d; 
		} 
 
		public void setFormatNum(BigDecimal dd) { 
			MathContext mc = new MathContext(18, RoundingMode.HALF_DOWN); 
 
			BigDecimal d = new BigDecimal(dd.toString(), mc); 
			String num = d.toString(); 
			if (num.endsWith(".0")) 
				num = num.replaceAll("//.0", ""); 
			this.jTextField.setText(num); 
		} 
 
		/** 
		 * 计算 
		 *  
		 * @param a1 
		 *            操作数1 
		 * @param c 
		 *            操作符 
		 * @param a2 
		 *            操作数2 
		 * @return 
		 */ 
		public BigDecimal operate(BigDecimal a1, char c, BigDecimal a2) { 
			MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN); 
			switch (c) { 
			case '+': 
				return a1.add(a2); 
			case '-': 
				return a1.subtract(a2); 
			case '*': 
				return a1.multiply(a2); 
			case '/': 
				if (a2.compareTo(new BigDecimal("0")) == 0) { 
					init(); 
					return new BigDecimal("0"); 
				} 
				return a1.divide(a2, mc); 
			default: 
				return a2; 
			} 
		} 
	} 
 
} 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10320.html

(0)
上一篇 2021年7月19日 10:10
下一篇 2021年7月19日 10:10

相关推荐

发表回复

登录后才能评论