开发电话约会簿在这部分,我们将通过构建一个电话约会簿来说明 J2ME RMS 的功能。这个应用程序将允许用户设置某个日期和时间的约会,取消约会或查看已经设置好的约会列表。一个快捷屏幕视图如图 2 所示。
图 2. 工作中的电话约会簿 构成这个应用程序的各种屏幕以及屏幕元素的用户界面元素的完整列表在与 J2ME Wireless Toolkit 一起提供的 MID 框架 API 文档中可以得到;要获取关于这些元素的更多详细信息,请查阅我早些时候给 developerWorks写的一篇文章(请参阅下面的 部分以获取这两个链接)。
记录存储可以以字节流形式存储记录。在我们的应用程序中,用户输入的日期和时间被连接成一个字符串,转换成字节,然后被存储。
清单 10. 将一个新的约会添加到数据库中1
2
3
4
| Public boolean matches(byte[] candidate)
String appt = apptName + " " + apptTime;
byte bytes[] = appt.getBytes();
rs.addRecord(bytes,0,bytes.length);
|
同样,这个应用程序以字节流形式检索记录,然后将它转换成一个字符串。这个字符串以 ####AAAA 格式,其中 # 表示代表时间信息的数字,AAAA 表示代表约会描述的字符。这个应用程序解析这个字符串来获得日期和时间信息,并以用户所希望的格式显示它们,比如 description - mm/dd/yyyy hh:mm AM_PM。
清单 11. 从记录存储检索一条记录1
2
| byte b[] = rs.getRecord(j);
String str = new String(b,0,b.length);
|
清单 12. 解析从记录存储获得的数据,然后以用户所希望的格式显示1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| if (Character.isDigit(str.charAt(i)))
at += str.charAt(i);
else
name += str.charAt(i);
time = Long.parseLong(at);
java.util.Date date = new java.util.Date(time);
java.util.Calendar rightNow = java.util.Calendar.getInstance();
rightNow.setTime(date);
String year = String.valueOf
(rightNow.get(java.util.Calendar.YEAR));
String month = String.valueOf
(rightNow.get(java.util.Calendar.MONTH) + 1);
String day = String.valueOf
(rightNow.get(java.util.Calendar.DATE));
String displayName = name
+ "-" + year + " " + day;
|
用户被允许从记录存储中选择某种约会以及将它们从记录存储中删除。因为为了维持记录中原始的顺序所删除的 recordId不能重用,所以这个记录通过特有的字符串模式标记为无效。
清单 13. 将一条记录标记为已删除1
2
3
| String deactive = "@";
byte b[] = deactive.getBytes();
rs.setRecord(m+1, b,0,b.length);
|
当这个应用程序显示一个约会列表时,它检测那些无效记录的字符串模式,然后跳过它们。
清单 14. 跳过无效记录1
2
3
4
5
6
7
8
| if (!(str.startsWith("@")))
{
// Record is valid
}
else
{
// Record is invalid.
}
|
这个应用程序的一个重要的方面是用户界面。各种屏幕有下面这些:
- 欢迎表单:欢迎表单显示一个已经设置好的约会列表,如果没有设置约会,则通知用户。它提供继续或退出这个应用程序的各种选项。
- 菜单表单:菜单表单给用户提供查看约会、设置新约会或取消约会等选项。
- 显示表单:显示表单显示已经设置好的约会列表。
- 设置表单:设置表单提供一个日期选择域和一个输入文本域,以提供新约会的详细信息。当用户选择保存时,这条信息被存储到数据库中。
- 删除表单:删除表单列出一组约会,并提供选择一个或多个的选项。如果用户选择删除,所选择的这组约会在记录存储中被标记为无效。
应用程序实现使自己能够响应各种事件的 CommandListener和 ItemStateListener接口。 ItemStateListener使应用程序能够接收指示下面这些东西的内部状态的改变的事件:
- DateField,一个显示日期和时间的可编辑组件
- TextField,一个可编辑文本组件
- ChoiceGroup,一组可选择的元素
清单 15. 从屏幕获取值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // The date value is set to a variable when the
// DateField item is changed
if (item == apptDate)
{
date = apptDate.getDate();
apptTime = String.valueOf(date.getTime());
}
// The name of appointment is set to a variable
//when the name input field is changed
if (item == apptField)
{
apptName = apptField.getString();
}
// If the ChoiceGroup item state on Delete form is
//changed, it sets an array of appointments selected for deletion
if (item == cg)
{
cg.getSelectedFlags(deleted);
}
|
包含这个样本应用程序的完整清单。请参阅 中我以前的一篇关于 J2ME 的文章,以获取关于下载将使您能够在桌面上运行这个程序的设备仿真器的指导。 |