计算器的程序_实验

实验题1  编写一个模拟计算器的程序,使用面板和网格布局,添加一个文本框,10个数字按钮(0-9),4个加减乘除按钮,一个等号按钮,一个清除按钮,要求将计算公式和结果显示在文本框中。

[基本要求] 编写完整程序

 
package cn.Text.javaSwing.Caculator;

import java.awt.Color;
import java.awt.Event;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Date;

import javax.swing.JButton;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;

@SuppressWarnings("serial")
public class Caculate extends JFrame implements ActionListener {

	private JTextField textField;
	final JMenuItem newItemMenuItem_4;
	boolean isDouble = false;// 是否为实数
	int opFlag = -1;
	static double t1 = 0, t2 = 0, t3 = 0, result = 0;
	static int opflag1 = -1, opflag2 = -1, flag = 0, resflag = 1;
	int preOp, currentOp = 0;// 标准位
	double op1 = 0, op2 = 0;// 操作数
	double n3;
	StringBuffer buf = new StringBuffer(20);
	StringBuffer copyBoard = new StringBuffer(20);// 剪贴板
	StringBuffer memory = new StringBuffer(20);// M系列
	StringBuffer str = new StringBuffer();

	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Caculate frame = new Caculate();
					frame.setVisible(true);
					frame.setResizable(false);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	public Caculate() {
		super("Caculator");
		Toolkit tk = Toolkit.getDefaultToolkit();
		Image img = tk.getImage("D:/Java/1.gif");
		setIconImage(img);
		getContentPane().setBackground(Color.LIGHT_GRAY);
		setBackground(Color.BLUE);
		getContentPane().setLayout(null);
		setBounds(100, 100, 314, 406);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		final JMenu menu = new JMenu();
		menu.setBackground(Color.DARK_GRAY);
		menu.setName("");
		menu.setMnemonic(KeyEvent.VK_V);
		menu.setText("查看(V)");
		menuBar.add(menu);

		final JMenuItem newItemMenuItem = new JMenuItem();
		newItemMenuItem.setMnemonic(KeyEvent.VK_1);
		newItemMenuItem.setText("标准型 1");
		menu.add(newItemMenuItem);

		final JMenuItem newItemMenuItem_1 = new JMenuItem();
		newItemMenuItem_1.setText("科学型");
		menu.add(newItemMenuItem_1);

		final JMenuItem newItemMenuItem_2 = new JMenuItem();
		newItemMenuItem_2.setText("程序员");
		menu.add(newItemMenuItem_2);

		final JMenu menu_1 = new JMenu();
		menu_1.setMnemonic(KeyEvent.VK_E);
		menu_1.setText("编辑(E)");
		menuBar.add(menu_1);
		newItemMenuItem_4 = new JMenuItem();
		final JMenuItem newItemMenuItem_3 = new JMenuItem();
		newItemMenuItem_3.addActionListener(this);
		newItemMenuItem_3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.ALT_MASK));
		newItemMenuItem_3.setText("复制(C)");
		menu_1.add(newItemMenuItem_3);
		newItemMenuItem_4.addActionListener(this);
		newItemMenuItem_4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.ALT_MASK));
		newItemMenuItem_4.setText("粘贴");
		menu_1.add(newItemMenuItem_4);

		menu_1.addSeparator();

		final JMenu menu_2 = new JMenu();
		menu_2.setText("历史记录");
		menu_1.add(menu_2);

		final JMenuItem newItemMenuItem_5 = new JMenuItem();
		newItemMenuItem_5.setText("复制历史记录");
		menu_2.add(newItemMenuItem_5);

		final JMenuItem newItemMenuItem_6 = new JMenuItem();
		newItemMenuItem_6.setText("编辑");
		menu_2.add(newItemMenuItem_6);

		final JMenuItem newItemMenuItem_7 = new JMenuItem();
		newItemMenuItem_7.setText("取消编辑");
		menu_2.add(newItemMenuItem_7);

		final JMenuItem newItemMenuItem_8 = new JMenuItem();
		newItemMenuItem_8.setText("清除");
		menu_2.add(newItemMenuItem_8);

		final JMenu menu_3 = new JMenu();
		menu_3.setText("帮助");
		menuBar.add(menu_3);

		final JMenuItem newItemMenuItem_9 = new JMenuItem();
		newItemMenuItem_9.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				if(e.getSource()==newItemMenuItem_9){
					helpHelp();
				}
			}
		});
		newItemMenuItem_9.setText("查看帮助");
		menu_3.add(newItemMenuItem_9);

		final JMenuItem newItemMenuItem_10 = new JMenuItem();
		newItemMenuItem_10.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				if(e.getSource()==newItemMenuItem_10){
					aboutCaculator();
				}
			}
		});
		newItemMenuItem_10.setText("关于计算器");
		menu_3.add(newItemMenuItem_10);

		textField = new JTextField();
		textField.setFont(new Font("", Font.PLAIN, 14));
		textField.setHorizontalAlignment(SwingConstants.RIGHT);
		textField.setBounds(10, 10, 287, 47);
		getContentPane().add(textField);

		final JButton mcButton = new JButton();
		mcButton.addActionListener(this);
		mcButton.setForeground(Color.MAGENTA);
		mcButton.setText("MC");
		mcButton.setBounds(10, 63, 52, 28);
		getContentPane().add(mcButton);

		final JButton mrButton = new JButton();
		mrButton.addActionListener(this);
		mrButton.setForeground(Color.MAGENTA);
		mrButton.setText("MR");
		mrButton.setBounds(68, 63, 55, 28);
		getContentPane().add(mrButton);

		final JButton msButton = new JButton();
		msButton.addActionListener(this);
		msButton.setForeground(Color.MAGENTA);
		msButton.setText("MS");
		msButton.setBounds(129, 63, 52, 28);
		getContentPane().add(msButton);

		final JButton mButton = new JButton();
		mButton.addActionListener(this);
		mButton.setForeground(Color.MAGENTA);
		mButton.setText("M+");
		mButton.setBounds(187, 63, 52, 28);
		getContentPane().add(mButton);

		final JButton mButton_1 = new JButton();
		mButton_1.addActionListener(this);
		mButton_1.setForeground(Color.MAGENTA);
		mButton_1.setText("M-");
		mButton_1.setBounds(245, 63, 52, 28);
		getContentPane().add(mButton_1);

		final JButton button = new JButton();
		button.addActionListener(this);
		button.setForeground(Color.RED);
		button.setFont(new Font("", Font.PLAIN, 16));
		button.setText("←");
		button.setBounds(10, 97, 52, 28);
		getContentPane().add(button);

		final JButton ceButton = new JButton();
		ceButton.addActionListener(this);
		ceButton.setForeground(Color.MAGENTA);
		ceButton.setText("CE");
		ceButton.setBounds(68, 97, 55, 28);
		getContentPane().add(ceButton);

		final JButton cButton = new JButton();
		cButton.addActionListener(this);
		cButton.setForeground(Color.RED);
		cButton.setText("C");
		cButton.setBounds(129, 97, 52, 28);
		getContentPane().add(cButton);

		final JButton button_3 = new JButton();
		button_3.setForeground(Color.RED);
		button_3.setFont(new Font("@Adobe 仿宋 Std R", Font.PLAIN, 16));
		button_3.setText("±");
		button_3.setBounds(187, 97, 52, 28);
		getContentPane().add(button_3);

		final JButton sqrtButton = new JButton();
		sqrtButton.setFont(new Font("", Font.BOLD, 9));
		sqrtButton.addActionListener(this);
		sqrtButton.setForeground(Color.RED);
		sqrtButton.setText("sqrt");
		sqrtButton.setBounds(245, 97, 52, 28);
		getContentPane().add(sqrtButton);

		final JButton button_5 = new JButton();
		button_5.addActionListener(this);
		button_5.setForeground(Color.BLACK);
		button_5.setBackground(Color.WHITE);
		button_5.setText("7");
		button_5.setBounds(10, 131, 52, 36);
		getContentPane().add(button_5);

		final JButton button_5_1 = new JButton();
		button_5_1.setForeground(Color.BLACK);
		button_5_1.setBackground(Color.WHITE);
		button_5_1.addActionListener(this);
		button_5_1.setText("8");
		button_5_1.setBounds(68, 131, 55, 36);
		getContentPane().add(button_5_1);

		final JButton button_5_2 = new JButton();
		button_5_2.addActionListener(this);
		button_5_2.setForeground(Color.BLACK);
		button_5_2.setBackground(Color.WHITE);
		button_5_2.setText("9");
		button_5_2.setBounds(129, 131, 52, 36);
		getContentPane().add(button_5_2);

		final JButton button_5_3 = new JButton();
		button_5_3.addActionListener(this);
		button_5_3.setForeground(Color.BLUE);
		button_5_3.setText("/");
		button_5_3.setBounds(187, 131, 52, 36);
		getContentPane().add(button_5_3);

		final JButton button_5_4 = new JButton();
		button_5_4.setForeground(Color.BLUE);
		button_5_4.setText("%");
		button_5_4.setBounds(245, 131, 52, 36);
		getContentPane().add(button_5_4);

		final JButton button_5_5 = new JButton();
		button_5_5.addActionListener(this);
		button_5_5.setForeground(Color.BLACK);
		button_5_5.setBackground(Color.WHITE);
		button_5_5.setText("4");
		button_5_5.setBounds(10, 173, 52, 36);
		getContentPane().add(button_5_5);

		final JButton button_5_6 = new JButton();
		button_5_6.addActionListener(this);
		button_5_6.setForeground(Color.BLACK);
		button_5_6.setBackground(Color.WHITE);
		button_5_6.setText("5");
		button_5_6.setBounds(68, 173, 55, 36);
		getContentPane().add(button_5_6);

		final JButton button_5_7 = new JButton();
		button_5_7.addActionListener(this);
		button_5_7.setForeground(Color.BLACK);
		button_5_7.setBackground(Color.WHITE);
		button_5_7.setText("6");
		button_5_7.setBounds(129, 173, 52, 36);
		getContentPane().add(button_5_7);

		final JButton button_5_8 = new JButton();
		button_5_8.addActionListener(this);
		button_5_8.setForeground(Color.BLUE);
		button_5_8.setFont(new Font("", Font.BOLD | Font.ITALIC, 16));
		button_5_8.setText("*");
		button_5_8.setBounds(187, 173, 52, 36);
		getContentPane().add(button_5_8);

		final JButton button_5_9 = new JButton();
		button_5_9.addActionListener(this);
		button_5_9.setForeground(Color.BLUE);
		button_5_9.setText("1/x");
		button_5_9.setBounds(245, 173, 52, 36);
		getContentPane().add(button_5_9);

		final JButton button_5_10 = new JButton("1");
		button_5_10.addActionListener(this);
		button_5_10.setBackground(Color.WHITE);
		button_5_10.setBounds(10, 215, 52, 36);
		getContentPane().add(button_5_10);

		JButton button_5_11 = new JButton("2");
		button_5_11.addActionListener(this);
		button_5_11.setBackground(Color.WHITE);
		button_5_11.setBounds(68, 215, 55, 36);
		getContentPane().add(button_5_11);

		final JButton button_5_12 = new JButton("3");
		button_5_12.addActionListener(this);
		button_5_12.setBackground(Color.WHITE);
		button_5_12.setBounds(129, 215, 52, 36);
		getContentPane().add(button_5_12);

		final JButton button_5_13 = new JButton("-");
		button_5_13.addActionListener(this);
		button_5_13.setForeground(Color.BLUE);
		button_5_13.setFont(new Font("", Font.BOLD, 16));
		button_5_13.setBounds(187, 215, 52, 36);
		getContentPane().add(button_5_13);

		final JButton button_5_14 = new JButton();
		button_5_14.addActionListener(this);
		button_5_14.setForeground(Color.BLUE);
		button_5_14.setFont(new Font("", Font.PLAIN, 26));
		button_5_14.setText("=");
		button_5_14.setBounds(245, 215, 52, 79);
		getContentPane().add(button_5_14);

		final JButton button_5_15 = new JButton("0");
		button_5_15.setForeground(Color.BLACK);
		button_5_15.addActionListener(this);
		button_5_15.setBackground(Color.WHITE);
		button_5_15.setFont(new Font("", Font.BOLD, 24));
		button_5_15.setBounds(10, 258, 113, 36);
		getContentPane().add(button_5_15);

		final JButton button_5_17 = new JButton();
		button_5_17.addActionListener(this);
		button_5_17.setForeground(Color.BLACK);
		button_5_17.setFont(new Font("@Adobe 黑体 Std R", Font.BOLD, 26));
		button_5_17.setText("·");
		button_5_17.setBounds(129, 257, 52, 36);
		getContentPane().add(button_5_17);

		final JButton button_5_18 = new JButton();
		button_5_18.addActionListener(this);
		button_5_18.setForeground(Color.BLUE);
		button_5_18.setFont(new Font("", Font.BOLD, 16));
		button_5_18.setText("+");
		button_5_18.setBounds(187, 258, 52, 36);
		getContentPane().add(button_5_18);

		final JLabel label = new JLabel();
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setForeground(Color.RED);
		label.setFont(new Font("", Font.BOLD | Font.ITALIC, 24));
		label.setBackground(Color.WHITE);
		label.setText("标准型计算器");
		label.setBounds(10, 300, 287, 43);
		getContentPane().add(label);
		//

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		if (s.equals("复制(C)")) {
			String temp = textField.getText().trim();
			copyBoard.replace(0, copyBoard.length(), temp);
			newItemMenuItem_4.setEnabled(true);
		} else if (s.equals("粘贴(p)")) {
			textField.setText(copyBoard.toString());
		} else if (s.equals("CE")) {
			// 如果是CE则清除文本框
			textField.setText("0.");
		} else if (s.equals("BackSpace")) {
			if (!textField.getText().trim().equals("0.")) {
				// 如果文本框中有内容
				if (str.length() != 1 && str.length() != 0) {
					textField.setText(str
							.delete(str.length() - 1, str.length()).toString());
				} else {
					textField.setText("0.");
					str.setLength(0);
				}
			}
			op2 = Double.parseDouble(textField.getText().trim());
		} else if (s.equals("C")) {
			// 如果是C删除当前计算
			textField.setText("0.");
			op1 = op2 = 0;
			str.replace(0, str.length(), " ");
			preOp = currentOp = 0;
		} else if (s.equals("MC")) {
			// 如果是MC则清除缓冲区
			String temp = "";
			memory.replace(0, memory.length(), temp);
		} else if (s.equals("MR")) {
			// 如果按键为MR则恢复缓冲区的数到文本框
			textField.setText(memory.toString());
		} else if (s.equals("MS")) {
			// 如果按键为MS则将文本框的数存入缓冲区
			String s1 = textField.getText().trim();
			memory.replace(0, memory.length(), s1);
		} else if (s.equals("M+")) {
			// 如果按键为MS则将文本框值与缓冲区的数相加但不显示结果
			String temp1 = textField.getText().trim();
			double dtemp = Double.parseDouble(temp1);
			String temp2 = memory.toString();
			dtemp += Double.parseDouble(temp2);
			temp1 = String.valueOf(dtemp);
			memory.replace(0, memory.length(), temp1);
		} else if (s.equals("1/x")) {
			// 如果按键为1/x则将文本框中的数据为它的倒数
			String temp = textField.getText().trim();
			double dtemp = Double.parseDouble(temp);
			textField.setText("1/"+dtemp+"=" + 1 / dtemp);
		} else if (s.equals("sqrt")) {
			// 如果按键为sqrt则将文本框中的内容求平方根
			String temp = textField.getText().trim();
			double dtemp = Double.parseDouble(temp);
			textField.setText("sqrt(" +dtemp+")= "+ Math.sqrt(dtemp));
		} else if (s.equals("+")) {
			str.setLength(0);
			if (currentOp == 0) {
				preOp = currentOp = 1;
				op2 = 0;
				textField.setText("" + op1);
			} else {
				currentOp = preOp;
				preOp = 1;
				switch (currentOp) {
				case 1:
					op1 += op2;
					textField.setText("" + op1);
					break;
				case 2:
					op1 -= op2;
					textField.setText("" + op1);
					break;
				case 3:
					op1 *= op2;
					textField.setText("" + op1);
					break;
				case 4:
					op1 /= op2;
					textField.setText("" + op1);
					break;
				}
			}
		} else if (s.equals("-")) {
			str.setLength(0);
			if (currentOp == 0) {
				preOp = currentOp = 2;// op1=op2;op2=0;
				textField.setText("" + op1);
			} else {
				currentOp = preOp;
				preOp = 2;
				switch (currentOp) {
				case 1:
					op1 = op1 + op2;
					textField.setText("" + op1);
					break;
				case 2:
					op1 = op1 - op2;
					textField.setText("" + op1);
					break;
				case 3:
					op1 = op1 * op2;
					textField.setText("" + op1);
					break;
				case 4:
					op1 = op1 / op2;
					textField.setText("" + op1);
					break;
				}
			}
		} else if (s.equals("*"))// *
		{
			str.setLength(0);
			if (currentOp == 0) {
				preOp = currentOp = 3;// op1=op2;op2=1;
				textField.setText("" + op1);// op1=op2;
			} else {
				currentOp = preOp;
				preOp = 3;
				switch (currentOp) {
				case 1:
					op1 = op1 + op2;
					textField.setText("" + op1);
					break;
				case 2:
					op1 = op1 - op2;
					textField.setText("" + op1);
					break;
				case 3:
					op1 = op1 * op2;
					textField.setText("" + op1);
					break;
				case 4:
					op1 = op1 / op2;
					textField.setText("" + op1);
					break;
				}
			}
		} else if (s.equals("/"))// /
		{
			str.setLength(0);
			if (currentOp == 0) {
				preOp = currentOp = 4;// op2=1;
				textField.setText("" + op1);// op1=op2;
			} else {
				currentOp = preOp;
				preOp = 4;
				switch (currentOp) {
				case 1:
					op1 = op1 + op2;
					textField.setText("" + op1);
					break;
				case 2:
					op1 = op1 - op2;
					textField.setText("" + op1);
					break;
				case 3:
					op1 = op1 * op2;
					textField.setText("" + op1);
					break;
				case 4:
					op1 = op1 / op2;
					textField.setText("" + op1);
					break;
				}
			}
		} else if (s.equals("="))// =
		{
			if (currentOp == 0) {
				str.setLength(0);
				textField.setText("" + op2);
			} else {
				double op11=op1;
				double op22=op2;
				str.setLength(0);
				currentOp = preOp;
				switch (currentOp) {
				case 1:
					op1 = op1 + op2;
					textField.setText(op11+"+"+op22+"=" + op1);
					break;
				case 2:
					op1 = op1 - op2;
					textField.setText(op11+"-"+op22+"=" + op1);
					break;
				case 3:
					op1 = op1 * op2;
					textField.setText(op11+"*"+op22+"=" + op1);
					break;
				case 4:
					op1 = op1 / op2;
					textField.setText(op11+"/"+op22+"=" + op1);
					break;
				}
				currentOp = 0;
				op2 = 0;
			}
		} else if (s.equals(".")) {
			isDouble = true;
			if (textField.getText().trim().indexOf('.') != -1){
			//textField.setText(textField.getText());
			}
			else {
				if (textField.getText().trim().equals("0")) {
					str.setLength(0);
					textField.setText((str.append("0" + s)).toString());
				}
				 else if(textField.getText().trim().equals("")){}//如果初时显示为空则不做任何操作
				else {
					textField.setText((str.append(s)).toString());
				}
			}
		} else if (s.equals("0"))// 如果选择的是"0"这个数字键
		{
			if (textField.getText().trim().equals("0.")) {
			} else {
				textField.setText(str.append(s).toString());
				op2 = Double.parseDouble(textField.getText().trim());
			}
		} else {
			textField.setText(str.append(s).toString());
			op2 = Double.parseDouble(textField.getText().trim());
			if (currentOp == 0)
				op1 = op2;
		}
	}// end actionPerformed
	public void helpHelp(){
		  JOptionPane.showMessageDialog(this,"       该计算器的功能简单,可进行基本运算,在此对该计\n算器功能键介绍" +
  "说明:“粉红色”的功能键已经实现,\n“红色”的功能键只有sqrt(开平方)能使用,如果按键为\nsqrt则将文本框中的内容求平方根!!如果按键" +
  "为1/x则将\n文本框中的数据为它的倒数!!!此外“%”的功能未实现。\n*******谢谢使用************************************" +
  "**" ,"help",JOptionPane.INFORMATION_MESSAGE);
		 }
	public void aboutCaculator(){
		  JOptionPane.showMessageDialog(this,"      这是一个很简单的计算器,“加、减、乘、除、开平方”这几个简单的\n功能基本上实现。" +
		  		"其他功能及功能完善还有待改进,仅供学习参考!\n     作者:劳黑炭      于 二〇一二年十一月八日         版本:V 1.0 \n当前系统" +
		  		"时间:"+new Date(),"简单计算器",JOptionPane.INFORMATION_MESSAGE);
		 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值