📄 caculator.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.math.*;
//**********************[窗体及功能类]***********************
class Window extends JFrame implements ActionListener,KeyListener,ItemListener
{
double pi=3.1415926535897932384626433832795;
//************--------菜单条相关声明--------**************
JMenuBar menubar;
JMenu menu1,menu2,menu3;
JMenuItem item1,item2,item3,item4,item5,item6;
//**************--------布局相关声明--------**************
Box basebox;
JPanel panel,panel1,panel2,panel3,panel4,panel22;
//************--------文本框相关声明--------**************
JTextField t_show;//主显示框
JLabel Null;//为布局而设的空插件
JTextField t_M,t_K;//t_M指示储存器状态,t_K指示括号状态
//************----------按钮相关声明--------**************
JButton b_Backspace,b_CE,b_C;//操作区按钮
JButton b_MC,b_MR,b_MS,b_Madd;//存储器区按钮
JButton b_0,b_1,b_2,b_3,b_4,b_5,b_6,b_7,b_8,b_9;//数字区按键
JButton b_add,b_sub,b_mul,b_div,b_sqrt,b_dao,b_sign,b_dian,b_deng,b_100;//标准操作按键
JButton b_xy,b_ln,b_log,b_pi,b_x2,b_x3,b_sin,b_cos,b_tan,b_k1,b_k2,b_n;//科学操作按键
ButtonGroup group;//单选域
JRadioButton j,h;//单选扭,j是角度,h是弧度
//************----------数据相关声明--------**************
double d[]={0,0,0,0,0,0,0,0,0,0,0};//数据1~10
String t[]={"0","0","0","0","0","0","0","0","0","0","0"};//数据相应的字符串型
//记录运算符 mark指示当前是那个操作符1-mark1,2-mark2. mark[1],[2]表示 0无 1加 2减 3乘 4除
int mark=1,marks[]={0,0,0,0,0};
int state=1;//记录状态 说明现在输入的是第几个数
int start=0;//记录状态 0说明第一次输入,数字替换以前内容,1说明在尾部添加数字
int deng=0;//记录是否进行过'='运算 0没有 1有
int k1=0,k2=0;//记录括号状态
double Mdate=0;//M储存器内数值
int radio=1;//1记录单选钮选中“角度”,2-弧度
Window(String s,int style)//style表征窗体类型 1代表标准型 2代表科学型
{
//**************--------窗体设置---------***************
super(s);
if(style==1)
setBounds(100,100,380,270);
else
setBounds(100,100,550,270);
setVisible(true);
setResizable(false);
//**************-------菜单条设置--------***************
menubar = new JMenuBar();
menu1 = new JMenu("编辑(E)");
menu1.setMnemonic(KeyEvent.VK_E);//设置快捷键Alt+E
item1 = new JMenuItem("复制",new ImageIcon("copy.jpg"));
item1.addActionListener(this);
item2 = new JMenuItem("粘贴",new ImageIcon("cv.jpg"));
item2.addActionListener(this);
item1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
menu2 = new JMenu("查看(V)");
menu2.setMnemonic(KeyEvent.VK_V);//设置快捷键Alt+V
item3 = new JMenuItem("标准型",new ImageIcon("a.jpg"));
item3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();//释放当前窗口
new Window("标准型计算器",1).setVisible(true);
}
});
item4 = new JMenuItem("科学型",new ImageIcon("b.jpg"));
item4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();//释放当前窗口
new Window("科学型计算器",2).setVisible(true);
}
});
menu3 = new JMenu("帮助(H)");
menu3.setMnemonic(KeyEvent.VK_H);//设置快捷键Alt+H
item5 = new JMenuItem("帮助",new ImageIcon("help.jpg"));
item5.addActionListener(this);
item6 = new JMenuItem("关于",new ImageIcon("about.jpg"));
item6.addActionListener(this);
menu1.add(item1);
menu1.addSeparator();
menu1.add(item2);
menu2.add(item3);
menu2.addSeparator();
menu2.add(item4);
menu3.add(item5);
menu3.addSeparator();
menu3.add(item6);
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
setJMenuBar(menubar);
//**************---------面板设置---------**************
basebox = Box.createVerticalBox();
FlowLayout flow = new FlowLayout();
flow.setAlignment(FlowLayout.RIGHT);
panel1 = new JPanel();
if (style==1)
t_show = new JTextField(32);//显示文本框
else
t_show = new JTextField(48);//显示文本框
t_show.setText("0");
t_show.setEditable(false);
t_show.setHorizontalAlignment(SwingConstants.RIGHT);//显示右对齐
t_show.setBackground(Color.white);
panel1.setLayout(flow);
panel1.add(t_show);
basebox.add(panel1);
panel2 = new JPanel();
panel2.setLayout(flow);
t_K = new JTextField(5);
t_K.setHorizontalAlignment(SwingConstants.CENTER);//显示右对齐
t_K.setText(" — ");
t_K.setEditable(false);
Null = new JLabel(" ");
t_M = new JTextField(5);
t_M.setHorizontalAlignment(SwingConstants.CENTER);//显示右对齐
t_M.setText(" — ");
t_M.setEditable(false);
b_Backspace = new JButton(" Backspace ");
b_CE = new JButton(" CE ");
b_C = new JButton(" C ");
panel22 = new JPanel();
panel22.setLayout(new GridLayout(1,style,2,1));
if(style==2)
{
group = new ButtonGroup();
j = new JRadioButton("角度",true);
j.addItemListener(this);j.addKeyListener(this);
h = new JRadioButton("弧度",false);
h.addItemListener(this);h.addKeyListener(this);
group.add(j);
group.add(h);
panel22.add(t_K);
}
panel22.add(t_M);
if(style==2)
{
panel2.add(j);
panel2.add(h);
}
panel2.add(panel22);
panel2.add(Null);
panel2.add(b_Backspace);
panel2.add(b_CE);
panel2.add(b_C);
basebox.add(panel2);
panel = new JPanel();
panel3 = new JPanel();
panel3.setLayout(new GridLayout(4,6,3,2));
//声明添加所需按钮
b_MC = new JButton("MC");
b_MR = new JButton("MR");
b_MS = new JButton("MS");
b_Madd = new JButton("M+");
b_0 = new JButton("0");
b_1 = new JButton("1");
b_2 = new JButton("2");
b_3 = new JButton("3");
b_4 = new JButton("4");
b_5 = new JButton("5");
b_6 = new JButton("6");
b_7 = new JButton("7");
b_8 = new JButton("8");
b_9 = new JButton("9");
b_add = new JButton("+");
b_sub = new JButton("-");
b_mul = new JButton("×");
b_div = new JButton("÷");
b_deng = new JButton("=");
b_dian = new JButton(".");
b_sign = new JButton("+/-");
b_100 = new JButton("%");
b_dao = new JButton("1/x");
b_sqrt = new JButton("sqrt");
panel3.add(b_MC); panel3.add(b_7); panel3.add(b_8); panel3.add(b_9); panel3.add(b_div); panel3.add(b_sqrt);
panel3.add(b_MR); panel3.add(b_4); panel3.add(b_5); panel3.add(b_6); panel3.add(b_mul);panel3.add(b_100);
panel3.add(b_MS); panel3.add(b_1); panel3.add(b_2); panel3.add(b_3); panel3.add(b_sub); panel3.add(b_dao);
panel3.add(b_Madd);panel3.add(b_0); panel3.add(b_sign);panel3.add(b_dian);panel3.add(b_add); panel3.add(b_deng);
panel4 = new JPanel();
panel4.setLayout(new GridLayout(4,3,3,2));
b_xy = new JButton("x^y");
b_ln = new JButton("ln");
b_log = new JButton("log");
b_pi = new JButton("π");
b_x2 = new JButton("x^2");
b_x3 = new JButton("x^3");
b_k1 = new JButton("(");
b_k2 = new JButton(")");
b_sin = new JButton("sin");
b_cos = new JButton("cos");
b_tan = new JButton("tan");
b_n = new JButton("n!");
panel4.add(b_pi); panel4.add(b_k1); panel4.add(b_k2);
panel4.add(b_tan); panel4.add(b_xy); panel4.add(b_ln);
panel4.add(b_cos); panel4.add(b_x3); panel4.add(b_log);
panel4.add(b_sin); panel4.add(b_x2); panel4.add(b_n);
panel.setLayout(flow);
if (style==2)
{
panel.add(panel4);
}
panel.add(panel3);
basebox.add(panel);
//添加键盘事件
addKeyListener(this);
//给按钮添加监听器,监听事件
b_Backspace.addActionListener(this);b_Backspace.addKeyListener(this);
b_CE.addActionListener(this);b_CE.addKeyListener(this);
b_C.addActionListener(this);b_C.addKeyListener(this);
b_MC.addActionListener(this);b_MC.addKeyListener(this);
b_MR.addActionListener(this);b_MR.addKeyListener(this);
b_MS.addActionListener(this);b_MS.addKeyListener(this);
b_Madd.addActionListener(this);b_Madd.addKeyListener(this);
b_0.addActionListener(this);b_0.addKeyListener(this);
b_1.addActionListener(this);b_1.addKeyListener(this);
b_2.addActionListener(this);b_2.addKeyListener(this);
b_3.addActionListener(this);b_3.addKeyListener(this);
b_4.addActionListener(this);b_4.addKeyListener(this);
b_5.addActionListener(this);b_5.addKeyListener(this);
b_6.addActionListener(this);b_6.addKeyListener(this);
b_7.addActionListener(this);b_7.addKeyListener(this);
b_8.addActionListener(this);b_8.addKeyListener(this);
b_9.addActionListener(this);b_9.addKeyListener(this);
b_add.addActionListener(this);b_add.addKeyListener(this);
b_sub.addActionListener(this);b_sub.addKeyListener(this);
b_mul.addActionListener(this);b_mul.addKeyListener(this);
b_div.addActionListener(this);b_div.addKeyListener(this);
b_dian.addActionListener(this);b_dian.addKeyListener(this);
b_sign.addActionListener(this);b_sign.addKeyListener(this);
b_sqrt.addActionListener(this);b_sqrt.addKeyListener(this);
b_100.addActionListener(this);b_100.addKeyListener(this);
b_deng.addActionListener(this);b_deng.addKeyListener(this);
b_dao.addActionListener(this);b_dao.addKeyListener(this);
b_pi.addActionListener(this);b_pi.addKeyListener(this);
b_k1.addActionListener(this);b_k1.addKeyListener(this);
b_k2.addActionListener(this);b_k2.addKeyListener(this);
b_xy.addActionListener(this);b_xy.addKeyListener(this);
b_x2.addActionListener(this);b_x2.addKeyListener(this);
b_x3.addActionListener(this);b_x3.addKeyListener(this);
b_sin.addActionListener(this);b_sin.addKeyListener(this);
b_cos.addActionListener(this);b_cos.addKeyListener(this);
b_tan.addActionListener(this);b_tan.addKeyListener(this);
b_n.addActionListener(this);b_n.addKeyListener(this);
b_ln.addActionListener(this);b_ln.addKeyListener(this);
b_log.addActionListener(this);b_log.addKeyListener(this);
//t_M.addKeyListener(this);
//**************------底层添加布局-------***************
Container con = getContentPane();
con.setLayout(new FlowLayout());
con.add(basebox);
validate();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
//*************----------相关方法-----------***************
void input(String s)//输入数字的函数
{
if (start==0)
{
t[state]=s;
start=1;
}
else
{
t[state]=t_show.getText()+s;
}
d[state]=Double.parseDouble(t[state]);
t_show.setText(t[state]);
}
void clear()//清楚当前状态
{
t[state]="0"; d[state]=0; start=0;
}
String n(String s)//计算阶乘
{
BigInteger ss=new BigInteger(s);
BigInteger result=new BigInteger("1"),r=new BigInteger("1"),re=new BigInteger("1");
while(re.compareTo(ss)<0)
{
re=re.add(r);
result=result.multiply(re);
}
return result.toString();
}
double op(double x)//三角函数结果处理
{
int z=(int)(x*1000000);
if(z%10>=5)
z=z+10-z%10;
return (double)z/1000000;
}
void done()//进行运算的函数
{
deng=1;
switch(marks[mark])
{
case 1:
d[2*mark-1]=d[2*mark-1]+d[2*mark];
t[2*mark-1]=String.valueOf(d[2*mark-1]);
t_show.setText(t[2*mark-1]);
break;
case 2:
d[2*mark-1]=d[2*mark-1]-d[2*mark];
t[2*mark-1]=String.valueOf(d[2*mark-1]);
t_show.setText(t[2*mark-1]);
break;
case 3:
d[2*mark-1]=d[2*mark-1]*d[2*mark];
t[2*mark-1]=String.valueOf(d[2*mark-1]);
t_show.setText(t[2*mark-1]);
break;
case 4:
if(d[2*mark]==0)
{
t_show.setText("除数不能为0");
start=0;
break;
}
d[2*mark-1]=d[2*mark-1]/d[2*mark];
t[2*mark-1]=String.valueOf(d[2*mark-1]);
t_show.setText(t[2*mark-1]);
break;
case 5:
d[state]=Math.pow(d[state-1],d[state]);
t[state]=String.valueOf(d[state]);
t_show.setText(t[state]);
default:
break;
}
}
//*************----------相关事件-----------***************
public void actionPerformed(ActionEvent e)
{
//菜单条内的按钮事件#######################################
if(e.getSource() == item1)//复制
{
t_show.setEditable(true);
t_show.selectAll();
t_show.copy();
t_show.setEditable(false);
}
else if(e.getSource() == item2)//粘贴
{
t_show.setEditable(true);
t_show.selectAll();
t_show.paste();
validate();
t_show.setEditable(false);
}
else if(e.getSource() == item5)//帮助
{
String s = "标准型:\r\nBackspace — 逐个删除\r\nsqrt — 开平方\r\nC — 全部清除\r\nCE — 一次运算完成后,单击“CE”按钮即可清除当前的运算结果,再次输入时可开始新的运算\r\nMC — 是清除储存数据\r\nMR — 是读取储存的数据\r\nMS — 将所显示的数存入存储器中,存储器中原有的数据被冲走,“—”也会变为“M”\r\nM+ — 是计算结果并加上已经储存的数\r\n1/x — 求倒数\r\n+/- — 改变当前数的符号\r\n% — 计算a*(b%),如输入a-b%=a-a*(b%);例:50+25%它会先计算出50*(25%)=12.5,然后按等号后,显示62.5(即50+12.5)\r\n科学型:\r\nsin — 计算三角函数sin值(默认角度制)\r\ncos — 计算三角函数cos值(默认角度制)\r\ntan — 计算三角函数tan值(默认角度制)\r\nn! — 计算n的阶乘(只限于100以内的数)\r\nlog — 计算以10为底的对数\r\nln — 计算自然对数\r\nx^y — 计算x的y次方\r\n 计算器的运算结果可以导入到别的应用程序中,用户可以选择“编辑”—“复制”把运算结果粘贴到别处,也可以从别的地方复制好运算算式后,选择“编辑”—“粘贴”到计算器中进行运算。";
Dialog d = new Dialog(this,"帮助主题",s,550,520);
}
else if(e.getSource() == item6)//关于
{
String s = "版权所有 (c) 2007\r\n制作者:张雪松 班级:计应0604 学号:061300414";
Dialog d = new Dialog(this,"关于软件",s,360,100);
}
//操作指令事件##############################################
else if(e.getSource() == b_Backspace)
{
if (t_show.getText().length() <= 1)
{
t[state] = "0";
start = 0;//说明重新输入,清空以前数据
}
else
{
t[state] = t_show.getText().substring(0, t_show.getText().length()-1);
}
d[state] = Double.parseDouble(t[state]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -