📄 calculator.java
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import java.text.DecimalFormat;
public class Calculator extends JFrame implements ActionListener,ItemListener { //导入动作监听接口
//设计面板中的单位
JTextField textAnswer;
JPanel panel, panel1, panel2, panel3,panel4;
JMenuBar mainMenu; //菜单条
JTextField textMemory; //用于答案的输出
JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状
JButton buttonBk, buttonCe, buttonC;
JButton button[]; //
JButton buttonMC, buttonMR, buttonMS, buttonMAdd;
JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul,
buttonDiv, buttonMod;
JButton buttonSqrt, buttonDao, buttonEqual,buttonsin,buttoncos,buttontan,buttonx,
buttonasin,buttonacos,buttonatan,buttonx3,buttonabs,buttonlog,buttonn,buttonxy,
buttonA,buttonB,buttonc,buttonD,buttonE,buttonF;
JMenu editMenu, viewMenu, helpMenu;
JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal;
DecimalFormat df; //设置数据输出精度
boolean clickable; //控制当前能否按键
double memoryd; //使用内存中存储的数字
double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd)
short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算
String copy; //做复制用
JTextArea help; //帮助
JScrollPane scrollHelp;
boolean cb=false,jb_16=false,jb_10=false,jb_8=false,jb_2=false; //状态标志
//构造函数
public Calculator() {
clickable = true;
answerd = 0;
df = new DecimalFormat("0.############################"); //设置数据输出精度(对于double型值)
textAnswer = new JTextField(5);
textAnswer.setText("");
textAnswer.setEditable(false); //不可编辑
textAnswer.setBackground(Color.white);
panel = new JPanel();
Container container=getContentPane(); //获得一个容器
container.add(panel); //将一个面版主件添加到容器中
panel1 = new JPanel();
panel2 = new JPanel();
panel.setLayout(new BorderLayout());//网格布局面板
//设计整个面板
ActionListener MenuB= new MenuBAction();
mainMenu = new JMenuBar();
editMenu = new JMenu("编辑(E)");
viewMenu = new JMenu("查看(V)");
helpMenu = new JMenu("帮助(H)");
copyItem = new JMenuItem(" 复制(C) Ctrl+C");
copyItem.addActionListener(MenuB);
pasteItem = new JMenuItem(" 粘贴(V) Ctrl+V");
pasteItem.addActionListener(MenuB);
editMenu.add(copyItem);
editMenu.add(pasteItem);
tItem = new JMenuItem("●标准型(T)");
tItem.addActionListener(MenuB);
sItem = new JMenuItem(" 科学型(S)");
sItem.addActionListener(MenuB);
numberGroup = new JMenuItem(" 数字分组(I)");
numberGroup.addActionListener(MenuB);
viewMenu.add(tItem);
viewMenu.add(sItem);
viewMenu.add(numberGroup);
topHelp = new JMenuItem(" 帮助主题(H)");
topHelp.addActionListener(MenuB);
help = new JTextArea(15, 20);
scrollHelp = new JScrollPane(help);
help.setEditable(false);
help.append("执行简单计算\n");
help.append("1. 键入计算的第一个数字。\n");
help.append("2. 单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。\n");
help.append("3. 键入计算的下一个数字。\n");
help.append("4. 输入所有剩余的运算符和数字。\n");
help.append("15. 单击“=”。\n");
aboutCal = new JMenuItem(" 关于计算器(A)");
aboutCal.addActionListener(MenuB);
helpMenu.add(topHelp);
helpMenu.add(aboutCal);
mainMenu.add(editMenu);
mainMenu.add(viewMenu);
mainMenu.add(helpMenu);
setJMenuBar(mainMenu);
panel4=new JPanel();
panel.add(textAnswer, BorderLayout.NORTH);
panel.add(panel4, BorderLayout.CENTER);
panel.add(panel1, BorderLayout.SOUTH);
panel1.setLayout(new BorderLayout());//边缘布局
textMemory=new JTextField(3);
textMemory.setEditable(false);
textMemory.setBackground(new Color(217, 217, 217));
labelMemSpace=new JLabel(" ");
buttonBk=new JButton("Backspace");
buttonBk.setForeground(new Color(255, 0, 0));
buttonCe=new JButton("CE");
buttonCe.setForeground(new Color(255, 0, 0));
buttonC=new JButton("C");
buttonC.setForeground(new Color(255, 0, 0));
buttonBk.addActionListener(this);
buttonCe.addActionListener(this);
buttonC.addActionListener(this);
CheckboxGroup cbg=new CheckboxGroup(); //复选框
CheckboxGroup cbgs=new CheckboxGroup(); //复选框
Checkbox cbg1=new Checkbox("十六进制",false,cbg);
Checkbox cbg2=new Checkbox("十进制",true,cbg);
Checkbox cbg3=new Checkbox("八进制",false,cbg);
Checkbox cbg4=new Checkbox("二进制",false,cbg);
Checkbox cbg5=new Checkbox("角度",false,cbgs);//单选框
Checkbox cbg6=new Checkbox("弧度",true,cbgs);//单选框
panel1.add(panel2, BorderLayout.NORTH);
panel2.setLayout(new FlowLayout(FlowLayout.RIGHT));
cbg1.addItemListener(this); //"十六进制"单选按钮注册监听
cbg2.addItemListener(this); //"十进制"单选按钮注册监听
cbg3.addItemListener(this); //"八进制"单选按钮注册监听
cbg4.addItemListener(this); //"二进制"单选按钮注册监听
cbg5.addItemListener(this); //"角度"单选按钮注册监听
cbg6.addItemListener(this); //"弧度"单选按钮注册监听
panel2.add(textMemory);
panel2.add(labelMemSpace);
panel2.add(buttonBk);
panel2.add(buttonCe);
panel2.add(buttonC);
panel4.add(cbg1);
panel4.add(cbg2);
panel4.add(cbg3);
panel4.add(cbg4);
panel4.add(cbg5);
panel4.add(cbg6);
panel3=new JPanel();
panel1.add(panel3, BorderLayout.CENTER);
button=new JButton[10];
for(int i=0;i<button.length;i++) {
button[i]=new JButton(Integer.toString(i));
button[i].setForeground(new Color(0, 0, 255));
}
buttonA=new JButton("A"); //按钮实例化
buttonA.setForeground(Color.blue);
buttonB=new JButton("B");
buttonB.setForeground(Color.blue);
buttonc=new JButton("C");
buttonc.setForeground(Color.blue);
buttonD=new JButton("D");
buttonD.setForeground(Color.blue);
buttonE=new JButton("E");
buttonE.setForeground(Color.blue);
buttonF=new JButton("F");
buttonF.setForeground(Color.blue);
buttonMC=new JButton("MC");
buttonMC.setForeground(Color.red); //
buttonMR=new JButton("MR");
buttonMR.setForeground(Color.red);
buttonMS=new JButton("MS");
buttonMS.setForeground(Color.red);
buttonMAdd=new JButton("M+");
buttonMAdd.setForeground(Color.red);
buttonDot=new JButton(".");
buttonDot.setForeground(Color.blue);
buttonAddAndSub = new JButton("+/-");
buttonAddAndSub.setForeground(Color.blue);
buttonAdd=new JButton("+");
buttonAdd.setForeground(Color.red);
buttonSub=new JButton("-");
buttonSub.setForeground(Color.red);
buttonMul=new JButton("*");
buttonMul.setForeground(Color.red);
buttonDiv=new JButton("/");
buttonDiv.setForeground(Color.red);
buttonMod=new JButton("%");
buttonMod.setForeground(Color.red);
buttonSqrt=new JButton("sqrt");
buttonSqrt.setForeground(Color.red);
buttonDao=new JButton("1/x");
buttonDao.setForeground(Color.red);
buttonEqual=new JButton("=");
buttonEqual.setForeground(Color.red);
buttonsin=new JButton("sin"); //求正弦
buttoncos=new JButton("cos"); //求余弦
buttontan=new JButton("tan"); //求正切
buttonx=new JButton("x^1/2"); //求平方根
buttonasin=new JButton("asin"); //求反正弦
buttonacos=new JButton("acos"); //求反余弦
buttonatan=new JButton("atan"); //求反正切
buttonx3=new JButton("x^3"); //求立方
buttonabs=new JButton("abs"); //求绝对值
buttonlog=new JButton("log"); //求以e为底的对数
buttonn=new JButton("n!"); //求阶乘
buttonxy=new JButton("x^y"); //求x的y次方
//将所有行为与监听绑定
panel3.setLayout(new GridLayout(7, 6));
JButton addbutton[]={buttonx,buttonx3,buttonabs,buttonlog,buttonn,buttonxy,
buttonsin,buttoncos,buttontan,buttonatan,buttonasin,buttonacos,
buttonA,buttonB,buttonc,buttonD,buttonE,buttonF,
buttonMC,button[7],button[8],button[9],buttonDiv,buttonSqrt,
buttonMR,button[4],button[5],button[6],buttonMul,buttonMod,
buttonMS,button[1],button[2],button[3],buttonSub,buttonDao,
buttonMAdd,button[0],buttonAddAndSub,buttonDot,buttonAdd,buttonEqual};
addButton(addbutton);
buttonA.setEnabled(false);
buttonB.setEnabled(false);
buttonc.setEnabled(false);
buttonD.setEnabled(false);
buttonE.setEnabled(false);
buttonF.setEnabled(false);
setSize(300,150);
pack();
setVisible(true);
setResizable(false);
}
private void addButton(JButton button[]) //给按钮数组中的按钮分别注册监听并将他们放进一个面板中
{
for(int i=0;i<button.length;i++)
{
button[i].addActionListener(this);
panel3.add(button[i]);
}
}
public void itemStateChanged(ItemEvent e) //单选框注册事件
{
Checkbox temp=(Checkbox)e.getItemSelectable();
if(temp.getLabel()=="角度") cb=true;
else if(temp.getLabel()=="十六进制")
{
try
{
if(textAnswer.getText()!="")
{
//对文本框中的数据进行转换
if(jb_10==true) textAnswer.setText(Integer.toHexString(Integer.parseInt(textAnswer.getText())));
else if(jb_8==true) {String k=Integer.valueOf(textAnswer.getText(),8).toString();
textAnswer.setText(Integer.toHexString(Integer.parseInt(k)));}
else if(jb_2==true) {String k=Integer.valueOf(textAnswer.getText(),2).toString();
textAnswer.setText(Integer.toHexString(Integer.parseInt(k)));}
}
}catch(NumberFormatException ie){}
//设置标志位
jb_16=true; jb_10=false; jb_8=false; jb_2=false;
//更改按钮的状态
buttonsin.setEnabled(false); buttoncos.setEnabled(false);
buttontan.setEnabled(false); buttonasin.setEnabled(false);
buttonacos.setEnabled(false); buttonatan.setEnabled(false);
buttonA.setEnabled(true); buttonB.setEnabled(true);
buttonc.setEnabled(true); buttonD.setEnabled(true);
buttonE.setEnabled(true);buttonF.setEnabled(true);
button[8].setEnabled(true); button[9].setEnabled(true);
button[3].setEnabled(true); button[4].setEnabled(true);
button[5].setEnabled(true); button[6].setEnabled(true);
button[7].setEnabled(true); buttonDot.setEnabled(false);
button[2].setEnabled(true);
}
else if(temp.getLabel()=="十进制")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -