Java实验报告图形化界面计算器.docx
- 文档编号:23849878
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:48
- 大小:184.74KB
Java实验报告图形化界面计算器.docx
《Java实验报告图形化界面计算器.docx》由会员分享,可在线阅读,更多相关《Java实验报告图形化界面计算器.docx(48页珍藏版)》请在冰豆网上搜索。
Java实验报告图形化界面计算器
封面/lzj,2015/11/29
Java实验报告
--图形化界面计算器
计算机22班
清哥荡漾
2120505047
一、实验要求
1.实现图形化界面计算器,完成基本功能
2.实现保存计算历史纪录到本地的功能
3.实现上传计算历史纪录到服务器的功能
二、实验流程
1.需求分析
1-1.对于基本功能,要求实现图形化界面计算器,则可参照电脑或手机上的计算器进行页面布局,最后加上各种监听器即可。
1-2.附加要求实现保存到本地,只需将内存中的历史纪录通过文件读写到本地即可。
1-3.附加要求实现上传至服务器,可以用TCP或者UDP报文通信实现
2.概要设计
2-1.整体采用手机计算器布局架构
2-2.屏幕显示用文本框实现
2-3.按钮监听自定义ActionListener类
2-4.输入时应限制错误输入
2-5.运算时采用逆波兰式
2-6.保存本地功能采用随机读写方式添加至文件尾部
2-7.上传采用UDP数据报方式
3.详细设计
3-1.代码结构
3-2.结构说明
gui包:
实现图形化界面
GUI.java:
整体架构
DispPanel.java:
显示面板部分
CtrlPanel.java:
控制面板部分
component包:
用到的部件
MyButton.java:
自定义JButton类,进行自定义设定
MyTextField.java:
自定义JTextField类,用于屏幕显示
actionlistener包:
监听器
MyButtonActionListener.java:
对按钮进行监听操作,分别进行不同操作
operation包:
计算、保存上传操作
ArithmeticLogic.java:
获取屏幕输入字符串进行运算后返回结果
SaveOperate.java:
保存计算历史到本地
UploadOperate.java:
上传计算历史到服务器
Main.java:
main函数所在,调用整个工程
4.编码实现
工具:
Eclipse
环境:
jse1.8
人员:
我
耗时:
数十小时
经历:
小问题有些,debug很煎熬
结果:
基本功能完成,保存功能完成,上传功能完成但未验证
5.测试纠错
每一个模块完成后都及时进行纠错处理,最后整体进行大量测试,对发现的错误进行纠正。
发现错误包括:
输入限制逻辑错误
运算逻辑错误
异常监听错误
函数调用错误
经过鏖战,干掉bug!
三、实验结果
1.初始化界面
2.界面说明
2-1显示部分
屏幕区域由上到下分为三个区域,依次显示:
提示信息:
正常显示“Let’sROCK”,发生错误提示错误信息,及其他操作信息
上次运算历史:
如图“sin(2.5*pi)=1”
本次运算结果:
如图“1.0”
2-2控制部分
控制部分整体采用Gridlayout布局进行排列:
按钮布局仿照红米1s的计算器
3.结果演示
3-1单目运算
3-2双目运算
3-3混合运算
3-4错误演示
3-5保存本地操作结果
注意:
采用特定输入序列(88224466!
!
^^)启动操作
3-6上传服务器操作演示
注意:
采用特定输入序列(82824646!
^!
^)启动操作
4.总结结果
基本功能堪称完美,经大量测试不再有未知错误发生,已发现bug已经全部解决
上传操作发送数据报报文,时间原因来不及测试了
保存本地操作没有任何问题,测试结果良好
四、总结分析
通过本次实验,发现了平时许多没有发现的问题。
首先此前没有学过java,上课时学到的知识在课后没能及时复习回顾,遗漏了一些很小但是却致命的问题,幸而在本次实验中及时发现,亡羊补牢,结果还大体满意。
理论学习固然重要,实际应用也必不可少,在实践中把学过的知识应用出来才能最大程度的加深自己的学习理解程度,也可以将自己平时没有注意到的错误即使解决掉。
最后,感谢老师的教导!
五、实验代码
1.gui包
GUI.java
packagecom.lzj.caculator_javaexp.gui;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Panel;
importjava.awt.Toolkit;
importjavax.swing.ImageIcon;
importjavax.swing.JFrame;
publicclassGUIextendsJFrame{//图形化界面
privateintmidScreenX;//屏幕中心点x
privateintmidScreenY;//屏幕中心点y
privatefinalintwindowWidth=320;//窗口宽度
privatefinalintwindowHeight=480;//窗口高度
privatefinalintdispPanelX=10;
privatefinalintdispPanelY=10;
privatefinalintdispPanelWidth=300;
privatefinalintdispPanelHeight=165;
privatefinalintctrlPanelX=20;
privatefinalintctrlPanelY=185;
privatefinalintctrlPanelWidth=280;
privatefinalintctrlPanelHeight=275;
publicGUI(){
//TODOAuto-generatedconstructorstub
ImageIconicon=newImageIcon("res/icon.png");//设定图标
setIconImage(icon.getImage());
setTitle("计算器Beta1.0");
setBounds();//调用自定义函数设定边界
setContent();//调用自定义函数设定内容
setResizable(false);
//setUndecorated(true);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//自定义setBounds,使窗口位于屏幕中央
privatevoidsetBounds(){
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
midScreenX=(int)(screenSize.getWidth()/2);
midScreenY=(int)(screenSize.getHeight()/2);
//有边框,保持内部大小故在宽度高度上补全
setBounds(midScreenX-windowWidth/2,midScreenY-windowHeight/2,windowWidth+6,windowHeight+29);
}
privatevoidsetContent(){
setLayout(null);
//面板
Panelpanel=newPanel(null);
panel.setBounds(0,0,windowWidth,windowHeight);
panel.setBackground(newColor(51,51,51));//整体颜色,仿计算器
add(panel);
//显示面板
DispPaneldispPanel=newDispPanel(dispPanelWidth,dispPanelHeight);
dispPanel.setBounds(dispPanelX,dispPanelY,dispPanelWidth,dispPanelHeight);
panel.add(dispPanel);
//控制面板
CtrlPanelctrlPanel=newCtrlPanel(ctrlPanelWidth,ctrlPanelWidth);
ctrlPanel.setBounds(ctrlPanelX,ctrlPanelY,ctrlPanelWidth,ctrlPanelHeight);
panel.add(ctrlPanel);
}
}
DispPanel.java
packagecom.lzj.caculator_javaexp.gui;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Panel;
importcom.lzj.caculator_ponent.MyTextField;
publicclassDispPanelextendsPanel{//显示面板类
publicstaticMyTextFieldshowHintInfo_TextField;
publicstaticMyTextFieldlastCaculation_TextField;
publicstaticMyTextFieldcurrentCaculation_TextField;
publicDispPanel(intwidth,intheight){
//TODOAuto-generatedconstructorstub
setBackground(newColor(204,255,204));//仿屏幕颜色
setLayout(null);
//操作提示信息
showHintInfo_TextField=newMyTextField();
showHintInfo_TextField.setBounds(0,0,width,height/4);
showHintInfo_TextField.setFont(newFont(null,Font.PLAIN,16));
showHintInfo_TextField.setText("Let'sROCK");
add(showHintInfo_TextField);
//上次运算
lastCaculation_TextField=newMyTextField();
lastCaculation_TextField.setBounds(5,height/4,width-10,height/4);
lastCaculation_TextField.setFont(newFont(null,Font.PLAIN,16));
lastCaculation_TextField.setText("");
add(lastCaculation_TextField);
//本次运算
currentCaculation_TextField=newMyTextField();
currentCaculation_TextField.setBounds(5,height/2,width-10,height/2);
currentCaculation_TextField.setFont(newFont(null,Font.PLAIN,32));
currentCaculation_TextField.setText("0");
add(currentCaculation_TextField);
}
}
CtrlPanel.java
packagecom.lzj.caculator_javaexp.gui;
importjava.awt.GridLayout;
importjava.awt.Panel;
importcom.lzj.caculator_ponent.MyButton;
publicclassCtrlPanelextendsPanel{
publicCtrlPanel(intwidth,intheight){
//TODOAuto-generatedconstructorstub
setLayout(newGridLayout(6,5));
add(newMyButton("!
"));
add(newMyButton("^"));
add(newMyButton("√"));
add(newMyButton("π"));
add(newMyButton("C"));
add(newMyButton("sin"));
add(newMyButton("("));
add(newMyButton(")"));
add(newMyButton("e"));
add(newMyButton("←"));
add(newMyButton("cos"));
add(newMyButton("7"));
add(newMyButton("8"));
add(newMyButton("9"));
add(newMyButton("÷"));
add(newMyButton("tan"));
add(newMyButton("4"));
add(newMyButton("5"));
add(newMyButton("6"));
add(newMyButton("×"));
add(newMyButton("ln"));
add(newMyButton("1"));
add(newMyButton("2"));
add(newMyButton("3"));
add(newMyButton("-"));
add(newMyButton("log"));
add(newMyButton("0"));
add(newMyButton("."));
add(newMyButton("="));
add(newMyButton("+"));
}
}
2.component包
MyButton.java
packagecom.lzj.caculator_ponent;
importjava.awt.Color;
importjava.awt.Font;
importjavax.swing.JButton;
importcom.lzj.caculator_javaexp.actionlistener.MyButtonActionListener;
publicclassMyButtonextendsJButton{
publicMyButton(Stringstr){
//TODOAuto-generatedconstructorstub
newJButton();
setText(str);
if(str.equals("=")){
setBackground(newColor(255,102,00));
}
setFont(newFont(null,Font.PLAIN,16));
setFocusPainted(false);
addActionListener(newMyButtonActionListener());
}
}
MyTestField.java
packagecom.lzj.caculator_ponent;
importjavax.swing.JTextField;
publicclassMyTextFieldextendsJTextField{
publicMyTextField(){//自定义JTextField类
newJTextField();
setEditable(false);
setBackground(null);
setBorder(null);
setHorizontalAlignment(JTextField.RIGHT);
}
publicvoidappend(Stringstr){//追加字符串
Stringstring=getText();
setText(string+str);
if(string.length()==0){
setText(str);
}else{
if(string.charAt(string.length()-1)=='0'&&!
str.equals(".")){//末尾为"0"且不是追加"."
if(string.length()==1){//只有一个"0"
string="";
}elseif(string.charAt(string.length()-2)<'1'&&string.charAt(string.length()-2)>'9'){//"0"之前不是数字
string=string.substring(0,string.length()-1);
}
}
setText(string+str);
}
}
publicvoidremoveEnd(){//删除最后一个字符
Stringstring=getText();
if(string.length()<=1){
setText("0");
}else{
setText(string.substring(0,string.length()-1));
}
}
}
3.actionlistener包
MyButtonActionListener.java
packagecom.lzj.caculator_javaexp.actionlistener;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importcom.lzj.caculator_ponent.MyButton;
importcom.lzj.caculator_javaexp.gui.DispPanel;
importcom.lzj.caculator_javaexp.operation.ArithmeticLogic;
importcom.lzj.caculator_javaexp.operation.SaveOperate;
importcom.lzj.caculator_javaexp.operation.UploadOperate;
publicclassMyButtonActionListenerimplementsActionListener{
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
Stringstring=((MyButton)e.getSource()).getText();//按钮上的文本
switch(string){//各个按钮的功能
//直接在最后面追加本次输入
case"0":
case"1":
case"2":
case"3":
case"4":
case"5":
case"6":
case"7":
case"8":
case"9":
case"π":
case"e":
case"!
":
case"^":
case"(":
case")":
DispPanel.currentCaculation_TextField.append(string);
break;
//后跟一个"("
case"√":
case"sin":
case"cos":
case"tan":
case"ln":
case"log":
DispPanel.currentCaculation_TextField.append(string+"(");
break;
//一个数字只能输入一个"."
case".":
StringtempStr=DispPanel.currentCaculation_TextField.getText();
charc=tempStr.charAt(tempStr.length()-1);
if(c<'0'||c>'9'){//最后不是数字,直接返回
return;
}
for(inti=0;i c=tempStr.charAt(tempStr.length()-1-i); if(c>='0'&&c<='9'){ continue; }elseif(c=='.'){//数字已经含有小数点,返回 return; }else{//最后一个数字内不含小数点 break; } } DispPanel.currentCaculation_TextField.append("."); break; //运算符问题 case"+": case"÷": case"×": StringtempStr1=DispPanel.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 实验 报告 图形 界面 计算器
![提示](https://static.bdocx.com/images/bang_tan.gif)