J2ME应用开发实训报告.docx
《J2ME应用开发实训报告.docx》由会员分享,可在线阅读,更多相关《J2ME应用开发实训报告.docx(10页珍藏版)》请在冰豆网上搜索。
J2ME应用开发实训报告
J2ME应用开发实训报告
一、实训目的:
1、了解NetBeans和WTK软件的安装与环境的搭建;
2、掌握创建MIDlet应用程序的步骤和方法;
3、掌握使用可视Mobile设计器完成简单图形界面的设计;
4、了解MIDP用户界面的显示机制;
5、掌握记录存储和索引机制的应用;
6、掌握Canvas绘图的方法;
7、通过实训达到巩固我们以前所学习的知识,让我们能够掌握更牢,并在原有知识的基础上拓展我们的知识面的目的。
实训锻炼了我们独立思考和自学的能力,培养了我们的创新精神,为我们今后走上社会参与工作创造了有利条件。
二、实训内容:
1、通讯录设计:
(1)主菜单设计
(2)添加联系人设计
(3)其他功能设计
(4)功能的实现
2、绘制图形:
(1)绘制文本
(2)绘制几何图形
三、详细设计:
3.1通讯录设计
3.1.1主菜单设计
手机用户界面的设计比较简单,NetBeansIDE提供了VisualMobileDesinger设计MIDP应用程序的方法,在可视化的Mobile设计器中设计用户界面简单而易学。
(1)创建启动画面
在流视图环境下,从组件面板的可显示项中拖动一个闪屏组件到流设计窗口,双击splashScreen组件标题,进入屏幕设计器界面,双击组件屏幕中的“<未指定图像>”为其添加启动屏幕时显示的画面,当然也可以双击“<未指定文本>”为启动画面添加文字。
这样启动画面就设计好了,但是必须在getSplashScreen()方法的最后添加如下代码:
splashScreen.removeCommand(SplashScreen.DISMISS_COMMAND);
(2)添加主菜单
①从组件面板的可显示项拖动一个列表组件、一个表单组件、一个文本框组件到流设计窗口。
②双击新添加的list对象的标题,设置它的实例名称为menuList,设置它的标题为“主菜单”,类型为IMPLICIT。
从组件面板的元素中拖动5个列表元素到列表组件上,并分别将它们的字符串属性设置为浏览、添加、查找、删除、帮助。
在图像属性中分别为它们选择一张标志性的图像,可以根据美观性为各个列表元素设置字体属性。
最后从组件面板中拖动一个退出按钮到列表组件上。
最终设计运行如图3.1.1.
图3.1.1
3.1.2添加联系人设计
进入手机通讯录之后是一些操作,如:
浏览、添加、查找、删除、帮助。
当我们选择了相应的操作之后,此时我们才会看到想要的信息。
①双击新添加的form对象的标题,设置实例名为addContactForm,设置form的标题为添加联系人。
②从组件面板的项中拖动两个文本字段到表单组件上,标签分别设置为“姓名”和“移动电话”,重命名两个文本字段为nameField和mobileField,设置两个文本字段的文本属性为空,设置mobileField的输入限制为电话号码。
3从组件面板的项中拖动一个选项组至列表组件,标签设置为空,类型设置为MULTIPLE,重命名该项为choice。
4从组件面板的元素中拖动一个选择元素至choice,设置字符串为“详细信息”其余采用默认设置。
5从组件面板的命令中拖动一个后退按钮和一个确定按钮到列表组件,并设置确定按钮的标签为保存。
6详细信息复选框要求当用户选择了复选框后,在下面出现“固定电话”和“电子信箱”两个文本字段,取消勾选“详细信息”复选框,表单中只输入联系人姓名和移动电话信息。
此时,PhoneBookVisualMIDlet需要扩展ItemStateListener接口,实现对choice状态的监听,同时在getAddContact()方法中添加对AddContact控件的监听,并实现该接口的itemStateChanged()方法。
实现choice功能的代码如下:
publicvoiditemStateChanged(Itemitem){
if(item==choice){
if(choice.isSelected(0)){
phoneIndex=addContactForm.append(phoneField);
emailIndex=addContactForm.append(emailField);
}else{
addContactForm.delete(emailIndex);
addContactForm.delete(phoneIndex);}}
}
最终运行效果如图3.1.2.1和图3.1.2.2.
图3.1.2.1图3.1.2.2
3.1.3其他功能设计
①双击新添加的文本框组件设置实例名为helpTextBox,设置标题为帮助,设置最大大小属性为200,从组件面板的命令中拖一个后退按钮到文本框组件。
②从组件面板的可显示项中拖动一个表单和两个列表到流设计器中,其中一个列表用于显示通讯录中的联系人,重命名该实例为PhoneList,标题设置为“联系人列表”,类型设置为EXCLUSIVE,另一个列表用于显示联系人详细信息,重命名该实例为DetailInfo,设置标题为“联系人详情”,类型设置为IMPLICIT。
表单用于根据联系人姓名查找联系人,重命名该实例为Search,标题设置为“查找人详情”。
④双击新添加的列表PhoneList,然后为其添加一个返回、两个确定按钮,重命名两个确定按钮分别为infoCommand和DelCommand,标签分别设置为详情和删除。
⑤双击新添加的列表DetailInfo,为其添加一个返回按钮,一个确定按钮,重命名确定按钮为modifyCommand,标签设置为修改。
7双击新添加的表单Search,为其添加一个返回按钮、一个确定按钮重命名确定按钮为searchCommand,设置它的标签为搜索,从组件面板的项中拖一个文本字段到屏幕,标签设置为“姓名”,重命名文本字段为searchField。
publicFormgetSearch(){
if(Search==null){
Search=newForm("\u67E5\u627E\u4EBA\u8BE6\u60C5",newItem[]{getSearchField()});
Search.addCommand(getBackCommand4());
Search.addCommand(getSearchCommand());
Search.setCommandListener(this);
Search.setItemStateListener(this);
}
returnSearch;
}
最终运行效果如图3.1.3.1、图3.1.3.2和图3.1.3.3。
图3.1.3.1图3.1.3.2图3.1.3.3
3.1.4功能实现
(1)通过Account类实现对用户信息的封装,它包括四个字段userName、mobilePhone、email、phone。
通过把这四个字段定义为私有的来对数据进行封装和保护,用户可以通过set和get方法实现对数据的修改和访问。
publicbyte[]serialize()throwsIOException{
ByteArrayOutputStreambaos=newByteArrayOutputStream();
DataOutputStreamdos=newDataOutputStream(baos);
dos.writeUTF(userName);
}
(2)索引类Index包括两个数据成员key和recordID,其中key对应的是Account类的userName项,recordID对应的是Account记录存储中的记录ID,将它们之间建立起映射关系,同时将它们存储到另外一个记录存储中。
数据存储类Model是系统数据模型的核心类,系统通过该类创建记录存储,并实现系统对记录存储中记录的添加、删除、读取、查找和更新等操作。
addIndex()方法是添加索引到索引记录存储rs_index中,如果该索引已经存在就更新它。
(3)按钮功能实现
①保存按钮:
保存按钮触发记录存储,将表单中的信息保存到记录存储rs和索引记录存储rs_index中,保存成功后由于系统自动记录下刚输入的联系人信息,使得再次添加新的联系人时AddContact表单中各文本字段仍保留上次输入的信息。
关键代码如下:
try{
model.addRecord(newAccount);
System.out.println("addsuccess!
");
}catch(Exceptione){
e.printStackTrace();
}
②详情按钮:
如果联系人列表不为空此时点击详情按钮会显示联系人的详细信息,但是如果联系人列表为空,则调用告警方法showAlert(),在此需要定义一个用于显示联系人信息的方法detailinit(),关键代码如下:
publicvoiddetailinit(Accountaccount){
intlistNum=0;
listNum=DetailInfo.size();
if(listNum>0){
for(inti=listNum-1;i>=0;i--){
DetailInfo.delete(i);
}
}
DetailInfo.append(account.getUserName(),null);
Stringphone=account.getPhone();
}
③删除按钮,联系人列表窗口中的删除按钮将列表中选中的联系人从联系人列表和记录存储中删除,并提示用户是否确定删除,当然如果联系人列表为空,也会告警。
在此就需要调用Alert类的构造方法Alert()代码如下:
alert=newAlert
(title,text,getImage("/res/alert.png"),AlertType.CONFIRMATION);
④修改按钮,用户在主菜单中选择“浏览”,进入“联系人列表窗口”,执行菜单中的“详情”按钮,打开“联系人详情”窗口,显示被选中的联系人信息。
执行菜单中的“修改”按钮,打开修改联系人信息窗口,修改联系人的信息后单击“保存”按钮,保存修改信息。
此处最重要的是如何获取用户修改后的信息,关键代码如下:
Accountaccount=model.getAccount(DetailInfo.getString(0));
nameField.setString(account.getUserName());
⑤查找功能的实现
用户在主菜单中选择“查找”,进入“查找联系人”窗口,在表单中输入联系人的姓名,执行菜单中的“搜索”按钮,如果有满足条件的联系人,在“搜索结果”窗口中显示满足条件的联系人列表,否则给出告警信息。
首先要构建一个搜索结果列表searchResultList用于显示搜索结果,为了快速搜索到用户需要的联系人,给Search组件中的searchField添加监听事件,只需在getSearch()方法中添加如下代码:
Search.setItemStateListener(this);
为了响应监听还需要在itemStateChanged()方法中添加如下代码:
if(item==searchField){
StringuserName=searchField.getString();
if(userName.length()!
=0){
searchRecord(userName);
}
}
首先获得用户输入的联系人姓名,如果联系人姓名不为空,则调用searchRecord()方法查找联系人,该方法通过userName直接得到记录的ID,然后根据记录的ID调用showSearchResult()方法将结果显示出来。
此处需要注意的是在联系人列表中有删除按钮,在搜索结果列表中也有删除按钮,因此必须将两个删除事件区分开来,这里设置了一个delflag变量,而在联系人列表删除按钮事件中也有一个delflag变量,前者的值为1,后者的值为0。
⑥清空通讯录的实现,如果用户在主菜单中选择了“删除”,系统给出告警信息,如果选择“确定”,将删除全部联系人的信息。
这里主要调用了Model类的clearAllRecord()方法。
最终运行效果如图3.1.4.1和图3.1.4.2:
图3.1.4.1图3.1.4.2
3.2绘制图形
3.2.1绘制文本
Graphics中提供了对字体的控制方法,每个Graphics都有一个Font对象与其关联。
继承Canvas类在屏幕上绘制文本,并且文本可以在屏幕上移动,首先通过调用Canvas类的getWidth()和getHeight()方法了解手机屏幕究竟有多大的画图空间,然后定义两个变量并且初始化后作为图片的坐标。
当然要想让图片移动就要响应键盘事件,这里就通过gameAction来完成。
部分代码如下:
faceChoice=newChoiceGroup("外观",Choice.EXCLUSIVE);
faceChoice.append("PROPORTIONAL",null);
faceChoice.append("MONOSPACE",null);
faceChoice.append("SYSTEM",null);
styleChoice=newChoiceGroup("风格",Choice.MULTIPLE);
styleChoice.append("PLAIN",null);
styleChoice.append("BOLD",null);
styleChoice.append("ITALIC",null);
styleChoice.append("UNDERLINED",null);
sizeChoice=newChoiceGroup("大小",Choice.EXCLUSIVE);
sizeChoice.append("SMALL",null);
sizeChoice.append("MEDIUM",null);
sizeChoice.append("LARGE",null);
最终运行效果如图3.2.1.1和图3.2.1.2:
图3.2.1.1图3.2.1.2
3.2.2绘制几何图形
几何图形的绘制,可以绘制直线、弧线、矩形等图形。
几何图形的绘制并不需要Canvas操作,是通过Graphics对象进行绘制。
可以绘制直线、弧线、矩形等图形。
构造方法:
publicvoiddrawLine(intx1,inty1,intx2,inty2)就可以绘制一条指定长度的直线。
而且通过调用setStrokeStyle()方法可以设置线型为实线或点划线。
构造方法:
publicvoiddrawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle);
publicvoidfillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle);
最终运行效果如图3.2.2.1和图3.2.2.2:
图3.2.2.1图3.2.2.2
㈣总结
这次实训,任务是让我们做一个手机通讯录和实现手机绘制图形。
虽说书上已经给出了实现方法,可是对我来说完成还是一件不简单的事。
实训的两周,我觉得重要的不是能做出多完美的成果,而是自己在这两周内能学习到什么,更不是为了完成最终的作业而实训。
实训的时间是比较充裕的,实训过程中也遇到了许多这样那样的问题,所以可以及时和同学一起讨论出现的问题,并能够解决。
实训与平时的上课显然不相同,老师不会,也不可能仔细的讲解每一个知识点,否则的话,两个月的时间恐怕都是不够的。
实训我们要靠自己,不懂得问题要及时问,问同学或者查阅资料。
态度很重要,摆正自己的心态。
只有自己付出过,当程序运行成功时的那种喜悦才会令自己有一种莫名的自豪感。
态度决定一切!
转眼间两周的实训就过去了,这让我对JAVAME的认识又加深了,这对以后我们进入工作岗位起到很大的帮助。
通过本次实训,我认为最重要的是要有一个良好的心态以及正确的学习方法。
还有就是要对它充满兴趣与探求的渴望。