Java 简单的计算器

概要:

Java 简单的计算器

| |目录

技术要点

实现计算器的技术要点如下:

  • 用JFrame作为计算器的主界面,实现ActionListener接口,处理按键事件。

  • 将组件按照BorderLayout布局方式添加到面板上,然后再将面板放入JFrame中。

  • 用文本框JTextField存放计算结果,并通过它的setText和getText设置获取文本框中的字符串。

  • 计算器上的按键用按钮JButton实现,并通过addListener方法为所有按键添加事件监听器。

代码实现

package net.xsoftlab.baike;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CalculatorDemo extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	// 设计面板中的单位
	JTextField text_Show;
	JPanel pnl, pnl_1, pnl_2, pnl_3;
	JMenuBar menu;// 没有起到任何的作用,用来作布局控制
	JTextField text;
	JLabel label; // label单纯做摆设,控制面板的形状
	JButton btn_Bk, btn_CE, btn_C;
	JButton btn[];
	JButton btn_MC, btn_MR, btn_MS, btn_MAdd;
	JButton btn_Dot, btn_AddAndSub, btn_Add, btn_Sub, btn_Mul, btn_Div,
			btn_Mod;
	JButton btn_Sqrt, btn_Dao, btn_Equal;
	DecimalFormat df; // 设置数据输出精度
	boolean click_Flag; // 控制当前能否按键
	double memory_data; // 使用内存中存储的数字
	int memory_int;// int类型存储器,只要是int型的数据就存进来
	double middle, result; // 用来保存double型数据的中间值(middle)和最后结果(result)
	short key = -1, prekey = -1; // key用来保存当前进行何种运算,prekey用来保存前次进行何种运算
	// 构造函数
	public CalculatorDemo() {
		super("自制计算器");
		click_Flag = true;
		result = 0;
		setDefaultCloseOperation(3);
		Image image = getToolkit().getImage("D:/workspace/New/chp07/2.jpg");
		setIconImage(image);
		df = new DecimalFormat("0.##############"); // 设置数据输出精度(对于double型值)
		text_Show = new JTextField(15);
		text_Show.setText("");
		text_Show.setHorizontalAlignment(JTextField.RIGHT);
		text_Show.setEditable(false);
		text_Show.setBackground(Color.white);
		pnl = new JPanel();
		this.getContentPane().add(pnl);
		pnl_1 = new JPanel();
		pnl_2 = new JPanel();
		pnl.setLayout(new BorderLayout());
		// 设计整个面板
		menu = new JMenuBar();
		// 面板pnl装载显示结果的文本区和面板pnl_1
		// 面板pnl_1按着BorderLayout的布局方式装载面板pnl_2和面板pnl_3
		pnl.add(menu, BorderLayout.NORTH);
		pnl.add(text_Show, BorderLayout.CENTER);
		pnl.add(pnl_1, BorderLayout.SOUTH);
		pnl_1.setLayout(new BorderLayout());
		text = new JTextField(5);
		text.setEditable(false);
		text.setBackground(new Color(220, 220, 220));
		label = new JLabel(" ");
		btn_Bk = new JButton("Backspace");
		btn_Bk.setForeground(Color.red);
		btn_CE = new JButton("CE");
		btn_CE.setForeground(Color.red);
		btn_C = new JButton("C");
		btn_C.setForeground(Color.red);
		btn_Bk.addActionListener(this);
		btn_CE.addActionListener(this);
		btn_C.addActionListener(this);
		pnl_1.add(pnl_2, BorderLayout.NORTH);
		// 面板pnl_2装载显示内存数据的方本区和Backspace、CE、C三个按扭
		pnl_2.setLayout(new FlowLayout(FlowLayout.RIGHT));
		pnl_2.add(text);
		pnl_2.add(label);
		pnl_2.add(btn_Bk);
		pnl_2.add(btn_CE);
		pnl_2.add(btn_C);
		pnl_3 = new JPanel();
		pnl_1.add(pnl_3, BorderLayout.CENTER);
		btn = new JButton[10];// 创建表示0-9的数字按扭
		for (int i = 0; i < btn.length; i++) {
			btn[i] = new JButton(Integer.toString(i));
			btn[i].setForeground(Color.blue);// 按扭上的字体颜色为蓝色
		}
		btn_MC = new JButton("MC");
		btn_MC.setForeground(Color.red);
		btn_MR = new JButton("MR");
		btn_MR.setForeground(Color.red);
		btn_MS = new JButton("MS");
		btn_MS.setForeground(Color.red);
		btn_MAdd = new JButton("M+");
		btn_MAdd.setForeground(Color.red);
		btn_Dot = new JButton(".");
		btn_Dot.setForeground(Color.blue);
		btn_AddAndSub = new JButton("+/-");
		btn_AddAndSub.setForeground(Color.blue);
		btn_Add = new JButton("+");
		btn_Add.setForeground(Color.red);
		btn_Sub = new JButton("-");
		btn_Sub.setForeground(Color.red);
		btn_Mul = new JButton("*");
		btn_Mul.setForeground(Color.red);
		btn_Div = new JButton("/");
		btn_Div.setForeground(Color.red);
		btn_Mod = new JButton("%");
		btn_Mod.setForeground(Color.blue);
		btn_Sqrt = new JButton("sqrt");
		btn_Sqrt.setForeground(Color.blue);
		btn_Dao = new JButton("1/x");
		btn_Dao.setForeground(Color.blue);
		btn_Equal = new JButton("=");
		btn_Equal.setForeground(Color.red);
		// 面板pnl_3装载其余的按扭
		pnl_3.setLayout(new GridLayout(4, 6));// 创建一个4行6列的GridLayout布局方式
		// 将相应的button组件按着布局方式加载到面板pnl_3中
		// 将所有的button组件注册事件侦听
		pnl_3.add(btn_MC);
		btn_MC.addActionListener(this);
		pnl_3.add(btn[7]);
		btn[7].addActionListener(this);
		pnl_3.add(btn[8]);
		btn[8].addActionListener(this);
		pnl_3.add(btn[9]);
		btn[9].addActionListener(this);
		pnl_3.add(btn_Div);
		btn_Div.addActionListener(this);
		pnl_3.add(btn_Sqrt);
		btn_Sqrt.addActionListener(this);
		pnl_3.add(btn_MR);
		btn_MR.addActionListener(this);
		pnl_3.add(btn[4]);
		btn[4].addActionListener(this);
		pnl_3.add(btn[5]);
		btn[5].addActionListener(this);
		pnl_3.add(btn[6]);
		btn[6].addActionListener(this);
		pnl_3.add(btn_Mul);
		btn_Mul.addActionListener(this);
		pnl_3.add(btn_Mod);
		btn_Mod.addActionListener(this);
		pnl_3.add(btn_MS);
		btn_MS.addActionListener(this);
		pnl_3.add(btn[1]);
		btn[1].addActionListener(this);
		pnl_3.add(btn[2]);
		btn[2].addActionListener(this);
		pnl_3.add(btn[3]);
		btn[3].addActionListener(this);
		pnl_3.add(btn_Sub);
		btn_Sub.addActionListener(this);
		pnl_3.add(btn_Dao);
		btn_Dao.addActionListener(this);
		pnl_3.add(btn_MAdd);
		btn_MAdd.addActionListener(this);
		pnl_3.add(btn[0]);
		btn[0].addActionListener(this);
		pnl_3.add(btn_AddAndSub);
		btn_AddAndSub.addActionListener(this);
		pnl_3.add(btn_Dot);
		btn_Dot.addActionListener(this);
		pnl_3.add(btn_Add);
		btn_Add.addActionListener(this);
		pnl_3.add(btn_Equal);
		btn_Equal.addActionListener(this);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 给JFrame上的关闭按扭设置默认的关闭方式
		pack();// 自动调整窗口的大小,适合它所包含的所有组件的布局
		this.setVisible(true);// 将所的有组件显示出来
	}
	// 设置各个按钮行为
	public void actionPerformed(ActionEvent event) {
		boolean sign = false; // 判断是否是double型数参与运算,是为true,不是为false
		Object temp = event.getSource();
		try {
			// 如果按下数据按钮,将按下的按钮代表的数据追加到当前文本框字符串之后
			for (int i = 0; i <= 9; i++)
				if (temp == btn[i] && click_Flag == true)
					text_Show
							.setText(text_Show.getText() + Integer.toString(i));
			// 按下"."按钮时,判断当前文本框内字符串中含不含".",如果已含,则不允许再插入"."
			if (temp == btn_Dot && click_Flag == true) {
				boolean isInclude = false;
				if (text_Show.getText().length() == 0)
					isInclude = true;
				for (int i = 0; i < text_Show.getText().length(); i++)
					if ('.' == text_Show.getText().charAt(i)) {
						isInclude = true;
						break;
					}
				if (isInclude == false)
					text_Show.setText(text_Show.getText() + ".");
			}
			if ((temp == btn_Add || temp == btn_Sub || temp == btn_Mul || temp == btn_Div)
					&& click_Flag == true) {
				// "+"操作
				if (temp == btn_Add) {
					switch (prekey) {
					case 0:
						result += Double.parseDouble(text_Show.getText());
						break;
					case 1:
						result -= Double.parseDouble(text_Show.getText());
						break;
					case 2:
						result *= Double.parseDouble(text_Show.getText());
						break;
					case 3:
						if (Double.parseDouble(text_Show.getText()) == 0) {
							// text_Show="aa";
							text_Show.setText("除数不能为零");
							click_Flag = false;
						} else
							result /= Double.parseDouble(text_Show.getText());
						break;
					default:
						result = Double.parseDouble(text_Show.getText());
					}
					text_Show.setText("");
					prekey = key = 0;
				}
				// "-"操作
				if (temp == btn_Sub) {
					switch (prekey) {
					case 0:
						result += Double.parseDouble(text_Show.getText());
						break;
					case 1:
						result -= Double.parseDouble(text_Show.getText());
						break;
					case 2:
						result *= Double.parseDouble(text_Show.getText());
						break;
					case 3:
						if (Double.parseDouble(text_Show.getText()) == 0) {
							text_Show.setText("除数不能为零");
							click_Flag = false;
						} else
							result /= Double.parseDouble(text_Show.getText());
						break;
					default:
						result = Double.parseDouble(text_Show.getText());
					}
					text_Show.setText("");
					prekey = key = 1;
				}
				// "*"操作
				if (temp == btn_Mul) {
					switch (prekey) {
					case 0:
						result += Double.parseDouble(text_Show.getText());
						break;
					case 1:
						result -= Double.parseDouble(text_Show.getText());
						break;
					case 2:
						result *= Double.parseDouble(text_Show.getText());
						break;
					case 3:
						if (Double.parseDouble(text_Show.getText()) == 0) {
							text_Show.setText("除数不能为零");
							click_Flag = false;
						} else
							result /= Double.parseDouble(text_Show.getText());
						break;
					default:
						result = Double.parseDouble(text_Show.getText());
					}
					// textAnser = "";
					text_Show.setText("");
					prekey = key = 2;
				}
				// "/"操作
				if (temp == btn_Div) {
					switch (prekey) {
					case 0:
						result += Double.parseDouble(text_Show.getText());
						break;
					case 1:
						result -= Double.parseDouble(text_Show.getText());
						break;
					case 2:
						result *= Double.parseDouble(text_Show.getText());
						break;
					case 3:
						if (Double.parseDouble(text_Show.getText()) == 0) {
							text_Show.setText("除数不能为零");
							click_Flag = false;
						} else
							result /= Double.parseDouble(text_Show.getText());
						break;
					default:
						result = Double.parseDouble(text_Show.getText());
					}
					text_Show.setText("");
					prekey = key = 3;
				}
			}
			// "="操作
			if (temp == btn_Equal && click_Flag == true) {
				// 如果连续按"=",则进行连续运算
				if (prekey == 5) {
					if (key == 0) {
						result += middle;
						text_Show.setText(df.format(result));
					}
					if (key == 1) {
						result -= middle;
						text_Show.setText(df.format(result));
					}
					if (key == 2) {
						result *= middle;
						text_Show.setText(df.format(result));
					}
					if (key == 3) {
						if (Double.parseDouble(text_Show.getText()) == 0) {
							text_Show.setText("除数不能为零");
							click_Flag = false;
						} else {
							result /= middle;
							text_Show.setText(df.format(result));
						}
					}
				} else {
					middle = Double.parseDouble(text_Show.getText());
					if (key == 0) {
						prekey = -1;
						result += Double.parseDouble(text_Show.getText());
						text_Show.setText(df.format(result));
					}
					if (key == 1) {
						prekey = -1;
						result -= Double.parseDouble(text_Show.getText());
						text_Show.setText(df.format(result));
					}
					if (key == 2) {
						prekey = -1;
						result *= Double.parseDouble(text_Show.getText());
						text_Show.setText(df.format(result));
					}
					if (key == 3) {
						prekey = -1;
						if (Double.parseDouble(text_Show.getText()) == 0) {
							text_Show.setText("除数不能为零");
							click_Flag = false;
						} else {
							result /= Double.parseDouble(text_Show.getText());
							text_Show.setText(df.format(result));
						}
					}
				}
				prekey = 5;
			}
			// "%"操作,对第二个操作数除以100
			if (temp == btn_Mod && click_Flag == true) {
				if (result == 0) {
					String s = text_Show.getText();
					text_Show.setText(s);
				} else {
					boolean isInclude = false;
					for (int i = 0; i < text_Show.getText().length(); i++)
						if ('.' == text_Show.getText().charAt(i)) {
							isInclude = true;
							break;
						}
					// 如果是double数,除100
					if (isInclude == true) {
						double dtemp = Double.parseDouble(text_Show.getText());
						dtemp = dtemp / 100.0;
						text_Show.setText(Double.toString(dtemp));
					} else {
						// 如果是int数但能被100整除,则去掉末尾两个零
						if (Integer.parseInt(text_Show.getText()) % 100 == 0) {
							int itemp = Integer.parseInt(text_Show.getText());
							itemp /= 100;
							text_Show.setText(Integer.toString(itemp));
						}
						// 如果是int数,但不能被100整除,则按double数处理
						else {
							double dtemp = Double.parseDouble(text_Show
									.getText());
							dtemp = dtemp / 100.0;
							text_Show.setText(Double.toString(dtemp));
						}
					}
				}
			}
			// 开根号运算
			if (temp == btn_Sqrt && click_Flag == true) {
				String s = text_Show.getText();
				if (s.charAt(0) == '-') {// 判断符号是否符合运算规则
					text_Show.setText("负数不能开根号");
					click_Flag = false;
				} else
					text_Show.setText(Double.toString(java.lang.Math
							.sqrt(Double.parseDouble(text_Show.getText()))));
			}
			// 倒数运算
			if (temp == btn_Dao && click_Flag == true) {
				if (text_Show.getText().charAt(0) == '0'
						&& text_Show.getText().length() == 1) {// 判断此数是否符合进行倒数运算规则
					text_Show.setText("零不能求倒数");
					click_Flag = false;
				} else {
					boolean isDec = true;
					int i, j, k;
					String s = Double.toString(1 / Double.parseDouble(text_Show
							.getText()));
					for (i = 0; i < s.length(); i++)
						if (s.charAt(i) == '.')
							break;
					for (j = i + 1; j < s.length(); j++)
						if (s.charAt(j) != '0') {
							isDec = false;
							break;
						}
					if (isDec == true) {
						String stemp = "";
						for (k = 0; k < i; k++)
							stemp += s.charAt(k);
						text_Show.setText(stemp);
					} else
						text_Show.setText(s);
				}
			}
			// 按下"+/-"按钮时处理
			if (temp == btn_AddAndSub && click_Flag == true) {
				boolean isNumber = true;
				String s = text_Show.getText();
				for (int i = 0; i < s.length(); i++)
					if (!(s.charAt(i) >= '0' && s.charAt(i) <= '9'
							|| s.charAt(i) == '.' || s.charAt(i) == '-')) {
						isNumber = false;
						break;
					}
				if (isNumber == true) {
					// 如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉
					if (s.charAt(0) == '-') {
						text_Show.setText("");
						for (int i = 1; i < s.length(); i++) {
							char a = s.charAt(i);
							text_Show.setText(text_Show.getText() + a);
						}
					}
					// 如果当前字符串第一个字符不是符号,则添加一个符号在首字母处
					else
						text_Show.setText('-' + s);
				}
			}
			// 计算器有关内存操作
			// 'MC'的操作,将内存清0
			if (temp == btn_MC && click_Flag == true) {
				memory_data = memory_int = 0;
				text.setText("");
			}
			// 'MS'的操作,将当前文本框内容保存入内存,显示'M'
			if (temp == btn_MS && click_Flag == true) {
				boolean isInclude = false;
				text.setText(" M");
				for (int i = 0; i < text_Show.getText().length(); i++)
					if ('.' == text_Show.getText().charAt(i)) {
						isInclude = true;
						break;
					}
				// 如果是double,则存入memory_data(double存储器)
				if (isInclude == true) {
					memory_data = Double.parseDouble(text_Show.getText());
					memory_int = 0; // 保证存储器中存放最新的值
				}
				// 如果是int,则存入memory_int(int存储器)
				else {
					memory_int = Integer.parseInt(text_Show.getText());
					memory_data = 0; // 保证存储器中存放最新的值
				}
			}
			// 'MR'的操作,将存储器中的信息输出
			if (temp == btn_MR && click_Flag == true) {
				if (memory_data != 0)
					text_Show.setText(Double.toString(memory_data));
				if (memory_int != 0)
					text_Show.setText(Integer.toString(memory_int));
			}
			// 'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器
			if (temp == btn_MAdd && click_Flag == true) {
				boolean isInclude = false;
				for (int i = 0; i < text_Show.getText().length(); i++)
					if ('.' == text_Show.getText().charAt(i)) {
						isInclude = true;
						break;
					}
				if (memory_int != 0) { // 存储中是一个int型数
					if (isInclude == false) // 被加数是一个int型数
						memory_int += Integer.parseInt(text_Show.getText());
					else { // 被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int存储器清零
						memory_data = memory_int
								+ Double.parseDouble(text_Show.getText());
						memory_int = 0;
					}
				} else
					memory_data += Double.parseDouble(text_Show.getText());
			}
			// 按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除
			if (temp == btn_Bk && click_Flag == true) {
				String s = text_Show.getText();
				text_Show.setText("");
				for (int i = 0; i < s.length() - 1; i++) {
					char a = s.charAt(i);
					text_Show.setText(text_Show.getText() + a);
				}
			}
			// 按下'CE'按钮,将当前文本框内数据清除
			if (temp == btn_CE) {
				text_Show.setText("");
				click_Flag = true;
			}
			// 按下'C'按钮,文本框内数据清除,同时middle,result清0
			if (temp == btn_C) {
				middle = result = 0;
				text_Show.setText("");
				click_Flag = true;
			}
		}
		// 输入中如果有操作非法,比如按下两次'+',捕获异常
		catch (Exception e) {
			text_Show.setText("操作非法");
			click_Flag = false;
		}
	}
	// 主函数
	public static void main(String args[]) {
		new CalculatorDemo();
	}
}


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消