论坛首页 Java企业应用论坛

javax.swing 写的计算器 提供源码

浏览 4632 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-21   最后修改:2010-01-21
java写的计算器
功能也算完整吧  大家也可以测测 给点意见

import java.awt.*;

import java.awt.event.*;
import java.math.*;
import javax.swing.*;

/**
 * @author wangjun
 * 
 */
public class JTest extends JFrame {

	/**
	 * 定义按扭窗口
	 */
	ResultStr resultStr; // 显示框 继承JPanel
	NumButtons numButtons; // 按钮面板 继承JPanel
	MopButs mopButs;
	

	// JButton butCE = new JButton("CE"); //ce按钮

	CEB ceb;

	// 当点击按钮+、-、*、/ = 时,isE = true
	boolean isE = false;

	// 当i=0时说明是我们第一次输入,显示内容为 0 根据输入的情况设置显示内容
	int i = 0;

	// 存放显示的内容
	String text = "";

	// 存放点击运算符按钮之前的数值
	double defbutton = 0;

	// 运算符
	String op = "";

	// 上一次的按键
	String lastKey = null;

	private void myInit() {

		resultStr = new ResultStr(); // 显示框对象
		numButtons = new NumButtons();// 按钮面板对象
		ceb = new CEB();// 特殊按钮面板对象 CE Backspace
		mopButs = new MopButs();

		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());

		panel.add(mopButs, BorderLayout.WEST);
		panel.add(resultStr, BorderLayout.NORTH);
		panel.add(ceb, BorderLayout.SOUTH);
		panel.add(numButtons, BorderLayout.CENTER);
		//this.setIconImage( ));
		//this.setIconImage(image)
		setBounds(200, 200, 350, 220);

		// 关闭时 退出程序
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setContentPane(panel);

		// 按钮 0-9 & . 添加监听器 数字按钮监听器
		numButtons.button0.addActionListener(numberLister);
		numButtons.button1.addActionListener(numberLister);
		numButtons.button2.addActionListener(numberLister);
		numButtons.button3.addActionListener(numberLister);
		numButtons.button4.addActionListener(numberLister);
		numButtons.button5.addActionListener(numberLister);
		numButtons.button6.addActionListener(numberLister);
		numButtons.button7.addActionListener(numberLister);
		numButtons.button8.addActionListener(numberLister);
		numButtons.button9.addActionListener(numberLister);
		numButtons.buttonpoint.addActionListener(numberLister);

		// 按钮 +-*/= 添加监听器 运算符按钮监听器
		numButtons.buttonA.addActionListener(opLister);
		numButtons.buttonB.addActionListener(opLister);
		numButtons.buttonC.addActionListener(opLister);
		numButtons.buttonD.addActionListener(opLister);

		numButtons.buttonE.addActionListener(opLister);

		// 按钮 sqrt % 1/x +/- CE 添加特殊按钮监听器
		numButtons.butS.addActionListener(teOpLister);
		numButtons.but5S.addActionListener(teOpLister);
		numButtons.butDS.addActionListener(teOpLister);
		numButtons.butFS.addActionListener(teOpLister);

		ceb.butCE.addActionListener(teOpLister);
		ceb.butBp.addActionListener(bp);

	}

	// 构造器
	public JTest(String name) {
		super(name);
		myInit();
	}

	// 数字按扭监听器
	ActionListener numberLister = new ActionListener() {
		public void actionPerformed(ActionEvent event) {

			JButton b = (JButton) event.getSource();
			// 按下 1 2 3 4 5 6 7 8 9 时的情况
			if (b.getText() != "0" && b.getText() != ".") {
				if (isE == true || i == 0) {
					resultStr.rsStr.setText(b.getText());

				} else {
					text = resultStr.rsStr.getText();
					if (Float.parseFloat(text) == 0) {
						if (text.indexOf(".") != -1) {
							resultStr.rsStr.setText(text + b.getText());
						} else {
							resultStr.rsStr.setText(b.getText());
						}
					} else {
						resultStr.rsStr.setText(text + b.getText());
					}

				}
				isE = false;
				i = 1;

			}
			// 0 的情况
			if (b.getText() == "0") {
				if (isE == true || i == 0) {
					resultStr.rsStr.setText(b.getText());
					isE = false;
					i = 1;
				} else {
					/*
					 * 判断条件如果text中的数值=0保持不变 不等于 0
					 * 判断在这个数值中是否有.存在?如果有那么就在原来数值基础之上添 加0;否则保持原来的数值不变
					 */
					text = resultStr.rsStr.getText();
					if (Float.parseFloat(text) != 0) {
						resultStr.rsStr.setText(text + "0");
					} else {
						if (text.trim().indexOf(".") == -1) {
							resultStr.rsStr.setText(text);
						} else {
							resultStr.rsStr.setText(text + "0");
						}
					}
				}
			}

			// . 的情况
			if (b.getText() == ".") {
				if (isE == true || i == 0) {
					resultStr.rsStr.setText("0.");
					isE = false;
					i = 1;
				} else {
					text = resultStr.rsStr.getText();
					if (text.trim().indexOf(".") == -1) {
						resultStr.rsStr.setText(text + ".");
					} else {
						resultStr.rsStr.setText(text);
					}
				}
				isE = false;
				i = 1;
			}
			lastKey = b.getText();
		}

	};
	// + - * / = 按扭监听器
	ActionListener opLister = new ActionListener() {
		public void actionPerformed(ActionEvent event) {

			JButton b = (JButton) event.getSource();
			if (lastKey != "+" && lastKey != "-" && lastKey != "*"
					&& lastKey != "/") {
				// 如果lastKey 不是运算符 做相应的运算 否则不变
				if (b.getText() != "=") {
					if (op != "") {
						getRsStr(true); // 计算结果     true 为不是按 = 计算
					} else {
						defbutton = Double.parseDouble(resultStr.rsStr
								.getText());
					}
					isE = true;
					i = 0;

				} else {
					getRsStr(false); // 计算结果 false 为按 = 计算
				}
			}

			// 最后记录相应的信息
			op = b.getText();
			lastKey = b.getText();
			defbutton = Double.parseDouble(resultStr.rsStr.getText());
		}

	};

	// 计算结果 当按下+ - * / 计算时参数是true 否则为 false
	public void getRsStr(boolean bl) {
		if (op != "") {
			Double d = Double.parseDouble(resultStr.rsStr.getText());
			if (op == "+") {
				resultStr.rsStr.setText(String.valueOf(defbutton + d));

			}
			if (op == "-") {
				resultStr.rsStr.setText(String.valueOf(defbutton - d));

			}
			if (op == "*") {
				resultStr.rsStr.setText(String.valueOf(defbutton * d));

			}
			if (op == "/") {
				resultStr.rsStr.setText(String.valueOf(defbutton / d));

			}
			if (bl == false) { // 按钮 = 计算后 清空 否则不用清空
				i = 0;
				text = "";

			}

		}
	}

	// sqrt % 1/x +/- 按扭监听器
	ActionListener teOpLister = new ActionListener() {
		public void actionPerformed(ActionEvent event) {

			JButton b = (JButton) event.getSource();
			try {
				defbutton = Double.parseDouble(resultStr.rsStr.getText());

				if (b.getText() == "sqrt") {
					resultStr.rsStr.setText(String
							.valueOf(Math.sqrt(defbutton)));
				}
				if (b.getText() == "%") {
					// 未计算
					// resultStr.rsStr.setText(String.valueOf(defbutton*100));
				}
				if (b.getText() == "1/x") {
					resultStr.rsStr.setText(String.valueOf(1 / defbutton));
				}
				if (b.getText() == "+/-") {
					resultStr.rsStr.setText(String.valueOf(-defbutton));
				}

				if (b.getText() == "C") {
					resultStr.rsStr.setText("0");
				}

			} catch (NumberFormatException e) {
				// TODO Auto-generated catch block

				resultStr.rsStr.setText("0");
				e.printStackTrace();
			}

			i = 0;
			text = "";
			op = "";
			defbutton = 0.0;
			lastKey = b.getText();
		}

	};
	// Backspace 监听器
	ActionListener bp = new ActionListener() {
		public void actionPerformed(ActionEvent event) {
			// 保存显示内容
			String str = resultStr.rsStr.getText();

			if (str.length() > 1) {
				// 显示内容的长度大于1时 去掉最后一位
				str = str.substring(0, str.length() - 1);
				resultStr.rsStr.setText(str);
				// 去掉后如果 最后一位是 . 也去掉
				if (resultStr.rsStr.getText().indexOf(".") == resultStr.rsStr
						.getText().length() - 1) {
					resultStr.rsStr.setText(resultStr.rsStr.getText()
							.substring(0,
									resultStr.rsStr.getText().length() - 1));
				}
			}
			// 否则显示为 0
			else {
				str = "0";
				resultStr.rsStr.setText(str);
			}
			lastKey = "Backspace";
		}
	};

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		JTest m = new JTest("计算器");
		m.setVisible(true);
	}

}

