java式子计算器.docx
《java式子计算器.docx》由会员分享,可在线阅读,更多相关《java式子计算器.docx(24页珍藏版)》请在冰豆网上搜索。
java式子计算器
基本思想:
建立窗口时,我后面才想到把所有的组件先放到Container容器中。
我先把计算器分解成,菜单栏,输入区,按钮区,显示区分别用4个函数实现相应的操作,最后在计算器构造函数调用绑定到窗口。
我创建了计算符操作按钮、非计算操作按钮、菜单监听器,三个监听器来实现菜单和按钮监听。
对于各组件我采用GridBagLayout可变布局,再GridBagConstraints对布局组件布局设置。
JTextField输入区,JTextArea显示区全局定义为了方便按钮的输入和式子的输出。
创建一个按钮函数,有利于添加的按钮布局设置以及根据不同类型的按钮添加不同的监听器。
因为计算器有整数和小数计算的区别,我创建一个数值类根据不同的值,计算后返回不同的类型,在类内部实现数值的计算操作。
最后单独几个函数来实现式子计算。
该计算器中我还有光标设定,结果存储的实现等等。
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
publicclassCaculatorextendsJFrame{
privateGridBagLayoutlayout=newGridBagLayout();//可变布局
privateContainercontainer=newContainer();//容器,用于储存组件,最后一起添加到窗口
privateGridBagConstraintsconstraints=newGridBagConstraints();//布局设置
JTextAreatextArea=newJTextArea();//式子显示区
JTextFieldtextField=newJTextField();//输入区
intfpoint=0;//textField光标定位
intapoint=0;//textArea光标定位
intupoint=0;//memory使用向上的位置
Numerresult=newNumer();//结果暂存
NumerM;//结果存储器
Stringformula="";//式子
Stringcopty="";//复制的式子
Memorymemorys[]=newMemory[100];//存储历史最大记录
intnumber=0;//存储计数器
booleanupfirst=true;//判断是否首次使用向上
publicCaculator(){
super("计算器");
container.setLayout(layout);
addMenu();
addTextArea();
addTextField();
addButton();
add(container);
}
//添加菜单
privatevoidaddMenu(){
JMenumenus[]=newJMenu[3];//主菜单
menus[0]=newJMenu("查看(V)");
menus[0].setMnemonic('V');
menus[1]=newJMenu("编辑(E)");
menus[1].setMnemonic('E');
menus[2]=newJMenu("帮助(H)");
menus[2].setMnemonic('H');
JMenuItemlookItem[]=newJMenuItem[2];//子菜单
JMenuItemaditItem[]=newJMenuItem[3];
JMenuItemhelpItem[]=newJMenuItem[2];
lookItem[0]=newJMenuItem("普通型(O)");
lookItem[0].setMnemonic('O');//快捷键
lookItem[1]=newJMenuItem("标准型(T)");
lookItem[1].setMnemonic('T');
aditItem[0]=newJMenuItem("复制(C)Ctrl+C");
aditItem[0].setMnemonic(;
aditItem[1]=newJMenuItem("粘贴(P)Ctrl+V");
aditItem[1].setMnemonic(;
aditItem[2]=newJMenuItem("自由编辑(F)");
aditItem[2].setMnemonic('F');
helpItem[0]=newJMenuItem("关于主题(H)");
helpItem[0].setMnemonic('H');
helpItem[1]=newJMenuItem("关于计算器(A)");
MenuActionmenuaction=newMenuAction();
lookItem[0].addActionListener(menuaction);//菜单监听器
lookItem[1].addActionListener(menuaction);
aditItem[0].addActionListener(menuaction);
aditItem[1].addActionListener(menuaction);
aditItem[2].addActionListener(menuaction);
helpItem[0].addActionListener(menuaction);
helpItem[1].addActionListener(menuaction);
JMenuBarbar=newJMenuBar();//菜单容器吧
menus[0].add(lookItem[0]);menus[0].add(lookItem[1]);
menus[1].add(aditItem[0]);menus[1].add(aditItem[1]);
menus[1].add(aditItem[2]);
menus[2].add(helpItem[0]);menus[2].add(helpItem[1]);
setJMenuBar(bar);//把菜单绑到窗口上的方法
bar.add(menus[0]);
bar.add(menus[1]);
bar.add(menus[2]);
}
//添加显示区
privatevoidaddTextArea(){
constraints.gridx=0;//组件x位置
constraints.gridy=0;//组件y位置
constraints.gridheight=1;//组件高度
constraints.gridwidth=10;//组件宽度
constraints.fill=GridBagConstraints.BOTH;//组件随显示变化的选项
constraints.weightx=1;//水平扩展,即显示变化时,长度变化
constraints.weighty=1;//垂直扩展,即高度变化
textArea.setEditable(false);//不可编辑
JScrollPanespane=newJScrollPane(textArea);//滚动条添加
textArea.setFont(newFont("Serif",Font.PLAIN,18));//显示字体
layout.setConstraints(spane,constraints);//把布局设置应用到组件上
spane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//需要时才出现滚动条
container.add(spane);//把该组件添加到容器中
}
//添加输入区
privatevoidaddTextField(){
constraints.gridx=0;//组件x位置
constraints.gridy=1;//组件y位置
constraints.gridheight=1;//组件高度
constraints.gridwidth=5;//组件宽度
constraints.fill=GridBagConstraints.BOTH;
constraints.weightx=1;
constraints.weighty=1;
textField.setHorizontalAlignment(JTextField.RIGHT);//光标右边显示
textField.setEditable(false);//拒绝编辑
textField.setFont(newFont("Serif",Font.PLAIN,18));
//textField.setText("");
layout.setConstraints(textField,constraints);
container.add(textField);
}
//添加按钮
//添加按钮
privatevoidaddButton(){
InsertActioninsert=newInsertAction();
CommandActioncommand=newCommandAction();
addbutton("MC",0,2,1,1,command);addbutton("MR",1,2,1,1,command);
addbutton("MS",2,2,1,1,command);addbutton("M+",3,2,1,1,command);
addbutton("M-",4,2,1,1,command);addbutton("Delete",0,3,1,1,insert);
addbutton("CE",1,3,1,1,insert);addbutton("C",2,3,1,1,insert);
addbutton("±",3,3,1,1,insert);addbutton("√",4,3,1,1,command);
addbutton("7",0,4,1,1,insert);addbutton("8",1,4,1,1,insert);
addbutton("9",2,4,1,1,insert);addbutton("÷",3,4,1,1,command);
addbutton("%",4,4,1,1,command);addbutton("4",0,5,1,1,insert);
addbutton("5",1,5,1,1,insert);addbutton("6",2,5,1,1,insert);
addbutton("×",3,5,1,1,command);addbutton("1/x",4,5,1,1,command);
addbutton("1",0,6,1,1,insert);addbutton("2",1,6,1,1,insert);
addbutton("3",2,6,1,1,insert);addbutton("-",3,6,1,1,command);
addbutton("+",4,6,1,1,command);addbutton("0",0,7,1,1,insert);
addbutton(".",1,7,1,1,insert);addbutton("(",2,7,1,1,command);
addbutton(")",3,7,1,1,command);addbutton("=",4,7,2,1,command);
addbutton("←",0,8,1,1,command);addbutton("→",1,8,1,1,command);
addbutton("↑",2,8,1,1,command);addbutton("↓",3,8,1,1,command);
}
//单个按钮设置
privatevoidaddbutton(Stringlabel,intx,inty,intheight,intwidth,ActionListenerlistener){
JButtonbutton=newJButton(label);
constraints.gridx=x;
constraints.gridy=y;
constraints.gridheight=height;
constraints.gridwidth=width;
constraints.fill=GridBagConstraints.BOTH;
button.addActionListener(listener);
layout.setConstraints(button,constraints);
container.add(button);//container.
}
//设置数值按钮监听器
//非计算符监听器。
主要是只在TextField操作的按钮
privateclassInsertActionimplementsActionListener{
publicvoidactionPerformed(ActionEventevent){
Stringinput=event.getActionCommand();//获取输入的按钮
Stringoutput=textField.getText();//获取输入区内容
if(!
input.equals("↑")&&!
input.equals("↓")){upfirst=true;}//输入其他按钮时,去掉上下翻的功能
if(input.equals("Delete")){
if(fpoint>0){//输入区的删除
textField.setText(output.substring(0,fpoint-1)+
output.substring(fpoint,output.length()));
if(fpoint>0)fpoint--;}//光标位置减一
elseif(apoint>0){//显示区的删除
if(apoint==formula.length()){//尾部删除
formula=formula.substring(0,apoint-1);
textArea.setText(formula);}
else{formula=formula.substring(0,apoint-1)+
formula.substring(apoint,formula.length());
textArea.setText(formula.substring(0,apoint-1)+"┃"+
formula.substring(apoint-1,formula.length()));}//中间删除时需要恢复显示的光标
if(apoint>0)apoint--;}
return;}
if(input.equals(".")){
if(output.indexOf(".")==-1){//防止重复输入"."
if(apointinta=num_alenth(formula.substring(apoint));
intb=num_blenth(formula.substring(0,apoint));
if(b!
=0&&a!
=0){//确保在数值中添加"."
if(formula.substring(apoint-b,apoint).indexOf(".")==-1
&&formula.substring(apoint,apoint+a).indexOf(".")==-1){
//判断插入的地方,数值数否含有"."
formula=formula.substring(0,apoint)+input+
formula.substring(apoint,formula.length());
apoint++;
textArea.setText(formula.substring(0,apoint)+"┃"+
formula.substring(apoint,formula.length()));}}}
elseif(fpoint0){//在输入区中间插入
textField.setText(output.substring(0,fpoint)+input+
output.substring(fpoint,output.length()));
fpoint++;output=textField.getText();}
elseif(fpoint==output.length()){//输入区尾部插入
if(output.length()==0){textField.setText("0.");fpoint=2;}//空输入时加"."
else{textField.setText(output+".");fpoint++;}}}
return;}
//键入数字
if(!
input.equals("±")&&!
input.equals("CE")&&!
input.equals("C")){
//在式子上添加数字
if(apointformula=formula.substring(0,apoint)+input+
formula.substring(apoint,formula.length());
apoint++;
textArea.setText(formula.substring(0,apoint)+"┃"+
formula.substring(apoint,formula.length()));
return;}
//输入为0时被取代
if(output.equals("0")){
textField.setText(input);fpoint=input.length();return;}
//在中间插入数字
if(fpointif(input.equals("0")&&fpoint==0){return;}//在开头添加0时跳过
elsetextField.setText(output.substring(0,fpoint)+input+
output.substring(fpoint,output.length()));}
elseif(fpoint==output.length())textField.setText(output+input);//尾部添加
fpoint++;output=textField.getText();
return;}
//保证每次按其他键时消去光标
if(output.indexOf("┃")!
=-1){
intposition=output.indexOf("┃");
fpoint=position;
textField.setText(output.substring(0,position)+output.substring(position+1,output.length()));
output=textField.getText();
}
if(input.equals("±")){
if(output.equals("0"))textField.setText("-");//输入为0时被取代
elseif(output.startsWith("-")){//已经有"-"时去掉
textField.setText(output.substring
(1));}
elsetextField.setText("-"+output);
fpoint=textField.getText().length();}
//重新输入
elseif(input.equals("CE")){
textArea.setText(formula);apoint=formula.length();
textField.setText("");fpoint=0;}
//重新计算
elseif(input.equals("C")){
textField.setText("");fpoint=0;
formula="";apoint=0;print();}
fpoint=textField.getText().length();}}
//设置其他按钮监听器//其他监听器。
主要是在TextArea操作的按钮
privateclassCommandActionimplementsActionListener{
publicvoidactionPerformed(ActionEventevent){
Stringinput=event.getActionCommand();
Stringoutput=textField.getText();
Stringaput=textArea.getText();//获取显示区内容
if(!
input.equals("↑")&&!
input.equals("↓")){upfirst=true;}
if(output.indexOf("┃")!
=-1){
intposition=output.indexOf("┃");
fpoint=position;
textField.setText(output.substring(0,position)+output.substring(position+1,output.length()));
output=textField.getText();}
//输