⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplecalculator.java

📁 java制作的计算器小程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 *实验名称: 计算器
 *
 *1.实验目的:图形界面设计。
 *      熟悉java.awt包中的组件,掌握图形界面设计方法,理解委托事件处理模型。
 *
 *2.题意:
 *      请设计并实现Windows系统中“计算器”的窗口及功能。
 *
 *3.实验要求:
 * (1)设计图形界面添加菜单:窗口上添加各种组件及菜单,并处理组件及菜单的事件监听程序。
 * (2)运算:实现多种运算,保证运算正确性。
 *
 *
 *作者:计算机032 胡勇健 03095218
 */

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


public class  SimpleCalculator extends TextField implements ActionListener,ItemListener
{
	//私有成员变量的定义:

    /*以下为计算机的各部分组件*/
	Frame mainFrame;                                    //主框架
	JTextField answerText;								//显示计算结果
	JTextField memoryState;					            //显示计算器内存的使用情况
	MenuBar menuGroup;                                  //菜单栏
	Menu editMenu,viewMenu,helpMenu;                    //编辑,查看,帮助菜单
	MenuItem copyItem,pasteItem;                        //复制,粘贴
	MenuItem standardModel;				                //标准型
	CheckboxMenuItem numGroup;							//数字分组
	MenuItem aboutCal;                                  //关于计算器
	Button buttonBackSpace,buttonCE,buttonC;            //退格,清除,清空按钮
	Button buttonMC,buttonMR,buttonMS,buttonMADD;       //内存操作按钮
	Button buttonNum[];                                 //数字按钮
	Button buttonAdd,buttonSub,buttonMul,buttonDiv;     //+,-,*,/
	Button buttonDot,buttonSign,buttonEqual;            //. +/- =
	Button buttonSqrt,buttonMod,buttonReciprocal;       //sqrt % 1/x

	/*以下为运算时所用到的变量*/
	StringBuffer textBuffer;							//记录数值的字符串
	int numDot;											//小数点的个数
	int operator;										//操作符:1-加法 2-减法 3-乘法 4-除法
	double firstValue,secondValue,result;				//第一、二个数及结果
	boolean enterSecond;								//是否已经输入了第二个数
	int forFirOrSec;									//此时输入的是第一个还是第二个数
	boolean b_remFir,b_remSec,b_remFun;					//指示是否此时还记的上次的数和运算符
	int remFun;											//记住上次的运算符
	double remFir,remSec;								// 记住上次参加运算的第一二个数
	boolean isNumGroup=false;							//记录是否为数字分组
	boolean canBeBack;									//是否可以使用退格键
	double memory;										//用于内存操作时保存的数据

	/*以下为本计算器与系统其他资源数据交换的变量*/
	Clipboard clipbd = getToolkit().getSystemClipboard(); 

	//结束私有成员变量的定义。



	//构造函数:
	SimpleCalculator()
	{
		initMainFrame();
		initTextField();
		initButtons();
		initMenu();
		OverallArrangement();
		reSet();
		mainFrame.setVisible(true);
	}
	//结束构造函数。


	//对各GUI组件进行的操作函数

	/*
	 * void initMainFrame()函数是对主框架进行初始化,设置其框架大小270*250,
	 * 初始位置270*250,背景颜色Color.lightGray, 是否显示true,能否改变窗
	 * 口大小false,以及增加了addWindowListener委托事件,当关闭窗口时调用
	 * System.exit(0) 系统指令,结束程序。
	 */
	void initMainFrame()
	{
		mainFrame = new Frame("计算器");
		mainFrame.setSize(270,250);
		mainFrame.setLocation(200,140);
		mainFrame.setBackground(Color.lightGray);
		mainFrame.setResizable(false);
		mainFrame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
	}

	/*
	 * initTextField() 是对文本 textBuffer answerText memoryState得初始化,
	 * textBuffer 是用于对文本的缓冲处理,StringBuffer类优于String类是因为
	 * StringBuffer是对字符串直接操作,从而节省了内存。由于在这个计算器程
	 * 序中,对字符串的操作量很大,因此,StringBuffer 在这方面体现出了其本身
	 * 的优势。answerText 和 memoryState 用swing的组件JTextField是因为JTextField
	 * 显示文本框时可以在文本框的右边显示,符合Windows自带计算器的特点。
	 * answerText 和 memoryState 的背景色为白色,都不能进行编辑。answerText
	 * 为右对齐,大小为23个字符,而memoryState为2个字符。
	 */
	void initTextField()
	{
		textBuffer = new StringBuffer("");

		answerText = new JTextField(textBuffer.toString(),22);
		answerText.setHorizontalAlignment(JTextField.RIGHT);
		answerText.setEditable(false);
		answerText.setBackground(Color.white);

		memoryState = new JTextField(2);
		memoryState.setEditable(false);
		memoryState.setBackground(Color.white);
	}



	/*
	 * initButtons()函数是对各按钮进行初始化,为每一个按钮增加其标签
	 * 并增加了 addActionListener(this) 功能,用于给各按钮增加属性,
	 * 具体的功能代码,请见 actionPerformed(ActionEvent e);其中,数字
	 * 按钮、四则运算按钮、小数点按钮都增加了键盘输入功能addKeyListener
	 * 其参数为匿名类KeyListener的适配器new KeyAdapter(),当在键盘上按下
	 * 相应的键时,为其增加相应的属性功能。
	 */
	void initButtons()
	{
		buttonBackSpace = new Button("BackSpace");
		buttonBackSpace.addActionListener(this);
		buttonCE = new Button("   CE   ");
		buttonCE.addActionListener(this);
		buttonC  = new Button("    C    ");
		buttonC.addActionListener(this);
		
		buttonMC = new Button("MC");
		buttonMC.addActionListener(this);
		buttonMR = new Button("MR");
		buttonMR.addActionListener(this);
		buttonMS = new Button("MS");
		buttonMS.addActionListener(this);
		buttonMADD = new Button("M+");
		buttonMADD.addActionListener(this);

		buttonNum = new Button[10];
		for (int i=0;i<buttonNum.length ;i++ )
		{
			buttonNum[i] = new Button(Integer.toString(i));
			buttonNum[i].addActionListener(this);
			buttonNum[i].addKeyListener(new KeyAdapter(){
				public void keyTyped(KeyEvent e){
					if (Character.isDigit(e.getKeyChar()))
					{
						textBuffer.append(e.getKeyChar());
						answerText.setText(textBuffer.toString());
						AddNum();
					}
				}
			});
		}

		buttonAdd = new Button("+");
		buttonAdd.addActionListener(this);
		buttonAdd.addKeyListener(new KeyAdapter(){
			public void keyTyped(KeyEvent e){
				if (e.getKeyChar() == '+')
					AddFunction(1);
			}
		});
		buttonSub = new Button("-");
		buttonSub.addActionListener(this);
		buttonSub.addKeyListener(new KeyAdapter(){
			public void keyTyped(KeyEvent e){
				if (e.getKeyChar() == '-')
					AddFunction(2);
			}
		});
		buttonMul = new Button("*");
		buttonMul.addActionListener(this);
		buttonMul.addKeyListener(new KeyAdapter(){
			public void keyTyped(KeyEvent e){
				if (e.getKeyChar() == '*')
					AddFunction(3);
			}
		});
		buttonDiv = new Button("/");
		buttonDiv.addActionListener(this);
		buttonDiv.addKeyListener(new KeyAdapter(){
			public void keyTyped(KeyEvent e){
				if (e.getKeyChar() == '/')
					AddFunction(4);
			}
		});

		buttonDot = new Button(".");
		buttonDot.addActionListener(this);
		buttonDot.addKeyListener(new KeyAdapter(){
			public void keyTyped(KeyEvent e){
				if (e.getKeyChar() == '.')
				{
					textBuffer.append(e.getKeyChar());
					answerText.setText(textBuffer.toString());
					AddNum();
				}
			}
		});
		buttonSign = new Button("+/-");
		buttonSign.addActionListener(this);
		buttonEqual = new Button("=");
		buttonEqual.addActionListener(this);
		buttonEqual.addKeyListener(new KeyAdapter(){
			public void keyTyped(KeyEvent e){
				if (e.getKeyChar() == '=')
					OnGo();
			}
		});

		buttonSqrt = new Button("sqrt");
		buttonSqrt.addActionListener(this);
		buttonMod = new Button("%");
		buttonMod.addActionListener(this);
		buttonReciprocal = new Button("1/x");
		buttonReciprocal.addActionListener(this);
	}


	/*
	 * initMenu()函数是对各菜单的初始化,先为其生成实例对象,再添加到
	 * MenuBar 的实例对象 menuGroup 中,MenuItem 各项添加到相应的 Menu中。
	 */
	void initMenu()
	{
		/*
		 * 先为各个菜单项生成实例对象,并为其设置相应的标签。MenuItem各项
		 * 还要设置 addActionListener(this) 增加委托事件任务。
		 */
		menuGroup = new MenuBar();

		editMenu = new Menu("编辑(E)");
		viewMenu = new Menu("查看(V)");
		helpMenu = new Menu("帮助(H)");

		copyItem = new MenuItem("复制(C) Ctrl+C",new MenuShortcut(KeyEvent.VK_C));
		copyItem.addActionListener(new CopyNum());
		pasteItem = new MenuItem("粘贴(P) Ctrl+V",new MenuShortcut(KeyEvent.VK_V));
		pasteItem.addActionListener(new PasteNum());

		standardModel = new MenuItem("●标准型(T)");
		standardModel.addActionListener(this);
		numGroup = new CheckboxMenuItem("数字分组(I)",false);
		numGroup.addItemListener(this);

		aboutCal = new MenuItem("关于计算器(A)");
		aboutCal.addActionListener(this);

		/* 再把各个菜单相继加入到 MenuBar 中 */
		menuGroup.add(editMenu);
		menuGroup.add(viewMenu);
		menuGroup.add(helpMenu);

		editMenu.add(copyItem);
		editMenu.add(pasteItem);
		viewMenu.add(standardModel);
		viewMenu.add(numGroup);
		helpMenu.add(aboutCal);
	}


	/*
	 * OverallArrangement() 是根据mainFrame的框架大小,把文本框answerText,
	 * 内存使用的情况文本框memoryState,内存操作键 MR MS M+ MC,退格键BackSpace
	 * 清除键 CE ,清空键 C ,以及主键盘区的各键按照一定的比例位置加入到mainFrame
	 * 中.
	 */
	void OverallArrangement()
	{
		Panel textPanel = new Panel();								//文本框的容器
		Panel upperPanel = new Panel();								//计算器上部分的容器
		Panel centerPanel = new Panel();							//计算器中部的容器
		Panel mainPanel = new Panel();								//主键盘区的容器
		Panel leftPanel = new Panel();								//内存区的容器
		Panel rightPanel = new Panel();								//数字及相应的操作键盘区

		mainFrame.setMenuBar(menuGroup);                            //为主框架设置菜单栏
		mainFrame.add(upperPanel,BorderLayout.NORTH);				//把上容器放在主框架的北面
		mainFrame.add(centerPanel);									//把中容器放在主框架的中部
		mainFrame.add(mainPanel,BorderLayout.SOUTH);				//把主容器放在主框架的南面

		/*设置主框架的上半部分*/
		textPanel.add(answerText);									//把文本框添加到文本容器中
		upperPanel.add(textPanel);									//把文本容器放入上容器中

		/*设置主框架的中部*/
		//采用流式布局,各组件相互间隔10个像素
		centerPanel.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
				
		centerPanel.add(memoryState);								//把内存记忆框放在中容器中
		centerPanel.add(buttonBackSpace);							//把退格键放在中容器中
		centerPanel.add(buttonCE);									//把清除键放在中容器中
		centerPanel.add(buttonC);									//把清空键放在中容器中

		/*设置主框架的下半部分*/
		leftPanel.setLayout(new GridLayout(4,1,0,5));				//左下角的容器采用4*1的网式布局
		leftPanel.add(buttonMC);									//添加MC
		leftPanel.add(buttonMR);									//添加MR
		leftPanel.add(buttonMS);									//添加MS
		leftPanel.add(buttonMADD);									//添加M+
		mainPanel.add(leftPanel,BorderLayout.WEST);					//把此容器放在主容器的西面


		/*设置主键盘区*/
		rightPanel.setLayout(new GridLayout(4,5,5,5));				//采用4*5的网式布局,相互间隔5各像素

		/*添加各键*/
		rightPanel.add(buttonNum[7]);
		rightPanel.add(buttonNum[8]);
		rightPanel.add(buttonNum[9]);
		rightPanel.add(buttonDiv);
		rightPanel.add(buttonSqrt);
		rightPanel.add(buttonNum[4]);
		rightPanel.add(buttonNum[5]);
		rightPanel.add(buttonNum[6]);
		rightPanel.add(buttonMul);
		rightPanel.add(buttonMod);
		rightPanel.add(buttonNum[1]);
		rightPanel.add(buttonNum[2]);
		rightPanel.add(buttonNum[3]);
		rightPanel.add(buttonSub);
		rightPanel.add(buttonReciprocal);
		rightPanel.add(buttonNum[0]);
		rightPanel.add(buttonSign);
		rightPanel.add(buttonDot);
		rightPanel.add(buttonAdd);
		rightPanel.add(buttonEqual);
		mainPanel.add(rightPanel,BorderLayout.CENTER);

	}
	//结束对各GUI组件进行的操作函数。




	/*
	 * actionPerformed(ActionEvent e) 是为各按钮及菜单项添加相应的属性
	 */
	public void actionPerformed(ActionEvent e)
	{
		Object event = e.getSource();                   //所按下的按钮的命令

		//如果按下的是数字键
		for (int i=0;i<buttonNum.length;i++)
		{
			if (event == buttonNum[i])
			{
				textBuffer.append(e.getActionCommand());
				showScreen();
				AddNum();
				canBeBack = true;
			}
		}

		//如果按下的是小数点
		if (event == buttonDot)
		{
			if (textBuffer.indexOf(".") == -1)
			{
				numDot = 1;
				textBuffer.append(".");
				showScreen();
			}
		}


		//如果按下的是退格键
		if (event == buttonBackSpace && canBeBack == true)
		{
			if (textBuffer.length() > 0)
			{
				if (textBuffer.length()==1)
					textBuffer = new StringBuffer("0");
				else textBuffer.deleteCharAt(textBuffer.length()-1);
				showScreen();
				AddNum();
			}
		}


		//如果按下的是清除键
		if (event == buttonCE)
		{
			reSet();
		}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -