java计算器实验报告.docx
《java计算器实验报告.docx》由会员分享,可在线阅读,更多相关《java计算器实验报告.docx(45页珍藏版)》请在冰豆网上搜索。
java计算器实验报告
Java计算器实验报告
计算机032
胡勇健
03095218
2005年5月5日
1.设计名称与要求
2.各模块功能的介绍和实现
3.系统的特色和不足
4.参考书
一.实验名称及其要求:
A)名称:
java计算器的设计
B)要求:
1.实验目的:
图形界面设计。
熟悉java.awt包中的组件,掌握图形界面设计方法,理解委托事件处理模型。
2.题意:
请设计并实现Windows系统中“计算器”的窗口及功能。
3.实验要求:
(1)设计图形界面添加菜单:
窗口上添加各种组件及菜单,并处理组件及菜单的事件监听程序。
(2)运算:
实现多种运算,保证运算正确性。
二.各模块功能的介绍和实现:
A)GUI图形界面的组件:
a)所用到的Java类库包:
java.awt.*;基本的图形界面组件来源于awt包。
java.awt.event.*;事件的属性处理来源于awt.event包。
javax.swing.*;swing组件增加了awt包中所不具备的各种优越功能。
java.awt.datatransfer.*;用于计算器与外部的程序进行复制粘贴。
b)所用的各部分图形组件的定义:
FramemainFrame;//主框架
JTextFieldanswerText;//显示计算结果
JTextFieldmemoryState;//显示计算器内存的使用情况
MenuBarmenuGroup;//菜单栏
MenueditMenu,viewMenu,helpMenu;//编辑,查看,帮助菜单
MenuItemcopyItem,pasteItem;//复制,粘贴
MenuItemstandardModel;//标准型
CheckboxMenuItemnumGroup;//数字分组
MenuItemaboutCal;//关于计算器
ButtonbuttonBackSpace,buttonCE,buttonC;//退格,清除,清空按钮
ButtonbuttonMC,buttonMR,buttonMS,buttonMADD;//内存操作按钮
ButtonbuttonNum[];//数字按钮
ButtonbuttonAdd,buttonSub,buttonMul,buttonDiv;//+,-,*,/
ButtonbuttonDot,buttonSign,buttonEqual;//.+/-=
ButtonbuttonSqrt,buttonMod,buttonReciprocal;//sqrt%1/x
c)组件的初始化以及对界面的排版
对主框架的初始化操作
voidinitMainFrame()函数是对主框架进行初始化,设置其框架大小270*250,
初始位置270*250,背景颜色Color.lightGray,是否显示true,能否改变窗口大小false,以及增加了addWindowListener委托事件,当关闭窗口时调用System.exit(0)系统指令,结束程序。
voidinitMainFrame()
{
mainFrame=newFrame("计算器");
mainFrame.setSize(270,250);
mainFrame.setLocation(200,140);
mainFrame.setBackground(Color.lightGray);
mainFrame.setResizable(false);
mainFrame.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
对文本框的初始化操作
initTextField()是对文本textBufferanswerTextmemoryState的初始化,
textBuffer是用于对文本的缓冲处理,StringBuffer类优于String类是因为StringBuffer是对字符串直接操作,从而节省了内存。
由于在这个计算器程序中,对字符串的操作量很大,因此,StringBuffer在这方面体现出了其本身的优势。
answerText和memoryState用swing的组件JTextField是因为JTextField显示文本框时可以在文本框的右边显示,符合Windows自带计算器的特点。
answerText和memoryState的背景色为白色,都不能进行编辑。
answerText为右对齐,大小为23个字符,而memoryState为2个字符。
voidinitTextField()
textBuffer=newStringBuffer("");
answerText=newJTextField(textBuffer.toString(),23);
answerText.setHorizontalAlignment(JTextField.RIGHT);
answerText.setEditable(false);
answerText.setBackground(Color.white);
memoryState=newJTextField
(2);
memoryState.setEditable(false);
memoryState.setBackground(Color.white);
对各按钮的初始化操作
initButtons()函数是对各按钮进行初始化,为每一个按钮增加其标签并增加了addActionListener(this)功能,用于给各按钮增加属性,具体的功能代码,请见actionPerformed(ActionEvente);其中,数字按钮、四则运算按钮、小数点按钮都增加了键盘输入功能addKeyListener其参数为匿名类KeyListener的适配器newKeyAdapter(),当在键盘上按下相应的键时,为其增加相应的属性功能。
voidinitButtons()
buttonBackSpace=newButton("BackSpace");
buttonBackSpace.addActionListener(this);
buttonCE=newButton("CE");
buttonCE.addActionListener(this);
buttonC=newButton("C");
buttonC.addActionListener(this);
buttonMC=newButton("MC");
buttonMC.addActionListener(this);
buttonMR=newButton("MR");
buttonMR.addActionListener(this);
buttonMS=newButton("MS");
buttonMS.addActionListener(this);
buttonMADD=newButton("M+");
buttonMADD.addActionListener(this);
buttonNum=newButton[10];
for(inti=0;i{buttonNum[i]=newButton(Integer.toString(i));buttonNum[i].addActionListener(this);buttonNum[i].addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(Character.isDigit(e.getKeyChar())){textBuffer.append(e.getKeyChar());answerText.setText(textBuffer.toString());AddNum();}}});}buttonAdd=newButton("+");buttonAdd.addActionListener(this);buttonAdd.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='+')AddFunction(1);}});buttonSub=newButton("-");buttonSub.addActionListener(this);buttonSub.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='-')AddFunction(2);}});buttonMul=newButton("*");buttonMul.addActionListener(this);buttonMul.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='*')AddFunction(3);}});buttonDiv=newButton("/");buttonDiv.addActionListener(this);buttonDiv.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='/')AddFunction(4);}});buttonDot=newButton(".");buttonDot.addActionListener(this);buttonDot.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='.'){textBuffer.append(e.getKeyChar());answerText.setText(textBuffer.toString());AddNum();}}});buttonSign=newButton("+/-");buttonSign.addActionListener(this);buttonEqual=newButton("=");buttonEqual.addActionListener(this);buttonEqual.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyChar()=='=')OnGo();}});buttonSqrt=newButton("sqrt");buttonSqrt.addActionListener(this);buttonMod=newButton("%");buttonMod.addActionListener(this);buttonReciprocal=newButton("1/x");buttonReciprocal.addActionListener(this);} 对菜单的初始化操作initMenu()函数是对各菜单的初始化,先为其生成实例对象,再添加到MenuBar的实例对象menuGroup中,MenuItem各项添加到相应的Menu中。voidinitMenu(){/**先为各个菜单项生成实例对象,并为其设置相应的标签。MenuItem各项*还要设置addActionListener(this)增加委托事件任务。*/menuGroup=newMenuBar();editMenu=newMenu("编辑(E)");viewMenu=newMenu("查看(V)");helpMenu=newMenu("帮助(H)");copyItem=newMenuItem("复制(C)Ctrl+C",newMenuShortcut(KeyEvent.VK_C));copyItem.addActionListener(this);pasteItem=newMenuItem("粘贴(P)Ctrl+V",newMenuShortcut(KeyEvent.VK_V));pasteItem.addActionListener(this);standardModel=newMenuItem("●标准型(T)");standardModel.addActionListener(this);numGroup=newCheckboxMenuItem("数字分组(I)",false);numGroup.addItemListener(this);aboutCal=newMenuItem("关于计算器(A)");aboutCal.addActionListener(this);/*再把各个菜单相继加入到MenuBar中*/menuGroup.add(editMenu);menuGroup.add(viewMenu);menuGroup.add(helpMenu);editMenu.add(copyItem);editMenu.add(pasteItem);viewMenu.add(standardModel);viewMenu.add(numGroup);helpMenu.add(aboutCal);} 对总框架的总体布局OverallArrangement()是根据mainFrame的框架大小,把文本框answerText,内存使用的情况文本框memoryState,内存操作键MRMSM+MC,退格键BackSpace清除键CE,清空键C,以及主键盘区的各键按照一定的比例位置加入到mainFrame中.voidOverallArrangement(){PaneltextPanel=newPanel();//文本框的容器PanelupperPanel=newPanel();//计算器上部分的容器PanelcenterPanel=newPanel();//计算器中部的容器PanelmainPanel=newPanel();//主键盘区的容器PanelleftPanel=newPanel();//内存区的容器PanelrightPanel=newPanel();//数字及相应的操作键盘区mainFrame.setMenuBar(menuGroup);//为主框架设置菜单栏mainFrame.add(upperPanel,BorderLayout.NORTH);//把上容器放在主框架的北面mainFrame.add(centerPanel);//把中容器放在主框架的中部mainFrame.add(mainPanel,BorderLayout.SOUTH);//把主容器放在主框架的南面/*设置主框架的上半部分*/textPanel.add(answerText);//把文本框添加到文本容器中upperPanel.add(textPanel);//把文本容器放入上容器中/*设置主框架的中部*///采用流式布局,各组件相互间隔10个像素centerPanel.setLayout(newFlowLayout(FlowLayout.CENTER,10,10));centerPanel.add(memoryState);//把内存记忆框放在中容器中centerPanel.add(buttonBackSpace);//把退格键放在中容器中centerPanel.add(buttonCE);//把清除键放在中容器中centerPanel.add(buttonC);//把清空键放在中容器中/*设置主框架的下半部分*/leftPanel.setLayout(newGridLayout(4,1,0,2));//左下角的容器采用4*1的网式布局leftPanel.add(buttonMC);//添加MCleftPanel.add(buttonMR);//添加MRleftPanel.add(buttonMS);//添加MSleftPanel.add(buttonMADD);//添加M+mainPanel.add(leftPanel,BorderLayout.WEST);//把此容器放在主容器的西面 /*设置主键盘区*/rightPanel.setLayout(newGridLayout(4,5,3,3));//采用4*5的网式布局,相互间隔3各像素/*添加各键*/rightPanel.add(buttonNum[7]);rightPanel.add(buttonNum[8]);rightPanel.add(buttonNum[9]);rightPanel.add(buttonDiv);rightPanel.add(buttonSqrt);rightPanel.add(buttonNum[4]);rightPanel.add(buttonNum[5]);rightPanel.add(buttonNum[6]);rightPanel.add(buttonMul);rightPanel.add(buttonMod);rightPanel.add(buttonNum[1]);rightPanel.add(buttonNum[2]);rightPanel.add(buttonNum[3]);rightPanel.add(buttonSub);rightPanel.add(buttonReciprocal);rightPanel.add(buttonNum[0]);rightPanel.add(buttonSign);rightPanel.add(buttonDot);rightPanel.add(buttonAdd);rightPanel.add(buttonEqual);mainPanel.add(rightPanel,BorderLayout.CENTER);}计算器构造函数是对各布局函数的调用SimpleCalculator(){initMainFrame();initTextField();initButtons();initMenu();OverallArrangement();reSet();mainFrame.setVisible(true);} B)计算运算部分程序的执行过程:a)运算部分变量的定义stringBuffertextBuffer;//记录数值的字符串intnumDot;//小数点的个数intoperator;//操作符:1-加法2-减法3-乘法4-除法doublefirstValue,secondValue,result;//第一、二个数及结果booleanenterSecond;//是否已经输入了第二个数intforFirOrSec;//此时输入的是第一个还是第二个数booleanb_remFir,b_remSec,b_remFun;//指示是否此时还记的上次的数和运算符intremFun;//记住上次的运算符doubleremFir,remSec;//记住上次参加运算的第一二个数booleanisNumGroup=false;//记录是否为数字分组booleancanBeBack;//是否可以使用退格键doublememory;//用于内存操作时保存的数据 b)各功能函数简介reset函数reSet()是把各属性设置为原始值,当按下voidreSet(){answerText.setText("0.");textBuffer=newStringBuffer("");numDot=0;remFun=operator=0;firstValue=secondValue=result=0.0;enterSecond=false;forFirOrSec=1;b_remFir=b_remSec=b_remFun=false;remFir=remSec=0.0;canBeBack=true;}showScreen函数showScreen()是当按下了数字键后,在屏幕上显示。如果有数字分组项,则调用数字分
buttonNum[i]=newButton(Integer.toString(i));
buttonNum[i].addActionListener(this);
buttonNum[i].addKeyListener(newKeyAdapter(){
publicvoidkeyPressed(KeyEvente){
if(Character.isDigit(e.getKeyChar()))
textBuffer.append(e.getKeyChar());
answerText.setText(textBuffer.toString());
AddNum();
buttonAdd=newButton("+");
buttonAdd.addActionListener(this);
buttonAdd.addKeyListener(newKeyAdapter(){
if(e.getKeyChar()=='+')
AddFunction
(1);
buttonSub=newButton("-");
buttonSub.addActionListener(this);
buttonSub.addKeyListener(newKeyAdapter(){
if(e.getKeyChar()=='-')
buttonMul=newButton("*");
buttonMul.addActionListener(this);
buttonMul.addKeyListener(newKeyAdapter(){
if(e.getKeyChar()=='*')
AddFunction(3);
buttonDiv=newButton("/");
buttonDiv.addActionListener(this);
buttonDiv.addKeyListener(newKeyAdapter(){
if(e.getKeyChar()=='/')
AddFunction(4);
buttonDot=newButton(".");
buttonDot.addActionListener(this);
buttonDot.addKeyListener(newKeyAdapter(){
if(e.getKeyChar()=='.')
buttonSign=newButton("+/-");
buttonSign.addActionListener(this);
buttonEqual=newButton("=");
buttonEqual.addActionListener(this);
buttonEqual.addKeyListener(newKeyAdapter(){
if(e.getKeyChar()=='=')
OnGo();
buttonSqrt=newButton("sqrt");
buttonSqrt.addActionListener(this);
buttonMod=newButton("%");
buttonMod.addActionListener(this);
buttonReciprocal=newButton("1/x");
buttonReciprocal.addActionListener(this);
对菜单的初始化操作
initMenu()函数是对各菜单的初始化,先为其生成实例对象,再添加到MenuBar的实例对象menuGroup中,MenuItem各项添加到相应的Menu中。
voidinitMenu()
/*
*先为各个菜单项生成实例对象,并为其设置相应的标签。
MenuItem各项
*还要设置addActionListener(this)增加委托事件任务。
*/
menuGroup=newMenuBar();
editMenu=newMenu("编辑(E)");
viewMenu=newMenu("查看(V)");
helpMenu=newMenu("帮助(H)");
copyItem=newMenuItem("复制(C)Ctrl+C",newMenuShortcut(KeyEvent.VK_C));
copyItem.addActionListener(this);
pasteItem=newMenuItem("粘贴(P)Ctrl+V",newMenuShortcut(KeyEvent.VK_V));
pasteItem.addActionListener(this);
standardModel=newMenuItem("●标准型(T)");
standardModel.addActionListener(this);
numGroup=newCheckboxMenuItem("数字分组(I)",false);
numGroup.addItemListener(this);
aboutCal=newMenuItem("关于计算器(A)");
aboutCal.addActionListener(this);
/*再把各个菜单相继加入到MenuBar中*/
menuGroup.add(editMenu);
menuGroup.add(viewMenu);
menuGroup.add(helpMenu);
editMenu.add(copyItem);
editMenu.add(pasteItem);
viewMenu.add(standardModel);
viewMenu.add(numGroup);
helpMenu.add(aboutCal);
对总框架的总体布局
OverallArrangement()是根据mainFrame的框架大小,把文本框answerText,内存使用的情况文本框memoryState,内存操作键MRMSM+MC,退格键BackSpace清除键CE,清空键C,以及主键盘区的各键按照一定的比例位置加入到mainFrame中.
voidOverallArrangement()
PaneltextPanel=newPanel();//文本框的容器
PanelupperPanel=newPanel();//计算器上部分的容器
PanelcenterPanel=newPanel();//计算器中部的容器
PanelmainPanel=newPanel();//主键盘区的容器
PanelleftPanel=newPanel();//内存区的容器
PanelrightPanel=newPanel();//数字及相应的操作键盘区
mainFrame.setMenuBar(menuGroup);//为主框架设置菜单栏
mainFrame.add(upperPanel,BorderLayout.NORTH);//把上容器放在主框架的北面
mainFrame.add(centerPanel);//把中容器放在主框架的中部
mainFrame.add(mainPanel,BorderLayout.SOUTH);//把主容器放在主框架的南面
/*设置主框架的上半部分*/
textPanel.add(answerText);//把文本框添加到文本容器中
upperPanel.add(textPanel);//把文本容器放入上容器中
/*设置主框架的中部*/
//采用流式布局,各组件相互间隔10个像素
centerPanel.setLayout(newFlowLayout(FlowLayout.CENTER,10,10));
centerPanel.add(memoryState);//把内存记忆框放在中容器中
centerPanel.add(buttonBackSpace);//把退格键放在中容器中
centerPanel.add(buttonCE);//把清除键放在中容器中
centerPanel.add(buttonC);//把清空键放在中容器中
/*设置主框架的下半部分*/
leftPanel.setLayout(newGridLayout(4,1,0,2));//左下角的容器采用4*1的网式布局
leftPanel.add(buttonMC);//添加MC
leftPanel.add(buttonMR);//添加MR
leftPanel.add(buttonMS);//添加MS
leftPanel.add(buttonMADD);//添加M+
mainPanel.add(leftPanel,BorderLayout.WEST);//把此容器放在主容器的西面
/*设置主键盘区*/
rightPanel.setLayout(newGridLayout(4,5,3,3));//采用4*5的网式布局,相互间隔3各像素
/*添加各键*/
rightPanel.add(buttonNum[7]);
rightPanel.add(buttonNum[8]);
rightPanel.add(buttonNum[9]);
rightPanel.add(buttonDiv);
rightPanel.add(buttonSqrt);
rightPanel.add(buttonNum[4]);
rightPanel.add(buttonNum[5]);
rightPanel.add(buttonNum[6]);
rightPanel.add(buttonMul);
rightPanel.add(buttonMod);
rightPanel.add(buttonNum[1]);
rightPanel.add(buttonNum[2]);
rightPanel.add(buttonNum[3]);
rightPanel.add(buttonSub);
rightPanel.add(buttonReciprocal);
rightPanel.add(buttonNum[0]);
rightPanel.add(buttonSign);
rightPanel.add(buttonDot);
rightPanel.add(buttonAdd);
rightPanel.add(buttonEqual);
mainPanel.add(rightPanel,BorderLayout.CENTER);
计算器构造函数是对各布局函数的调用
SimpleCalculator()
initMainFrame();
initTextField();
initButtons();
initMenu();
OverallArrangement();
reSet();
mainFrame.setVisible(true);
B)计算运算部分程序的执行过程:
a)运算部分变量的定义
stringBuffertextBuffer;//记录数值的字符串
intnumDot;//小数点的个数
intoperator;//操作符:
1-加法2-减法3-乘法4-除法
doublefirstValue,secondValue,result;//第一、二个数及结果
booleanenterSecond;//是否已经输入了第二个数
intforFirOrSec;//此时输入的是第一个还是第二个数
booleanb_remFir,b_remSec,b_remFun;//指示是否此时还记的上次的数和运算符
intremFun;//记住上次的运算符
doubleremFir,remSec;//记住上次参加运算的第一二个数
booleanisNumGroup=false;//记录是否为数字分组
booleancanBeBack;//是否可以使用退格键
doublememory;//用于内存操作时保存的数据
b)各功能函数简介
reset函数
reSet()是把各属性设置为原始值,当按下
voidreSet()
answerText.setText("0.");
numDot=0;
remFun=operator=0;
firstValue=secondValue=result=0.0;
enterSecond=false;
forFirOrSec=1;
b_remFir=b_remSec=b_remFun=false;
remFir=remSec=0.0;
canBeBack=true;
showScreen函数
showScreen()是当按下了数字键后,在屏幕上显示。
如果有数字分组项,则调用数字分
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1