class ResultStr extends JPanel {

	JTextField rsStr = new JTextField("0");

	ResultStr() {
		rsStr.setHorizontalAlignment(SwingConstants.RIGHT);
		rsStr.enable(false);
		rsStr.setFont(new Font("宋体",5,24));
		
		setLayout(new BorderLayout());
		add(rsStr, BorderLayout.CENTER);
	}
}

class NumButtons extends JPanel {

	JButton button1 = new JButton("1");
	JButton button2 = new JButton("2");
	JButton button3 = new JButton("3");
	JButton button4 = new JButton("4");
	JButton button5 = new JButton("5");
	JButton button6 = new JButton("6");
	JButton button7 = new JButton("7");
	JButton button8 = new JButton("8");
	JButton button9 = new JButton("9");
	JButton button0 = new JButton("0");
	JButton buttonpoint = new JButton(".");

	JButton buttonA = new JButton("+");
	JButton buttonB = new JButton("-");
	JButton buttonC = new JButton("*");
	JButton buttonD = new JButton("/");
	JButton buttonE = new JButton("=");

	JButton butS = new JButton("sqrt");
	JButton but5S = new JButton("%");
	JButton butDS = new JButton("1/x");
	JButton butFS = new JButton("+/-");

	NumButtons() {
		setLayout(new GridLayout(4, 5));
		add(button1);
		add(button2);
		add(button3);
		add(buttonA);
		add(butS);
		add(button4);
		add(button5);
		add(button6);
		add(buttonB);
		add(but5S);
		add(button7);
		add(button8);
		add(button9);
		add(buttonC);
		add(butDS);
		add(button0);
		add(buttonpoint);
		add(buttonD);
		add(buttonE);
		add(butFS);

	}

}

class CEB extends JPanel {

	JButton butCE = new JButton("C");
	JButton butBp = new JButton("Backspace");

	CEB() {
		setLayout(new GridLayout(1, 2));
		add(butCE);
		add(butBp);
	}
}

class MopButs extends JPanel {
	JButton mAdd = new JButton("M+");
	JButton mC = new JButton("MC");
	JButton mR = new JButton("MR");
	JButton mS = new JButton("MS");

	MopButs() {
		setLayout(new GridLayout(4, 1));
		add(mC);
		add(mR);
		add(mS);
		add(mAdd);
	}
}


同时也压缩了 供大家下载
另外也有 坦克大战和贪吃蛇的代码
http://www.iteye.com/topic/574719
http://www.iteye.com/topic/576422
   发表时间:2010-01-27  
swing啊,周末没事的时候研究研究
0 请登录后投票
   发表时间:2010-01-28  
我记得我们数据结构的书上说,计算器的实现方式是堆栈。按照堆栈运算才容易实现复杂运算,如:16 + 354 * 5 -(34 + 22*2)...
0 请登录后投票
   发表时间:2010-03-14  
很是可以啊,我也在做计算器就进来观摩一下,比我的强悍多了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics