




已阅读5页,还剩198页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
J2ME程序设计 第四章MIDP用户界面 高级API 本章要点 MIDP界面库的分类和各库的用途MIDP高级API类库的内容MIDP高级API编程和使用方法 用户界面库概述 MIDP设备上用户界面库的设计 需要考虑到以下几方面的因素 用户界面应当简单 用户界面应当易于操作 需要考虑到不同设备上的窗口及用户界面应当不同 与桌面系统有区别 移动设备上的应用程序应当与其本地程序的用户界面相类似 用户界面库概述 在MIDP中无法直接对Java2标准版中用户界面库 AWT 进行剪裁来满足移动设备的需要 AWT是为桌面电脑设计的并为之优化 因此在某些方面其设计会局限于桌面系统 AWT的基于桌面的特性 有些在有限CPU功能和有限内存的移动设备上难以实现AWT的事件处理方法在有限CPU功能和有限内存的移动设备上不适用 AWT设置的某些用户交互模式 有赖于鼠标才能实现 而移动设备上往往没有鼠标 只有一个键盘 用户界面库概述 在J2ME中重新设计了用户界面库 新设计的用户界面库主要分为两类 高级API底层API游戏API 用户界面库概述 高级API主要用于编写商务应用程序具有跨平台的可移植特性很重要 高级API提供了高层次的抽象且在程序外观方面仅设置了很少的控制即没有提供太多的API或者参数使开发者可以控制窗口及相关的窗口控件的外观 在MIDP中 提供高级API的用户界面类都是Screen的子类 用户界面库概述 高级API的抽象主要包括如下几个方面 在MID屏幕上的显示特性取决于具体移动设备的特性 MIDP规范中不做定义 屏幕切换 屏幕滚动以及其它各种原始交互操作都由具体移动设备实现 应用程序中不需涉及这些操作应用程序不能访问具体的移动设备的输入部件 如键盘的键钮 用户界面库概述 底层API提供的抽象层次要低一些 底层API主要用于需要对图象在屏幕上的具体位置和像素进行精确控制的应用程序 这些应用程序需要访问底层输入事件 一些应用程序还需要访问特定的设备相关的特性 用户界面库概述 在MIDP2 0中 为了便于游戏程序的设计 专门引入了游戏包javax microedition lcdui game提供底层API的类是Canvas和Graphics 用户界面库概述 使用底层API 应用程序可以 完全控制在屏幕上显示的象素的特性 处理原始事件 如按键的按下和释放 访问具体的按键和其它输入部件 用户界面库概述 使用底层API的应用程序可能导致程序是不可移植的因为底层API涉及了访问特定设备的特定属性的方法 这些方法往往不可移植 如果应用程序没有使用这些特性 那么程序将是可移植的 如果使用了这些特性 则程序不能保证其可移植性 用户界面库概述 建议在程序开发时尽量使用底层API中独立于平台的部分 应用程序不应当依赖于Canvas定义之外的任何按键不应当依赖于某个特定移动设备的屏幕大小 应用程序应当使用游戏键 而不是使用具体键来实现事件映射机制 应用程序应当能够查询显示屏幕的大小并根据其值做具体的调整 Display Displayable及其管理 Display及其使用Displayable对象Displayable对象与应用管理系统 AMS 的相互作用 以上操作都是在AMS管理下进行 一个MIDletSuite中可含有多个的MIDlet但在任何时候都只能有一个MIDlet是在前台运行 而其它MIDlet在后台运行每个的MIDlet都有一个关联的Display对象它提供了获取设备显示设备能力的各种方法处于前台的MIDlet控制着屏幕其Display通过调用setCurrent 方法使一个Displayable对象在屏幕上显示 Display Displayable及其管理 MIDlet即使在后台运行 仍然可以调用Display的方法要求显示某个Displayable对象但这个Displayable对象无法在屏幕上显示当一个处于后台的MIDlet被移至前台时与其对应的Display对象所的要求显示Displayable对象也将显示在屏幕原先处于前台的MIDlet则转入后台与其对应的Display对象所的要求显示Displayable对象也将从屏幕上隐去 Display Displayable及其管理 多个MIDlet同时执行 Display Displayable及其管理 Display及其使用 Display对象是MIDP显示其用户界面的逻辑设备屏幕Display对象并不直接对应着实际设备屏幕是一个虚拟屏幕MIDlet通过Display控制实际设备屏幕在MIDlet中Display管理着屏幕处理屏幕之间的导航同时管理着显示器和输入设备 Display及其使用 类Display中提供的方法 publicstaticDisplaygetDisplay MIDletm 获取与指定MIDlet对应的Display对象publicvoidsetCurrent DisplayablenextDisplayable publicvoidsetCurrentItem Itemitem 把指定的Displayable对象显示在屏幕上 Display及其使用 示例 publicclassmyMIDletextendsMIDlet Displaymydisplay null publicmyMIDlet 构造函数 publicvoidstartApp mydisplay Display getDisplay this 其它操作 其它方法 Display及其使用 程序可以在MIDlet被destroyApp 或者notifyDestroyed 方法销毁之前都可以调用getDisplay 方法对同一个MIDlet 不管何时 通过此方法返回的Display对象都是同一个Display对象 Display及其使用 示例 Display及其使用 需要先创建需要显示的用户界面组件Displayable然后调用Display的setCurrent 方法 将用户界面组件显示出来setCurrent 方法不会等待实际屏幕的切换完成后 才结束运行而是按自身节奏运行并结束运行 Display及其使用 由于在MIDP中 屏幕在同一时候只能显示一个Displayable对象 因此当调用setCurrent 方法后 新的Displayable对象将替代旧的对象 但是 实际屏幕的切换并不会立刻发生 因为这期间可能有其它的事件调度发生由于存在着这种滞后 如果在setCurrent 之后立刻调用getCurrent 方法 返回的可能不是刚才setCurrent 设置的Displayable对象 Display及其使用 如果设置完要显示的Displayable对象后需要进行其它的需要长时间的操作 则由于setCurrent 方法的滞后 导致要显示的Displayable对象没有被显示出来 此时系统在执行费时的操作 设备屏幕上显示的可能仍然是前一个Displayable对象 Display及其使用 因此在进行此类费时操作时最好是在一个新的进程中操作 而在原先的进程中显示如 请等待 之类的提示信息 Display及其使用 对setCurrent 方法的调用并不会被进行队列缓存 例如 mydisplay setCurrent S2 mydisplay setCurrent S3 最终的结果可能是S2根本不会显示 而只是S3显示成为当前的Displayable对象 Displayable对象 Displayable类继承关系 Displayable对象 MIDP用户界面的核心是Displayable对象 它封装了用于获取用户输入的设备相关图形 同一时间只能有一个Displayable对象对用户可见 此时用户只能与此Displayable对象进行交互 Displayable对象 Screen是Displayable对象的一个子类 用于处理高级用户界面组件的用户交互 Screen子类处理事件的产生 用户交互 屏幕滚动等Screen子类只能将高级事件传送给MIDP应用程序 由相应的处理函数进行处理 Displayable对象 之所以这样设计 主要是因为MIDP设备中显示和输入设备的差别很大 如果应用程序需要涉及组件的布局 滚动以及焦点的转换等问题 将导致应用程序很难移植 简单的全屏幕使屏幕更易管理 用户界面更友好易用 Displayable对象 目前 主要有三类Displayable对象 封装了复杂的用户界面组件的Screen 如类List和TextBox 这些屏幕的结构是预先定义的 应用程序不能在其上增加其它的组件 通用的Screen 如Form 可以包含Item对象来表示用户界面组件 应用程序可以在Form对象中加入任意数目Item 如文本 图像以及其它组件 用于底层API中的Displayable 如 Canvas类的子类 Displayable对象 Displayable对象的基本元素TextBoxListAlertForm ItemStringItemTextFieldDateFieldImageItemGaugeChoiceGroupCustomItem中文文字处理 Displayable对象 AMS负责程序的调度Display负责屏幕的显示Displayable负责屏幕的显示内容Display将要求显示的Displayable对象显示在屏幕上 Displayable对象 通常多数应用程序都会使用预先定义的结构如List TextBox以及Alert 这些类通常这样使用 用户需要在一些预先定义的集合中进行选择时使用List 用户需要进行文字输入操作时使用TextBox用户需要显示包含文字和图像等临时信息时使用Alert Displayable对象 Form类比较特殊 当预定义的screen结构无法满足需要的时候 就要采用Form 在Form中 可以按照需要加入各种组件 在MIDP2 0中用户还可以自己定制用于特殊目的的组件 增加高级API的功能 Displayable对象 Form主要用于包含几个相关的UI元素 这些元素是Item的子类 ImageItem StringItem TextField DateDieldChoiceGroup Gauge CustomItemSpacer Displayable对象 Item继承关系 Displayable对象 在Displayable对象中 每个Displayable都有一个标题 Title 一个滚动幅 Ticker 和一组附着于其上的命令 Command Displayable对象的基本元素 Displayable对象可以拥有 一个标题 Title 一个滚动幅 Ticker 零个或多个命令 Command 与命令关联的命令监听器 CommandLister 应用管理系统对Displayable对象的管理 用户界面与其它API中的资源一样 都是受MIDP的应用管理系统 AMS 管理用户界面遵循如下规则 getDisplay 在MIDlet的构造函数开始一直到destroyApp 返回之前都可调用 Display对象在destroyApp 调用之前都保持不变 应用管理系统 AMS 控制MIDlet按照如下要求操作 startApp 应用程序可以调用setCurrent 设置第一个屏幕 应用管理系统在startApp 返回后使Displayable真正可见pauseApp 应用程序应尽可能释放线程 同时 若应用程序在重新活动后需要从一新的屏幕开始 新屏幕应当用setCurrent 设置 destroyApp 应用程序应当删除创建的对象 应用管理系统对Displayable对象的管理 Displayable对象的基本元素 除非在子类中另外指定 缺省情况下 新创建的Displayable对象具有如下特点 在Display上不可见 没有滚动幅 标题为空 没有关联的命令 也没有命令监听器 CommandListener Ticker Ticker 是一段文字 可以不断的在屏幕上滚动 其移动方向和速度与具体的MIDP设备有关 当字符串从一端滚动出显示屏幕后 字符串将从另一端重新滚动进入屏幕 Ticker Ticker Ticker的使用 同一个ticker可以在几个Displayable对象间共享 应用程序可以在其所有的Displayable对象上设置同样的ticker 这样在不同Displayable对象间导航时ticker可以在同样的位置显示而且继续滚动其内容 应用程序也可以为不同的Displayable对象组设置不同的ticker 或者每个不同的Displayable对象设置不同的ticker Ticker的使用 在Displayable类中有两个与Ticker相关的函数 TickergetTicker voidsetTicker Tickerticker Ticker的使用 getTicker 可以取得此Displayable对象关联的Ticker对象的引用 如果没有Ticker对象与此Displayable对象关联 则返回值为null 取得Ticker对象的引用后 可以对Ticker要显示的字符串进行设置 Ticker的使用 若要设置Displayable对象的Ticker 可以使用Displayable类的setTicker 函数 setTicker 函数也可以用于取消Displayable对象先前设置的Ticker 只需将其参数设置为null即可 Ticker的使用 在Ticker类中 Ticker类定义了两个成员函数 StringgetString voidsetString Stringstr Ticker类的getString 函数用于获取Ticker上正在显示的字符串 可以通过setString Stringstr 设置需要在Ticker显示的字符串 Ticker的使用 创建并设置Ticker 程序实例 privatevoidjbInit throwsException myticker newTicker Thisishelloworldscrollingthroughwindows setTicker myticker Title 在Display对象中 每个Displayable对象都可以有一个标题 Title 可以调用Displayable类的getTitle 函数获取Displayable对象的标题 可以使用setTitle 函数来设置标题 Title 这两个函数的原型为 StringgetTitle voidsetTitle Stringstr 如果setTitle 函数的参数为null 则将会移除Displayable对象的Title 如果窗口为当前可见窗口 则对标题的改变能够立刻反映到实际的窗口上 不需调用其它额外的界面更新函数 Title Title 程序实例 if command mycommand 首先取得文本框的内容 将文本框的内容设置为标题setTitle getString 命令 Command 由于在MIDP设备中多数没有象鼠标那样的指点设备 因此多数情况下是通过所谓命令与设备进行交互 在MIDlet中 Command只是包含了此命令的语义信息 即此命令要做什么的信息 而具体如何动作则是在CommandListener中定义的 命令总是与某个Displayable对象相关联 命令 命令的处理模型 命令 命令编程步骤 首先创建Command对象调用Displayable类的addCommand 方法 将Command对象加入到Displayable对象中 定义实现CommandListener接口的监听器类 在该类中权覆盖commandAction 方法 调用Displayable类的setCommandLister 方法 将实现了CommandListener接口监听器类对象向Displayable对象注册 命令 命令在Displayable对象上显示的具体形式与命令的数目以及命令的语义有关 如果命令语义表明此命令会被经常使用 则此命令会直接映射到一个具体的物理按键上 即赋予此命令一个 快捷键 如果命令数目很多 则多数命令将会出现在一个菜单上 命令 创建命令 Command类有两个构造函数 Command Stringlabel intcommandType intpriority Command StringshortLabel StringlongLabel intcommandType intpriority 创建命令 一个命令包含四部分的信息 一个短标签 ShortLabel 一个可选的长标签 LongLabel 类型 Type 优先顺序 Prority 标签 Label 用于在界面上表示命令的含义类型和优先顺序用于表示命令的语义 命令标签 每个命令可以包括一个或两个标签 标签的文字用于显示在界面上表示实际的命令 程序中使用的标签如果不是Screen类型指定的标签 则它可能会被Screen指定的标签所覆盖Screen指定的标签字符串用来描述对应的命令更合适 命令标签 命令的长标签是可选的如果程序没有提供长标签 则系统将总是使用短标签 短的标签字符串应当尽可能的短 以便减少其占用的屏幕空间 长的标签应当较长并且具有描述性信息 但也不能太长 命令标签 系统根据用户界面的上下文以及剩余的屏幕空间决定如何使用标签 例如 如果命令显示在软按键上 则使用短标签如果命令显示在菜单中且有足够空间 则使用长命令 系统也有可能对某些命令使用短标签 而对其它命令使用长标签 应用程序不能确定何时使用短标签 命令类型 应用程序通过命令类型来描述命令的含义 目前 规范定义的命令类型有 BACKCANCELEXITHELPITEMOKSCREENSTEOP 命令类型 命令类型 命令类型 命令优先顺序 在MIDlet中 应用程序使用优先顺序 Prority 来描述同一屏幕中一个命令与其它命令的相对重要性 优先顺序值为整数值 较小的整数值表示该命令更重要优先顺序值为1表明此命令最重要 值2 3 4等表明命令逐渐不太重要实际的优先顺序值由应用程序选择确定 命令优先顺序 命令优先顺序的处理规则 首先AMS根据命令的类型来确定命令的放置位置 对相同类型的命令则根据优先顺序值来确定 允许在同一个屏幕上存在具有同样的类型和优先顺序值的命令 在这种情况下 具体的显现顺序由AMS确定 高优先顺序值的命令被放置在用户更易使用的位置上 如物理键钮上 而低优先顺序值的命令被放置在菜单上 命令优先顺序 例如 某个应用程序具有如下的命令集 newCommand Buy Command ITEM 1 newCommand Info Command ITEM 1 newCommand Back Command BACK 1 AMS将把 Back 命令放置在物理键钮上 把 Buy 和 Info 命令放置在菜单上 命令优先顺序 命令 在命令类中 还提供了命令标签 命令类型 命令优先顺序的查询方法 其原型分别为 intgetCommandType 获得命令类型java lang StringgetLabel 获得命令短标签java lang StringgetLongLabel 获得命令长标签intgetPriority 获得命令优先顺序值 加入和删除命令 通过Diaplayable类的addCommand方法可将命令对象加入到Diaplayable对象中 方法原型为 publicvoidaddCommand Commandcmd 当cmd被加入Displayable对象时 程序的界面会尽快更新 以反映这种界面的变化 如果要添加的命令已经在Diaplayable对象中 则调用此方法不会重复添加该命令 通过Diaplayable类的removeCommand方法可将命令对象从Diaplayable对象中删除 方法原型为publicvoidremoveCommand Commandcmd 界面的更新 不同于J2SE MIDP中不能在程序运行中改变用户界面元素但可以在程序运行时对用户界面中的元素进行删减或者增加 用户界面会迅速更新以反映出这种变化 响应用户命令 MIDP事件处理机制与J2SE中的事件处理机制基本相同但鉴于二者硬件资源的差异 在事件的具体实施上很大不同在J2SE中 定义有较多种事件类 在一个J2SE程序中可以设置多个不同的事件监听器 响应不同的事件在MIDlet中 只定义了少数种事件类 在一个MIDlet中 通常只有一个监听器 响应Command事件 命令编写流程 响应用户命令 为了使用命令 在创建command对象并将它加入到Displayable对象后 还需要定义实现CommandListener接口的监听器类 并通过调用Displayable的对象setCommandListener 方法 将监听器类对象向Displayable对象注册 方法原型为 publicvoidsetCommandListener CommandListenerlis 和J2SE类似 MIDlet可以选择在不同的地方实现CommandListener接口 并重写事件处理方法 响应用户命令 在CommandListener接口中 只定义了一种响应Command事件的事件处理方法 publicvoidcommandAction Commandc Displayabled 参数说明 Commandc 指定要响应的命令事件类型 如EXIT OK BACK等 Displayabled 指定要响应的Displayable对象 响应用户命令 在Displayable对象上只能注册一个实现CommandListener的监听器类对象如果在调用setCommandListener 方法之前已经注册过一个CommandListener监听器对象 则新的CommandListener监听器对象将覆盖原先的CommandListener监听器对象 如果setCommandListener 方法的参数lis的值是null 则将删除Displayable对象中注册的CommandListener监听器对象 命令使用实例 publicclassMyBoxextendsTextBox privatevoidjbInit throwsException addtheExitcommandaddCommand newCommand Exit Command EXIT 1 addCommand newCommand SetTitle Command OK 1 addCommand newCommand GetTitle Command OK 1 addCommand newCommand ClearText Command OK 1 SetupthisDisplayabletolistentocommandeventssetCommandListener newMyCommand 将多个Command命令加入Displayable对象中 创建监听器类MyCommand实例 并向MyBox注册 命令使用实例 classMyCommandimplementsCommandListener publicvoidcommandAction Commandcommand Displayabledisplayable Stringlabel command getLabel 获得命令的标签if label Exit elseif label SetTitle elseif label ClearText elseif label GetTitle 命令使用实例 程序执行结果 TextBox TextBox是类Screen的子类 主要用于输入和编辑文本与TextField的功能类似 其多数API也与TextField用法相同 请参考教材P97 99 在此处 将主要描述如何创建TextBox对象 TextBox TextBox的构造函数为 TextBox Stringtitle Stringtext intmaxSize intconstraints 参数说明 Stringtitle 用于设置标题Stringtext 编辑框的初始文字intmaxSize 编辑框可包含的最大字符数intconstraints 编辑框的约束 TextBox最大字符数 最大字符数 intmaxSize 指定TextBox所能够容纳最大字符数 但不是显示在屏幕上的字符数 由于具体设备的屏幕大小对在TextBox显示的字符数也有限制 它的值有可能比通过TextBox定义的最大字符数要小 使得通过TextBox定义的最大字符数无法全部显示最大字符数可以在构造函数中设置 也可以通过函数setMaxSize 设置 intsetMaxSize intmaxSize TextBox最大字符数 具体设备的最大字符数值可以通过调用函数getMaxSize 获得如果初始文字长度比设置的最大的字符数要大 将引发illegalArgumentException异常具体的设备将决定字符如何分行显示以及每行显示多少字符 TextBox的约束 TextBox与TextField一样 都有输入约束不同的约束可以限制用户输入的内容 不同的约束可能产生不同的显示效果 不同的约束设置 使得屏幕显示的内容可能与实际的内容有差异 有些约束需要对输入的文字进行语法检查 TextBox的约束 输入约束可以在构造函数中设置 也可以通过方法setConstraints 设置 方法原型 voidsetConstraints intconstraints 参数说明 intconstraints 低16位 限制性约束值高16位 设定文字输入及显示相关的标志位 将constraints和约束常数CONSTRAINT MASK 常数0 xFFFF 进行位与 运算可获得constraints的低16位值将constraints和约束常数CONSTRAINT MASK的反进行位与运算 可获得constraints的高16位值 TextBox的约束 限制性约束值表 TextBox的约束 标志位表 TextBox程序实例 TextBox编程实例 讲解 如何从JAR文件中读入一文本文件 并显示在编辑框中如何使用JBuilder打包MIDlet 以便发布MIDletSuite TextBox程序实例 创建项目 具体的步骤为 新建一项目 项目名称为text 采用J2MEWirelessToolkit2 1作为JDK 其它设定采用缺省值 创建一个新MIDlet类 类名为MyMidlet Displayable类类名为MyTextBox title为 MyTextBox 继承自TextBox类 其它采用缺省值 TextBox程序实例 加入资源文件 将所有的资源文件放置在一个单独的目录resource中 将资源配置在相应的包中 由于资源文件位于单独的目录resource中 因此对应的资源包的名称即为resource TextBox程序实例 加入资源文件 创建文本资源文件的步骤如下 首先创建一个package 名为resource 然后在此package中创建一资源文件text txt 文件名称为text 类型为txt 设置text txt文件的属性为copy 这样在编译过程中此文件将会被拷贝到classes目录 TextBox程序实例 加入资源文件 创建文本资源文件的操作方法为 在左边目录中的上点击鼠标右键 然后在出现的菜单中选择New Package 在左边目录中的下的resource分支上点击鼠标右键 在出现的菜单中选择New File 创建此文本文件中 可以任意填写一部分文本到此文件中 以便程序进行显示 在左边目录中的text txt上点击鼠标右键 在出现的菜单中选择Property 然后在出现的对话框中按照图示的要求选择Copy一项 TextBox程序实例 加入资源文件 程序编译后目录结构 TextBox程序实例 打包文件 使用JBuilder提供的Jar文件打包wizard对本项目中需要发布的文件进行打包 需要打包的文件包括 两个类文件 MyTextBox类和MyMidlet类 一个资源文件 text txt TextBox程序实例 打包文件 打包步骤为 点击菜单Wizard ArchieveBuilder 选择Archieve类型为MIdlet 打包文件名称为text 在打包内容对话框中加入文件text txt 其它采用缺省设定 获取jar文件中的内容 在MIDlet中读入资源文件需要通过java lang Class类的getResourceAsStream函数 函数原型为 publicInputStreamgetResourceAsStream Stringname 参数说明 Stringname为资源名称资源的名称有两种格式 绝对格式 以 开头的路径相对格式 相对于调用getResourceAsStream函数的类的路径而言的路径 TextBox程序实例 在本例中 目录结构如下 resource text txt textMyMidlet classMyTextBox classgetResourceAsStream函数在类MyTextBox中调用 为了读取text txt 其绝对格式为 resource text txt 相对格式为 resource text txt 获取jar文件中的内容 获得InputStream对象之后 通过InputStreamReader读入字符文本将读入的内容存储在StringBuffer中 转化为String TextBox程序实例 InputStreamsinr getClass getResourceAsStream resource text txt InputStreamReaderinr newInputStreamReader sinr try while count inr read buffer 0 buffer length 1 sb append buffer 0 count str sb toString catch IOExceptione TextBox程序实例 程序执行结果 中文文字的处理 在非中文系统中 模拟器中执行MIDlet应用程序时 读入的中文文本将显示为乱码 Sun的模拟器缺省情况下使用的是操作系统的编码方式因为操作系统是中文系统 因此在模拟器上使用中文没有任何问题 中文文字的处理 中文文字的处理 在实际设备上 MIDP2 0规范要求必须支持UTF 8编码方式 对其它编码方式没有要求必须支持 因此在某些实际设备上可能不支持使用GB2312编码的中文 读入的GB2312编码的中文文本将显示为乱码 中文文字的处理 中文编码 在计算机屏幕上看的的文字 不论是中文 英文或数字等 在计算机内部都有一个代码来表示操作系统将依据这些代码的编码规则 到相应的字体库内找到这些文字图像同一个代码在不同的编码规则下所文字图像是不同的如果代码的编码规则和字体库的编码规则不一致 屏幕显示的字体就会乱码 中文文字的处理 中文编码 例如同样一个中文字 大 在简体字的GB码中和采用繁体字BIG5码中所编定的代码就不一样如果GB码的 大 字误用BIG5码的字体库 屏幕显示的就不是 大 字所以进行文字处理时 操作系统必须知道当前的文字代码编码规则是什么 中文文字的处理 常见文字编码种类 ASCII 英文系统的数据只需数字 26个英文字母 包括大小写 标点与其它特殊符号即可 因此当时一个字节的大小只需7个比特位即可包含所有所需的信息 总共可容纳128个符号 ISO8859编码标准 考虑到欧洲的需求 例如拉丁文字 把ASCII编码长度扩大到8位 这就成了ISO8859的编码标准 中文文字的处理 Unicode 一个名为UnicodeConsortium的机构制订了国际化的文字编码系统unicode Unicode是采用16bit之编码方式 亦即每一个字都占了两个字节大小 而且对ASCII有向前的兼容性 Java语言在设计的时候就将文字的国际化考虑进去了 因此Java语言内代表文字的基本数据型态char的大小就是两个字节 并以unicode编码来表示文字 中文文字的处理 中文Windows操作系统中 采用的是GBK编码GBK编码兼容于GB2312编码 英文字和基本符号会以一个字节表示 中文字用两个以上的字节表示 如果实际的手机设备不支持GB2312编码 则应用程序不能正确的将GB2312编码方式的文字转化为unicode编码的文字 因此就不能正确显示出相应的中文 中文文字的处理 中文编码 Java程序中字符的文字编码总是采用unicode码运行Java程序时代码转换过程 以中文Window系统为例 若用GBK编码的文本却被当成UTF 8编码读入Java程序 再经编码转换后 仍被还原为GBK编码的文本 系统到UTF 8字体库取字型显示 必然导致乱码 中文文字的处理 中文编码 解决实际手机中文乱码的方法 以字符 两个字节 为单位 将中文字符读入Java程序先将用PC机编写的GBK编码的中文文本转换为以UTF 8编码的中文文本将转换后的中文文本提供给手机下载 安装和运行 中文乱码问题即可解决 中文文字的处理 前面的处理方法 InputStream类的read 方法 一次会读取一个字节在程序代码中的处理方式是每读取一个字节就转成char型态当作一个字符 中文文字的处理 在英文中是行得通的然而一个中文字是以两个以上的字节组成 如果把这两个字节拆开来将其视为独立的两个字就会出现乱码使用InputStreamReader类可以字符 二个字节 为单位读入数据 如InputStreamsinr getClass getResourceAsStream resource text txt InputStreamReaderinr newInputStreamReader sinr 但使用的编码方式不正确 仍然不能正确的显示中文文本 中文文字的处理 在MIDP2 0规范中 要求必须支持UTF 8编码 凡是符合MIDP2 0规范的实际设备都能够支持这种UTF 8编码方式解决中文显示乱码问题的思路 先把中文文字的GBK编码转成UTF 8编码在MIDlet程序中读入中文代码时 默认是将UTF 8转成unicode Java的默认编码 在输出中文代码时 默认是将unicode转成UTF 8屏幕显示中文时就不会乱码 中文文字的处理 J2SDK中提供一个工具软件叫native2ascii可以用来做编码转换将text txt文件的GBK编码转换为Unicode编码native2asciitext txttext unicode txt将unicode形式转换成UTF 8编码 native2ascii reverse encodingUTF 8text unicode txttext txt 中文文字的处理 InputStreamsinr getClass getResourceAsStream resource text txt try inr newInputStreamReader sinr UTF 8 while count inr read buffer 0 buffer length 1 sb append buffer 0 count catch UnsupportedEncodingExceptionie catch IOExceptione 中文文字的处理 如果要正确处理JAD内的中文内容也可以这么做因为大部分的Java手机也是以UTF 8的方式将JAD档读入处理 提示 即使程序能够在模拟器上调试通过 在实际设备上也可能不能调试通过 这主要是因为模拟器模拟的环境与实际设备还是在某些方面存在细微的差别 因此在实际程序设计过程中一定需要确切的了解这种差别 知道出现这种差别的原因 Form Form是Screen类的一个子类Screen的子类TextBox和List中不能再包含其他控件 TextBox和List要占据整个屏幕Form本身也要占据整个屏幕 但Form中可以包含其他控件这些控件都是Item的子类Form和Alert相当于一个容器 TextBox和List相当是一个控件 不是容器 Form Item类是可以包含在Form的各种控件的超类 Item常见子类有 可编辑文字域 TextField 日期编辑域 DataField 选择组件 choicegroup 指示器 gauge 只读文字域 StringItem 图像 ImageItem 空格域 Spacer 定制的Item CustomItem Form Form有两种构造方法 publicForm Stringtitle publicForm Stringtitle Item items 参数说明 Stringtitle Form的标题Item items 要加入的Item组件数组第一种构造方法是第二种构造方法的特例 参数items的值为null 相当只是创建一个空的Form对象实例 Form 每个的Item都有一个label域 一个索引值 还可以有命令和状态变化事件label域是一个附属于item的字符串 label一般显示在其item附近 通常是与item在同一行上 或者直接显示在item上面 Form 加入Form的Item子类控件 按加入顺序布局 先按从左往右布局再按从上往下布局AMS给加入Form的每个Item以索引值索引值表示Item在Form中的顺序位置在Form中 各个Item的索引值是连续设置的第一个item索引值为0 最后一个item的索引值为size 1size 为Form类的方法 返回Form所含Item项数值一个Item只能放置在一个Form中 要将某个item加入这个Form之前 必须将其从其它Form中删除 Form 可以采用以下几种方式将item加入到Form中追加方式插入方式替换方式 Form Form类中提供了三个追加item的方法 publicintappend Itemitem 在Form最后添加一个item publicintappend Imageimg 在Form最后添加一个ImageItem 等价于append newImageItem null img ImageItem LAYOUT DEFAULT null publicintappend Stringstr 在Form最后添加一个StringItem 等价于append newStringItem null str 添加新item后 Form的size 值自动加1 Form Form类中提供的插入方法为 publicvoidinsert intitemNum Itemitem 参数说明 intitemNum 要插入item的位置 即item的索引值 Itemitem 要插入的item功能 可以在索引值为itemNum的item之前插入一个item 如果itemNum值为size 插入的item将是Form最后一个item 与append 方法等价 Form Form类中提供的替换方法为publicvoidset intitemNum Itemitem 参数说明 intitemNum 要替换item的位置 即item的索引值 取值范围为 0 size 1 Itemitem 要替换的item功能 在itemNum处 用新item替换旧item Form Form是Displayable类的一个子类 可以通过在Form中加入命令来对用户输入的数据进行处理 同时 在Item中也可以加入命令 对Item的操作进行处理在Item中还可以对状态的改变 如TextField中字符发生变化 做出反应 Form Item状态的改变 MIDP提供了ItemStateListener监听器接口 对item状态改变事件的进行处理ItemStateListener中只有一个事件处理方法 publicvoiditemStateChanged Itemitem 当item的状态发生改变时 AMS会自动调用itemStateChanged 方法 Form Item状态的改变 要处理item状态改变事件 须定义事件监听器类 它必须包含下列操作实现ItemStateListener接口在类中重写itemStateChanged 方法在调用Form的以下方法进行注册 publicvoidsetItemStateListener ItemStateListenerl Form Item状态的改变 Item状态改变事件处理流程 事件监听 Form 在以下几种情况下 itemStateChanged 函数将会被调用 ChoiceGroup中改变了选择的值调整了可交互的Gauge的值输入或修改了TextField的值在DateField中输入了一个新的日期和时间调用了item的函数Item notifyStateChanged 但只有用户的动作导致的item状态的改变才会调用到itemStateChanged 函数 通过程序代码改变item状态时 不会调用到此函数 Form 与CommandListener类似 ItemStateListener只能在Form中安装一个如果已在Form设置过ItemStateListener 则新的ItemStateListener将会替换掉原先的ItemStateListener Item Item还提供了命令功能 可以使命令关联到单个的item上 Item类提供下列方法 publicvoidaddCommand Commandcmd 将命令加入到Item上publicvoidremoveCommand Commandcmd 将命令从Item中删除 publicvoidsetDefaultCommand Commandcmd 设置Item缺省命令 当item为焦点时 将激活该命令 其他命令通常以菜单方式提供若方法参数cmd为null 则删除以前安装的命令 Item Item要对命令做出响应 需要定义命令事件监听器类 它必须包含下列操作实现ItemCommandListener接口 在类中重写命令事件处理方法 publicvoidcommandAction Commandc Itemitem 在调用Item类的下列方法进行注册 publicvoidsetItemCommandListener ItemCommandListenerl 注意 与Displayable的命令事件的异同 Item Item在Form的布局是按顺序排放 先从左往右 再从上往下Item按设置的相关参数值进行水平对齐和垂直对齐占据Form的空间大小 按优先尺寸 进行换行占满行或列空间 Item 每个Item都有两个尺寸的概念 最小尺寸 minimumsize 优先尺寸 preferredsize 最小的尺寸是指Item为了实现其功能必须的大小尺寸 优先尺寸是基于Item的内容而言的 在优先尺寸下 Item的内容可以不用被剪切或者不需换行 这两尺寸都由具体设备设置 但优先尺寸可通过程序加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人家属楼租赁合同5篇
- 新成都市标准劳动合同范本4篇
- 美术材料购销合同范本
- 防水护栏安装合同范本
- 个人渔船雇员合同范本
- 多用途擦地机订购合同6篇
- 清洁与消毒管理培训考试试题及答案
- 知识竟赛数学题目及答案
- 知二求二题目及答案大全
- 商业地产投资项目管理方案落实方案
- 职场应用文高职PPT完整全套教学课件
- 垃圾焚烧发电项目电气安装与调试施工方案
- GB/T 42381.8-2023数据质量第8部分:信息和数据质量:概念和测量
- 设施蔬菜生产机械化技术
- LY/T 1821-2009林业地图图式
- JJF 1272-2011阻容法露点湿度计校准规范
- 液压与气压传动 第2版 马振福 高职课件0、1新
- 危化品安全管理学习课件
- SY∕T 7298-2016 陆上石油天然气开采钻井废物处置污染控制技术要求
- 突发事件处理记录表(标准范本)
- 磁敏传感器(品) 课件
评论
0/150
提交评论