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

📄 calculator.java

📁 一款模拟windows的计算器
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/**
 * @author lztly 李振滔 Whuhan University Of Science and Technology
 * @作者 lztly 李振滔 武汉科技大学 计算机科学与技术2004级
 * @description 计算器
 */
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.lang.Double;
import java.lang.String;
import javax.swing.event.*;
import java.text.*;
import java.util.Stack;
import java.util.Vector;
import java.io.*;
import java.util.*;
import static java.lang.System.*;

public class Calculator extends JFrame implements ActionListener, ItemListener, MouseListener, FocusListener {

	//菜单条
	JMenuBar menuBar;

	//菜单:编辑、查看、帮助
	JMenu editMenu,viewMenu,helpMenu;

	//"编辑"的菜单项
	JMenuItem editMenu_copy,editMenu_paste;

	//"查看"的菜单项
	JRadioButtonMenuItem viewMenu_standarType,viewMenu_scienceType,
	viewMenu_Hexadecimal,viewMenu_Decimalism,viewMenu_Octal,viewMenu_Binary,
	viewMenu_Angle,viewMenu_Radian,viewMenu_Grads,viewMenu_DQ,viewMenu_DD,viewMenu_DW,viewMenu_DB;
	JMenuItem viewMenu_eval;

	//"帮助"的菜单项
	JMenuItem helpMenu_helpTopic,helpMenu_aboutCal;

	//文本框
	JTextField displayField;
	//对话框
//	JDialog evaldialog;
	//按钮
	public JButton btnBackspace,btnCE,btnClear,
	btnMC,btn7,btn8,btn9,btnDivide,btnSqrt,
	btnMR,btn4,btn5,btn6,btnMultiply,btnPercent,
	btnMS,btn1,btn2,btn3,btnMinus,btnReciprocal,
	btnMPlus,btn0,btnSign,btnDot,btnPlus,btnEqualSign,
	btnSta,btnAve,btnSum,btnS,btnDat,btnFE,btnDms,btnSin,
	btnCos,btnTan,btnLBracket,btnRBracket,btnExp,btnXPowY,
	btnXPow3,btnXPow2,btnLn,btnLog,btnFactorial,btnPI,btnA,
	btnB,btnC,btnD,btnE,btnF,btnMod,btnOr,btnLsh,btnAnd,
	btnXor,btnNot,btnInt;

	//用作边框的标签
	JLabel lblSystemType,lblDegreeType,lblDataLen,lblShift;

	//进制JRadioButton
	JRadioButton rbHexadecimal,rbDecimalism,rbOctal,rbBinary;

	//角度,弧度,梯度JRadioButton
	JRadioButton rbAngle,rbRadian,rbGrads;

	//字长JRadioButton,分别为四字,双字,单字,字节
	JRadioButton rbDQ,rbDD,rbDW,rbDB;

	//Inv,Hyp JCheckBox
	JCheckBox cbInv,cbHyp;

	//弹出菜单及菜单项
	JPopupMenu popupMenu;
	JMenuItem popupMenu_help;
	Component triggerComponent;
	Point triggerLocation;

	//统计框的组件
	JFrame dlgStatistic;//对话框
	JList	datalist;//数据列表
	JButton btnReturn,btnLoad,btnClearSelect,btnClearAll;//返回,加载,清零,全清按钮
	JLabel lblDataCount;//显示数据个数的标签
	Container dlgcon;//对话框的窗器
	JScrollPane scroll;//滚动容器
	JScrollBar scrollbar;//垂直滚动条
	Vector vecListData;//用于存放数据

	//用于显示帮助提示信息的对话框(无边框)
	JDialog dlgTips;
	JEditorPane lblTips;
	JEditorPane lbltipsshadow;
	Container dlgtipscon;

	//缺少右括弧时显示标志lblDisplayLackRightBracket
	JLabel lblDisplayLackRightBracket;

	//显示当前记忆功能的标签
	JLabel memoryLabel;
	//定义变量
	//一些变量标记
	boolean isDecimalism=true;//是否是十进制
	boolean isDot=false;//是否按过小数点
	boolean isError=false;//数字是否异常,如除数为0,负数开根号
	boolean isFirstOprator=true;//是否是第一次按操作符
	boolean isFirstEqual=true;//是否是第一次按等号
	boolean isOperandBegin=true;//是否是一个操作数的开始
	boolean isFirstPercent=true;//是否是第一次按百分号
	boolean isFirstReciprocal=true;//是否第一次按1/x
	boolean isExp=false;//是否要用科学记数法输入
	boolean canExp=true;//是否可以按科学记数法输入
	boolean isFE=false;//打开或关闭科学计数法
	String result="0";//运算结果
	String memoryPlusResult="0";//存放M+操作结果
	String firstOperand="0";//第一个操作数
	String secondOperand="0";//记住第二个操作数
	String copyNum="0";//用于存放复制显示区的字符串
	String bottomNum="";//存放倒数的底数
	String command="=";//存储操作符
	int pastCarry=10;//前一种进制
	int lbracketNum=0;

	//	用于格式化十进制时显示区的格式
	DecimalFormat decimalismFormat;

	//容器
	Container container;
	JDialog helpTopicsFrame;//帮助主题对话框

	///////////////////////////////////////////
	//科学计算器用的堆栈
	Stack operandStack;//操作数堆栈
	Stack operatorStack;//操作符堆栈
	//////////////////////////////////////////
	private MyDialog evaldialog=new MyDialog(this);
	//构造函数

	public Calculator() {




		//获取容器
		container=getContentPane();
		container.setLayout(null);


		//Object result12 =
		//创建菜单条
		menuBar = new JMenuBar();


		//创建编辑菜单及菜单项并注册事件监听
		editMenu = new JMenu("编辑(E)", true);
		editMenu.setMnemonic('E');

		editMenu_copy = new JMenuItem("复制(C)", 'C');
		editMenu_copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
		editMenu_copy.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				String tempStr=getPlainStr(displayField.getText());
				copyNum=tempStr;
			}
		});

		editMenu_paste = new JMenuItem("粘贴(P)", 'P');
		editMenu_paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
		editMenu_paste.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){

				//十六进制(包含字母)的格式化问题暂时还没解决,这里就直接输入没有格式化的十六进制字符串
				if(rbHexadecimal.isSelected()){
					displayField.setText(copyNum);
					return;
				}
				//二、八、十进制由于没有字母问题,可以直接转换成数字后进行格式化
				//setGroupingState();
				displayField.setText(decimalismFormat.format(new BigDecimal(copyNum)));
			}
		});

		//创建查看菜单及菜单项并注册事件监听
		viewMenu = new JMenu("查看(V)", true);
		viewMenu.setMnemonic('V');

		viewMenu_standarType = new JRadioButtonMenuItem("标准型(T)",true);
		viewMenu_standarType.setMnemonic('T');
		viewMenu_standarType.addActionListener(this);

		viewMenu_scienceType = new JRadioButtonMenuItem("科学型(S)");
		viewMenu_scienceType.setMnemonic('S');
		viewMenu_scienceType.addActionListener(this);

		ButtonGroup bGroup=new ButtonGroup();
		bGroup.add(viewMenu_standarType);
		bGroup.add(viewMenu_scienceType);

		viewMenu_Hexadecimal=new JRadioButtonMenuItem("十六进制(H)");
		viewMenu_Hexadecimal.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
		viewMenu_Hexadecimal.setMnemonic('H');
		viewMenu_Hexadecimal.addActionListener(this);

		viewMenu_Decimalism=new JRadioButtonMenuItem("十进制(D)",true);
		viewMenu_Decimalism.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F6,0));
		viewMenu_Decimalism.setMnemonic('D');
		viewMenu_Decimalism.addActionListener(this);

		viewMenu_Octal=new JRadioButtonMenuItem("八进制(O)");
		viewMenu_Octal.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F7,0));
		viewMenu_Octal.setMnemonic('O');
		viewMenu_Octal.addActionListener(this);

		viewMenu_Binary=new JRadioButtonMenuItem("二进制(B)");
		viewMenu_Binary.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F8,0));
		viewMenu_Binary.setMnemonic('B');
		viewMenu_Binary.addActionListener(this);

		ButtonGroup bGroup1=new ButtonGroup();
		bGroup1.add(viewMenu_Hexadecimal);
		bGroup1.add(viewMenu_Decimalism);
		bGroup1.add(viewMenu_Octal);
		bGroup1.add(viewMenu_Binary);

		viewMenu_Angle=new JRadioButtonMenuItem("角度(E)",true);
		viewMenu_Angle.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0));
		viewMenu_Angle.setMnemonic('E');
		viewMenu_Angle.addActionListener(this);

		viewMenu_Radian=new JRadioButtonMenuItem("弧度(R)");
		viewMenu_Radian.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
		viewMenu_Radian.setMnemonic('R');
		viewMenu_Radian.addActionListener(this);

		viewMenu_Grads=new JRadioButtonMenuItem("梯度(G)");
		viewMenu_Grads.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,0));
		viewMenu_Grads.setMnemonic('G');
		viewMenu_Grads.addActionListener(this);

		ButtonGroup bGroup2=new ButtonGroup();
		bGroup2.add(viewMenu_Angle);
		bGroup2.add(viewMenu_Radian);
		bGroup2.add(viewMenu_Grads);

		//四字,双字,单字,字节
		viewMenu_DQ=new JRadioButtonMenuItem("四字(Q)",true);
		viewMenu_DQ.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12,0));
		viewMenu_DQ.setMnemonic('Q');
		viewMenu_DQ.addActionListener(this);

		viewMenu_DD=new JRadioButtonMenuItem("DWORD值(R)");
		viewMenu_DD.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0));
		viewMenu_DD.setMnemonic('R');
		viewMenu_DD.addActionListener(this);

		viewMenu_DW=new JRadioButtonMenuItem("单字(W)");
		viewMenu_DW.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
		viewMenu_DW.setMnemonic('W');
		viewMenu_DW.addActionListener(this);

		viewMenu_DB=new JRadioButtonMenuItem("字节(Y)");
		viewMenu_DB.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,0));
		viewMenu_DB.setMnemonic('Y');
		viewMenu_DB.addActionListener(this);

		ButtonGroup bGroup3=new ButtonGroup();
		bGroup3.add(viewMenu_DQ);
		bGroup3.add(viewMenu_DD);
		bGroup3.add(viewMenu_DW);
		bGroup3.add(viewMenu_DB);

		viewMenu_eval=new JMenuItem("表达式(E)",'E');
		viewMenu_eval.addActionListener(this);

		//MyDialog evaldialog =new MyDialog(this);

		//创建帮助菜单及菜单项并注册事件监听
		helpMenu=new JMenu("帮助(H)",true);
		helpMenu.setMnemonic('H');

		helpMenu_helpTopic=new JMenuItem("帮助主题(H)",'H');
		helpMenu_helpTopic.addActionListener(this);
		helpMenu_aboutCal=new JMenuItem("关于计算器(A)",'A');
		helpMenu_aboutCal.addActionListener(this);



		//向菜单条添加编辑菜单及菜单项
		menuBar.add(editMenu);
		editMenu.add(editMenu_copy);
		editMenu.add(editMenu_paste);

		//向菜单条添加查看菜单及菜单项
		menuBar.add(viewMenu);
		viewMenu.add(viewMenu_standarType);
		viewMenu.add(viewMenu_scienceType);
		viewMenu.addSeparator();
		viewMenu.add(viewMenu_Hexadecimal);
		viewMenu.add(viewMenu_Decimalism);
		viewMenu.add(viewMenu_Octal);
		viewMenu.add(viewMenu_Binary);
	    viewMenu.addSeparator();
		viewMenu.add(viewMenu_Angle);
		viewMenu.add(viewMenu_Radian);
		viewMenu.add(viewMenu_Grads);
		viewMenu.add(viewMenu_DQ);
		viewMenu.add(viewMenu_DD);
		viewMenu.add(viewMenu_DW);
		viewMenu.add(viewMenu_DB);
		viewMenu.addSeparator();
		viewMenu.add(viewMenu_eval);

		//向菜单条添加帮助菜单及菜单项
		menuBar.add(helpMenu);
		helpMenu.add(helpMenu_helpTopic);
		helpMenu.addSeparator();
		helpMenu.add(helpMenu_aboutCal);

		//创建右键弹出菜单
		popupMenu=new JPopupMenu();
		popupMenu_help=new JMenuItem("这是什么?(W)",'W');
		popupMenu.add(popupMenu_help);
		popupMenu_help.addActionListener(this);

		//向窗口添加菜单条
		this.setJMenuBar(menuBar);

		//创建显示数据的文本框
		displayField=new JTextField();
		displayField.setHorizontalAlignment(JTextField.RIGHT);
		displayField.setText("0.");
		displayField.setEditable(false);
		displayField.setFocusable(true);
		container.add(displayField);

		//创建进制选择按钮、角度弧度梯度选择按钮和字长选择按钮

		//进制
		lblSystemType=new JLabel();
		lblSystemType.setBorder(BorderFactory.createTitledBorder(""));

		rbHexadecimal=new JRadioButton("十六进制");
		rbDecimalism=new JRadioButton("十进制",true);
		rbOctal=new JRadioButton("八进制");
		rbBinary=new JRadioButton("二进制");
		ButtonGroup bGroupSysType=new ButtonGroup();
		bGroupSysType.add(rbHexadecimal);
		bGroupSysType.add(rbDecimalism);
		bGroupSysType.add(rbOctal);
		bGroupSysType.add(rbBinary);
		rbHexadecimal.addItemListener(this);
		rbDecimalism.addItemListener(this);
		rbOctal.addItemListener(this);
		rbBinary.addItemListener(this);

		container.add(rbHexadecimal);
		rbHexadecimal.setBounds(9,28,75,18);
		container.add(rbDecimalism);
		rbDecimalism.setBounds(80,28,65,18);
		container.add(rbOctal);
		rbOctal.setBounds(141,28,65,18);
		container.add(rbBinary);
		rbBinary.setBounds(205,28,65,18);

		container.add(lblSystemType);

		//角度弧度梯度
		lblDegreeType=new JLabel();
		lblDegreeType.setBorder(BorderFactory.createTitledBorder(""));

		rbAngle=new JRadioButton("角度",true);
		rbRadian=new JRadioButton("弧度");
		rbGrads=new JRadioButton("梯度");
		ButtonGroup bGroupDegreeType=new ButtonGroup();
		bGroupDegreeType.add(rbAngle);
		bGroupDegreeType.add(rbRadian);
		bGroupDegreeType.add(rbGrads);
		rbAngle.addItemListener(this);
		rbRadian.addItemListener(this);
		rbGrads.addItemListener(this);


		container.add(rbAngle);
		rbAngle.setBounds(283,28,55,18);
		container.add(rbRadian);
		rbRadian.setBounds(345,28,55,18);
		container.add(rbGrads);
		rbGrads.setBounds(409,28,55,18);

		container.add(lblDegreeType);

		//字长
		lblDataLen=new JLabel();
		lblDataLen.setBorder(BorderFactory.createTitledBorder(""));

		rbDQ=new JRadioButton("四字",true);
		rbDD=new JRadioButton("双字");
		rbDW=new JRadioButton("单字");
		rbDB=new JRadioButton("字节");
		ButtonGroup bGroupDataLen=new ButtonGroup();
		bGroupDataLen.add(rbDQ);
		bGroupDataLen.add(rbDD);
		bGroupDataLen.add(rbDW);
		bGroupDataLen.add(rbDB);
		rbDQ.addItemListener(this);
		rbDD.addItemListener(this);
		rbDW.addItemListener(this);
		rbDB.addItemListener(this);

		container.add(rbDQ);
		rbDQ.setBounds(283,28,55,18);
		container.add(rbDD);
		rbDD.setBounds(343,28,55,18);
		container.add(rbDW);
		rbDW.setBounds(402,28,55,18);
		container.add(rbDB);
		rbDB.setBounds(461,28,55,18);

		container.add(lblDataLen);

		//上档键Inv,Hyp
		lblShift=new JLabel();
		lblShift.setBorder(BorderFactory.createTitledBorder(""));


		cbInv=new JCheckBox("Inv");
		cbHyp=new JCheckBox("Hyp");

		container.add(cbInv);
		cbInv.setBounds(9,59,50,18);
		container.add(cbHyp);
		cbHyp.setBounds(69,59,50,18);

		container.add(lblShift);

		//创建显示缺少右括号时的标签
		lblDisplayLackRightBracket=new JLabel();
		lblDisplayLackRightBracket.setFont(new Font("Arial",Font.PLAIN,12));
		lblDisplayLackRightBracket.setHorizontalAlignment(SwingConstants.CENTER);
		lblDisplayLackRightBracket.setBorder(BorderFactory.createLoweredBevelBorder());
		container.add(lblDisplayLackRightBracket);


		//创建显示记忆功能的标签
		memoryLabel=new JLabel();
		memoryLabel.setHorizontalAlignment(SwingConstants.CENTER);
		memoryLabel.setBorder(BorderFactory.createLoweredBevelBorder());
		container.add(memoryLabel);

		//创建Backspace按钮
		btnBackspace=new JButton("Backspace");
		btnBackspace.setForeground(Color.RED);
		btnBackspace.setMargin(new Insets(0,1,2,1));
		container.add(btnBackspace);
		btnBackspace.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				if(isError==true||isOperandBegin==true){
					return;
				}

				String displayStr=displayField.getText();
				if(isExp==true&&rbDecimalism.isSelected()){
					//按科学记数法输入
					if(displayField.getText().indexOf("E+0")!=-1){
						displayField.setText(displayField.getText().substring(0,displayField.getText().indexOf("E")));
						isExp=false;
						return;
					}
					else{

⌨️ 快捷键说明

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