选择显示字体大小

探索j2me:创建开销细节表单

为什么我要不厌其烦地讨论事件机制的细节呢?这是因为我想更多地用到detailform表单而非仅仅一个midlet,当然,最开始还是先让咱们看看items

查看构造器

detailform的构造器代码如程序清单a所示。这个构造器以expenseinfo的一个实例作为其参数,这样我就可以处理现有项目的编辑功能,同时还可以在同一代码的基础之上创建新项目。detailform通过对基类form构造器的调用设置其名称,然后创建4个 item用户界面组件,它们是一个datefield、两个textfields和一个choicegroup,其功能就是显示expenseitem的有关信息,另外还要加上两个commands。

正如我们现在都知道的那样,item组件族派生于item抽象类,同大多数家族成员一样,这类组件有很多性质是相同的。首先, items 可以放在screen对象上。其次,它们共享单一事件itemstatechange,该事件提示组件所表示的数据发生了变化。

datefield

<--start banner ad--><--ba--><-- language=javascript1.1 src="http://ad.cn.doubleclick.net/adj/messagingplus.z.net.com.cn/developer/code;sz=1x1;ord=1151352851?">

datefieldtextfield组件的用途从它们的名字就可以看出来。datefield显示日期,用户可以由此通过熟悉的日历界面选择新的日期。datefields具有若干种模式,具体设置可以这样做:传递三种静态datefield常量之一作为构造器的第2个参数。

因为我们只关心expenses程序中的日期,所以我创建的dfdatedatefield组件具有唯日期属性,如清单a所示。

textfields

textfield组件显示文本,同时允许用户编辑文本,在功能上类同于桌面应用程序中的文本框。textfields 支持某些基本的输入限制功能,而且这类功能可以在创建组件的时候由构造器的最后一个参数设置。除了对输入信息进行限制以外,这些约束条件还可以简化电话风格键盘的数据输入操作,因为约束只承认给定键的某些特定字符(比如,只有数字按钮上的数字可以输入)。可能的约束值如下:

fmdetail表单包含了两个textfields:其一是tfdesc,它允许输入事件的文本说明(比如“lunch”)。其二是tfamount,它记录开销的美元数量,因此通常由textfield.numeric约束创建。

choicegroup

细节表单的cgcategory组件是一个choicegroup,用户可以把开销放到预先设置的开销类别里: meals、lodging、car、entertainment或者miscellaneous。choicegroups 在功能上等同于list组件,后者我在上一篇文章中已经有所介绍,但是它们只支持exclusivemultiple格式(没有implicit choicegrou这类东西)。同样的,作为item组件,choicegroups 会在操作事件的时候触发itemstatechanged事件,而lists则触发 commandaction事件。

choicegroup添加项目有两种方法。首先,你可以构造一个空组件然后通过append或者 insert方法加入项目。其次,你还可以传递一个包含项目的string数组(这些项目是你希望choicegroup显示的)给重载的构造器。这两种方法各有高低,但我在这里采用了第2种方法,主要是为了能让我对中央位置保存的类别列表(作为静态数组expenseinfo成员)有一定的选择能力。这样就可以很方便地添加新类别或者让用户在将来具有这样做的能力。

choicegroup中给每一项指定图标也是可以的。当然,这里没必要做了免得程序变得复杂,所以我打算在将来的文章中再讨论。

事件处理

<--start banner ad--><--ba--><-- language=javascript1.1 src="http://ad.cn.doubleclick.net/adj/messagingplus.z.net.com.cn/developer/code;sz=1x1;ord=2062570067?">

detailform上的items 都能再用户操作其数据时触发itemstatechanged事件。如程序清单 b所示。itemstatechanged的工作方式和commandaction事件相同:它检查产生事件的item,确定应该采取的行动。在本文的例子中, detailform更新其私有的expenseitem实例来匹配用户修改的数据。

这里唯一需要详细解释的是tfamount变动事件的处理。不支持浮点数字显然令美元和美分数量的处理变得复杂起来,我也遇到了这样的难题。有两种解决办法:给美元和美分分别提供textfields 作为数值表示部分,或者总是假定最后两位数字代表美分。不过这就需要用户用美分来记录数值(100代表1美元)。

当然,detailform也处理自身的两个组件cmokcmcancel所触发的commandaction事件。只要用户调用了以上两个组件之一, detailform就会调用destroylistener.requestdestroy。如果用户调用cmok,私有的expenseinfo实例就会被告之保存对其所进行的修改。

归到一块

现在只需要修改expenses midlet来利用detailform即可。期间需要三个步骤:

  1. 实现expenses中的destroylistener以便在用户通过其两个组件之一关闭程序时破坏detailform并且显示lsmain
  2. 修改expenses.commandaction (程序清单c) 以便用户在选择项目时内容将显示在detailform中。
  3. 修改expenses.commandaction,这样一旦用户调用了cmadddetailform就会被创建并显示一个新的、空白的expenseinfo实例。
设计问题:为什么要有两个midlets?

你在看代码的时候可能注意到了,代码中有两个midlets,最初的expenses和新的newexpense midlet。这样做的原因很简单:在大多数情况下,expenses的用户会打开程序仅仅添加某个新的开销项目。所以我们的设计反映了两个基本的移动应用程序设计原则:方便用户操作,提供最常用功能的快捷方式。

newexpense简单地复制了expenses中调用cmadd命令时发生的行为。它创建一个新的、空白的expenseinfo实例和一个显示前者的detailform实例。当然,在这个时候,应用程序还没有受到数据存储的支持,所以任何通过newexpense新加入的项目都不会出现在expenses里。没关系,后面我们就要说到这一点了。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons