Java计算器源码.docx
《Java计算器源码.docx》由会员分享,可在线阅读,更多相关《Java计算器源码.docx(32页珍藏版)》请在冰豆网上搜索。
Java计算器源码
计算器
本计算器有显示过程和不显示过程两种功能,其中不显示过程为普通计算器,类似于windows自带的计算器;显示过程的,可以显示预算过程,其中包含所需应用的部分函数,以及格式化功能(最左上角,第一个键格式化,然后输入需要格式化的数位,然后点第二个数,显示格式化结果),当一次运算结束后,会在右边自动显示运算过程,并且运算过程处有保存,复制粘贴清除功能。
代码如下:
主类:
importZF.*;
publicclassJiSuanQi{
publicstaticvoidmain(String[]args){
Calculatorc=newCalculator("计算器");
}
}
包ZF中的类:
Calculator类
packageZF;
/**
*计算器布局界面
*/
importjava.io.*;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassCalculatorextendsJFrameimplementsActionListener{
staticintxg=1;//用于判断是否显示过程,初始状态为显示
JSplitPanejsp1,jsp2,jsp3;
staticJTextFieldjtf;//文本框
staticJTextAreajta;//保存等的历史文本区
publicstaticStringzc;//用来暂时存储数字,实现第一个菜单选项
JScrollPaneJS;//专门用于给文本区提供滚动条
publicstaticFileDialogload,save;//声明引入对话框
BufferedReaderin;//
FileReaderreader;//
JP1jp1;
JP2jp2;
JP3jp3;
JP4jp4;
JP5jp5;
//菜单条
JMenuBarmb;
JMenum0,m1,m2;
JMenuItemm01,m02,m03,m04,m11,m12,m21,m22;
publicCalculator(Strings){
super(s);
Containercon=getContentPane();
//桌面
jp1=newJP1();
jp2=newJP2();
jp3=newJP3();
jp4=newJP4();
jp5=newJP5();
jta=newJTextArea();
jta.setEditable(false);
JS=newJScrollPane(jta);
jsp1=newJSplitPane(JSplitPane.VERTICAL_SPLIT,false,jp1,jp2);
jsp2=newJSplitPane(JSplitPane.VERTICAL_SPLIT,false,jp3,JS);
jsp3=newJSplitPane(JSplitPane.VERTICAL_SPLIT,false,jp4,jp5);
jtf=newJTextField();
jtf.setText(String.valueOf(0));
jtf.setEditable(false);
jtf.setBackground(Color.white);
load=newFileDialog(this,"读取历史运算过程",FileDialog.LOAD);
load.setVisible(false);
load.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
load.setVisible(false);
}
});
save=newFileDialog(this,"保存历史运算过程",FileDialog.SAVE);
save.setVisible(false);
save.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
save.setVisible(false);
}
});
//菜单条
mb=newJMenuBar();
m0=newJMenu("编辑");
m1=newJMenu("查看");
m2=newJMenu("帮助");
m01=newJMenuItem("复制");
m02=newJMenuItem("粘贴");
m03=newJMenuItem("读取");
m04=newJMenuItem("关闭");
m01.addActionListener(this);
m02.addActionListener(this);
m03.addActionListener(this);
m04.addActionListener(this);
m11=newJMenuItem("不显过程");
m12=newJMenuItem("显示过程");
m11.addActionListener(this);
m12.addActionListener(this);
m21=newJMenuItem("帮助主题");
m22=newJMenuItem("关于计算器");
m21.addActionListener(this);
m22.addActionListener(this);
m0.add(m01);
m0.add(m02);
m0.add(m03);
m0.add(m04);
m1.add(m11);
m1.add(m12);
m2.add(m21);
m2.addSeparator();
m2.add(m22);
mb.add(m0);
mb.add(m1);
mb.add(m2);
setJMenuBar(mb);
con.add(jtf,BorderLayout.NORTH);
con.add(jsp1,BorderLayout.CENTER);
con.add(jsp2,BorderLayout.EAST);
con.add(jsp3,BorderLayout.WEST);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100,100,800,260);
setResizable(false);
setVisible(true);
validate();
}
publicvoidactionPerformed(ActionEvente){
if(!
jtf.getText().equals("error")){
if(e.getSource()==m01){
zc=jtf.getText();
}elseif(e.getSource()==m02){
if(zc!
=null){
if(xg==1){
if(jtf.getText().equals("0"))
jtf.setText(zc);
else
jtf.setText(jtf.getText()+zc);
}else
jtf.setText(zc);
}
}
}
if(e.getSource()==m03){//读取文件
Calculator.load.setVisible(true);
Calculator.jta.setText(null);
Strings;
if(Calculator.load.getFile()!
=null)
{
try{
Filefile=newFile(Calculator.load.getDirectory(),Calculator.load.getFile());
reader=newFileReader(file);
in=newBufferedReader(reader);
while((s=in.readLine())!
=null)
{Calculator.jta.append(s+'\n');}
in.close();
reader.close();
}catch(IOExceptione2){Calculator.jta.append("读取错误");}
}
}elseif(e.getSource()==m04){
System.exit(0);
}elseif(e.getSource()==m11){
//换窗体大小,同时换规则
setSize(320,260);
remove(jsp2);
remove(jsp3);
JP2.sf=0;
jtf.setText(String.valueOf(0));
xg=0;
//改变菜单选项的可选性
m03.setEnabled(false);
m04.setEnabled(false);
//换对齐方式
JP2.sf=0;
jtf.setEditable(false);
jtf.setBackground(Color.white);
jtf.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
validate();
}elseif(e.getSource()==m12){
setSize(800,260);
add(jsp2,BorderLayout.EAST);
add(jsp3,BorderLayout.WEST);
JP2.sf=0;
jtf.setText(String.valueOf(0));
xg=1;
m03.setEnabled(true);
m04.setEnabled(true);
JP2.eg=0;
jtf.setEditable(false);
jtf.setBackground(Color.white);
jtf.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
validate();
}elseif(e.getSource()==m21){
JOptionPane.showMessageDialog(this,
"本计算器以模仿Windows系统自带计算器为主,详情请参照系统计算器“帮助主题”。
","帮助主题",
JOptionPane.INFORMATION_MESSAGE);
}elseif(e.getSource()==m22){
newJA("关于计算器");
}
}
}
JA类
packageZF;
importjava.awt.*;
importjavax.swing.*;
publicclassJAextendsJFrame{
JLabel[]jl=newJLabel[6];
JTextField[]jtf1=newJTextField[6];
JTextField[]jtf2=newJTextField[6];
publicJA(Strings){
super(s);
setLayout(newGridLayout(6,3));
jl[0]=newJLabel("制作组:
");
jl[1]=newJLabel("组成员:
");
for(inti=2;i<6;i++){
jl[i]=newJLabel();
}
jtf1[0]=newJTextField("小叮当");
jtf1[1]=newJTextField("曹剑");
jtf1[2]=newJTextField("李剑");
jtf1[3]=newJTextField("王斌");
jtf1[4]=newJTextField("翟鹏翔");
jtf1[5]=newJTextField("奥然");
jtf2[0]=newJTextField("第一组");
jtf2[1]=newJTextField("项目经理");
for(inti=2;i<6;i++){
jtf2[i]=newJTextField("程序员");
}
for(inti=0;i<6;i++){
jtf1[i].setEditable(false);
jtf2[i].setEditable(false);
}
for(inti=0;i<6;i++){
add(jl[i]);
add(jtf1[i]);
add(jtf2[i]);
}
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100,100,250,250);
setVisible(true);
validate();
}
}
JP1类
packageZF;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassJP1extendsJPanelimplementsActionListener{
JButtonb1,b2,b3;
publicJP1(){
setLayout(newGridLayout(1,3,5,5));
b1=newJButton("Backspace");
b2=newJButton("CE");
b3=newJButton("C");
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
add(b1);
add(b2);
add(b3);
}
publicvoidactionPerformed(ActionEvente){
Strings=Calculator.jtf.getText();
if(!
Calculator.jtf.getText().equals("error")){
if(e.getSource()==b1){
if(s.length()!
=1)
Calculator.jtf.setText(s.substring(0,s.length()-1));
else
Calculator.jtf.setText(String.valueOf(0));
}elseif(e.getSource()==b2){
Calculator.jtf.setText(String.valueOf(0));
if(Calculator.xg==1)
JP2.eg=0;
}
}
if(e.getSource()==b3){
Calculator.jtf.setText(String.valueOf(0));
if(Calculator.xg==0)
JP2.sf=0;
else
JP2.eg=0;
}
}
}
JP2类
packageZF;
/**
*计算器核心部分,基本算法按钮
*/
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassJP2extendsJPanelimplementsActionListener{
JButtonb[]=newJButton[24];
staticinteg,sf,gs;//eg判断是否摁过按钮,sf判断算法,gs用于用于存放给格式化的位数
staticdoublesfg;//sfg用于存放各种算法的结果
floatzsg;//zsg用于存放最终算术结果
staticStringzgc,sgc,fh;/*
*zgc用于存放zsg所转换而成的字符串,sgc用于存放sfg所转化而成的字符串,
*fh用于存放显示的符号
*/
publicJP2(){
setLayout(newGridLayout(4,5,5,5));
for(inti=0;i<10;i++){
b[i]=newJButton(""+i);
}
b[10]=newJButton("+/-");
b[11]=newJButton(".");
b[12]=newJButton("+");
b[13]=newJButton("-");
b[14]=newJButton("×");
b[15]=newJButton("÷");
b[16]=newJButton("=");
b[17]=newJButton("sqrt");
b[18]=newJButton("%");
b[19]=newJButton("1/x");
for(inti=0;i<20;i++){
b[i].addActionListener(this);
}
add(b[7]);
add(b[8]);
add(b[9]);
add(b[15]);
add(b[17]);
add(b[4]);
add(b[5]);
add(b[6]);
add(b[14]);
add(b[18]);
add(b[1]);
add(b[2]);
add(b[3]);
add(b[13]);
add(b[19]);
add(b[0]);
add(b[10]);
add(b[11]);
add(b[12]);
add(b[16]);
}
publicstaticvoidNumberFa(inti){//数字法则
if(Calculator.xg==0){//如果不显示过程
doublezhs=Double.parseDouble(Calculator.jtf.getText());//zhs用于存放暂时获取的数字,以下同理
if(eg==0){//判断是否按过加法法则等按钮,如果没按过,将再次按得数字与原数字组成一个新的字符串
if(zhs!
=0||zhs==0
&&Calculator.jtf.getText().indexOf(".")!
=-1){//判断是原来的数字是否为零,为零或者不为零但有小数点
Calculator.jtf.setText(Calculator.jtf.getText()
+String.valueOf(i));
}else
//因为0不能做第一个数字(小数点除外),所以如果数字为零,则直接设置为按得数字
Calculator.jtf.setText(String.valueOf(i));
}else{//如果按过法则按钮,则直接设置文本框
Calculator.jtf.setText(String.valueOf(i));
eg=0;
}
}else{
if(eg==0||Calculator.jtf.getText().equals("0"))
Calculator.jtf.setText(String.valueOf(i));
else
Calculator.jtf.setText(Calculator.jtf.getText()
+String.valueOf(i));
eg=1;
}
}
publicstaticvoidSuanFa(){//算法法则
if(Calculator.xg==0){//如果不显示过程
doublezhs=Double.parseDouble(Calculator.jtf.getText());
Strings="零";//判断除数是否为0
switch(sf){
case0:
//表示没有按加减乘除等
sfg=zhs;
break;
case1:
sfg=sfg+zhs;
break;
case2:
sfg=sfg-zhs;
break;
case3:
sfg=sfg*zhs;
break;
case4:
if(zhs!
=0)
sfg=sfg/zh