📄 calculator.java
字号:
/**
* @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 + -