高级api♦ 2-1 运用高级api(screen子类)
♦ 2-1-1 list
list是实现choice的接口,是能够实现多种选择的组件在screen的子类中。用以下的构造函数去创建一个list对象。
• list(string title,int listtype)
• list(string title,int listtype,string[] stringelements,image[] imageelements)
第一个构造函数是用来创建初始化为空的list的,以后list中元素是可添加的。第二个构造函数可用来直接初始化list中元素的。
根据选择方式不同,list分为3类。根据需要可选择任一种类型。
| exclusive | 仅能选择其中一项 |
| implicit | 目标项一旦选定立即执行 |
| multiple | 同时可选择多项 |
 |  |
| listtype:exclusive | listtype:implicit |
|
| listtype:multiple |
♦ 2-1-2 textbox
textbox是screen的子类。用下面的构造函数对输入的文本内容进行编辑: textbox(string title,string text,int maxsize,int constraints) 用maxsize指定最大的输入范围、必要时用constraints参数限制输入。下列各项 textbox的参数可用来特定的输入。
| any | 能够输入任意的text |
| emailaddr | 能够输入 e-mail地址 |
| numeric | 能够输入整数值 |
| phonenumber | 能够输入除电话号码和数值以外的文字。(能够输入的文字依照机种而定) |
| url | 能够输入url |
| |
| textbox |
♦ 2-1-3 alert
alert是screen的子类。它是用来为用户给出提示信息或者图片信息的,当出现异常的时候。以下是它的构造函数:
• alert(string title)
• alert(string title,string alerttext,image alertimage,alerttype alerttype)
用以下的方法设定时间的改变:
• settimeout()
对于固定的时间,用以下的方法设定:
• settimeout(alert.forever)
alert超时后迁移到如下画面。应用程序必须知道alert超时后要迁移的位置。所以alert作为现在的画面设定时,必须同时指定其迁移位置。此时,要按如下方式设定。
• display.setcurrent(alert alert , displayable nextdisplayable)
表示alert种类的是alerttype。alerttype是null,或者是能设定事先在alerttype上定义的alarm,confirmation,error,info,warning。
| |
| alert |
♦ 2-1-4 form
form是能够画像、text、选择项等的item进行复数配置的screen子类。item的配置布局几乎全是纵向布局。下面是它的构造函数:
• form (string title)
• form (string title, item[] items)
在form上增加item时,请使用append方法。
• append(item item)
• append(image img)
• append(string str)
♦ 2-2 高级api的使用(item子类)
♦ 2-2-1 item
item是一个父类,它的组件能够在form上添加。item的层次结构如下图所示。
图:item类的层次结构图
一个item只能配置在一个form中,当一个item插入一个新的form时,在原先的form中应用程序就会首先删除它。
♦ 2-2-2 choicegroup
如list所述是实现项目选择的item子类。同list一样为了能实际安装上choice接口, 要类似list。
|  |
| exclusive | mutiple |
♦ 2-2-3 textfield
textfield是用户输入和修改text的item。分textbox的输入限制和尺寸上的限制。获取和修改文字列的方法和textbox一样。
♦ 2-2-4 imageitem
imageitem是能够表示画像的item。imageitem能表示并布局画像,所以在制作imageitem时要指定layout,为此参数要按如下表所示。
| layout_default | 使用画像container的默认设置。 |
| layout_left | 画面的左端 |
| layout_right | 画面的右端 |
| layout_center | 画面的中央 |
| layout_newline_before | 前一画面 |
| layout_newline_after | 后一画面 |
♦ 2-2-5 gauge
gauge是和进程条一样在用户接口上用条状图表示赋予值的item,分为交互对话和非交互对话两种。交互对话情况下,用户自己能够变更值,但在非交互对话时,只能从应用程序方操作值。
|  |
| interactive | noninteractive |
♦ 2-2-6 stringitem
stringitem是表示指定文本的item。在form中能够直接显示字符串,但在使用stringitem时,面板也能被显示在表单。
♦ 2-2-7 datefield
datefield是表示年月日和时刻信息的item。有以下3种方式在创建datefield时。
| date | 设定年月日的信息。 |
| time | 设定时刻的信息。 |
| date_time | 设定年月日和时刻。 |
|  |
| 日期 | 时间 |
♦ 2-3 事件操作
midp应用程序中,有两个接口可用于响应用户的输入。一个是item进行处理事件的itemstatelistener,另外一个是command进行处理事件的commandlistener。
♦ 2-3-1 command
命令包含了与事件有关的信息。当一个命令被激活时,事件启动,然后把命令传给事件监听对象进行处理。他的构造函数如下:
• command(string label,int commandtype,int priority)
commandtype是用来识别command种类的。有back, cancel, help, exit, item, ok, screen, stop。如果不定义back,将无法返回到先前的画面。
♦ 2-3-2 commandlistener
这个接口处理命令事件。命令事件被处理时,相应的类应该实现这个接口。用commandaction方法处理事件。
• commandaction(command c, displayable d)
displayabled是事件源。事件是表示发生后的displayable。在应用程序中,有的displayable a 的command exit作动过程中所记述的事件处理状况,要使用如下说记述的if文。
public void commandaction(command c,displayable d){ if(d == a && c == exit){ 记述处理 } }
|
进行事件处理时,事件监听器应该列出在显示面板上:
• displayable.setcommandlistner(commandlistener )
♦ 2-3-3 itemstatechanged事件
在form画面中,修改textfield的内容和更改choicegroup选择等情况下,用户在更改交互对话的item时,就会产生itemstatechanged事件。在应用程序中,即使更改值,也不会产生itemstatechanged事件。
♦ 2-3-4 itemstatelistener
想获取itemstatechanged事件,就有必要先实现itemstatelistener。此外,与command事件时一样,有必要先在form上添加itemstatelistener。
• form.setitemstatelistener(itemstatelistener)
实现上要使用itemstatechanged方法处理 itemstatechanged事件。
• itemstatechanged(item item)
被传递的item是变更状态之后的item。特定并处理要变更哪个item时,要使用如下所记述的form的get方法。根据在form上指定附加的item的号码能够获取get方法。此时的号码就变成了被附加的序号0、1、2…
public void itemstatechanged(item item){ if(item == form.get(0){ 记述处理 } }
|
制作应用程序现在我们来制作应用程序吧!这次制作的是简单计算应用程序。按以下工作流程进行。
1. 决定应用的方法
2. 制作各个画面
3. 制作画面的迁移
4. 实现应用的逻辑
♦ 3-1 简易计算应用程序的制作
首先进入主题画面,按[start]后,就会出现应用程序的说明。随后按下[done],就进入主画面了,在主画面中,有输入界面、显示计算结果部分、演算表格部分等。在进行计算时,首先要在输入界面输入数值,再用[operator]命令转换到运算符选择画面。选择运算符后再返回到主画面,之后再继续在输入界面中输入数值。用[operator]命令转换到运算符选择画面,选择[=]后,就会出现??算?y果。
以下是简单的画面指示图。
 |
| 图:计算应用程序的画面顺序。 |
♦ 3-2 制作应用程序的大框架
midp应用程序必须要继承midlet。执行命令时也要实现javax.microedition.lcdui.commandlistener。
下面的方法必须被覆盖:
• startapp()
• pauseapp()
• destroyapp(boolean unconditional)
• commandaction(command command , displayable displayable)
♦ 3-3 制作画面
♦ 3-3-1 主题画面
在主题画面中,用form显示一个简单的主题画面。首先,用titleform定义一个对象变量。
为了要在form上出现画像,要创建image的对象。用image.createimage方法。其次,创建imageitem对象。可用下面的构造函数创建:
imageitem imgitem = new imageitem(“”,img,imageitem.layout_center,””)。
用append方法去指定图片在表单中的位置。应用程序的创建步骤按如下。
//制作主题画面 titleform = new form("n800 calculator"); titleform.setcommandlistener(this);
//指定画像位置 try { image img = image.createimage("/title.png"); imageitem imgitem = new imageitem("", img, imageitem.layout_center, "") titleform.append(imgitem); } catch (exception e) { }
|
其次,指定要用的命令。对于对象变量,分别定义start命令、quit命令以及exit命令。
private command start = new command("start", command.ok, 1);
|
private command exit = new command("exit", command.exit, 1);
|
当命令被指定时,用addcommand方法去添加:
//指定命令 titleform.addcommand(start); titleform.addcommand(exit);
|
♦ 3-3-2 应用程序画面的说明
用alert创建应用程序画面的说明。
//应用程序的说明画面 alert = new alert("", "this is n800 calculator.please input number and select operator.", null, alerttype.info);
|
♦ 3-3-3 主画面
在主画面中,用stringitem表示计算的结果和运算符。以及输入数值的textfield。 textfield为输入数值框,数字输入的限制用textfield.numeric。
//创建主画面 main = new form("n800 calculator"); main.setcommandlistener(this); //设置命令 main.addcommand(exit); main.addcommand(operatorchoice); //设置计算结果显示部分 stringitem answerstr = new stringitem(" ", ""); //计算结果 main.append(answerstr); //设置运算符显示部分 stringitem operatorstr = new stringitem(" ", ""); main.append(operatorstr); //设置输入界面 textfield input = new textfield("input", "0", 8, textfield.numeric); main.append(input);
|
♦ 3-3-4 操作符选择画面
用list实现操作符的选择。
operatorlist =new list("operator list",list.implicit,operatorstrings,null); operatorlist.setcommandlistener(this);
|
♦ 3-3-5 应用程序开机画面
画面制作完成后,实际演示后却什么都没有。这是由于并没有指定应用程序开始时的画面。按照以下记述,用startapp()方法中的display.setcurrent方法指定应用程序的开始画面。
/** *应用程序开始时的处理 */ public void startapp() throws midletstatechangeexception { //能表示主题画面 display.setcurrent(titleform); }
|
♦ 3-4 命令处理和待机迁移
即使出现主题画面,也不能设定后面的画面转换,所以只能出现主题画面。在命令处理部分设定画面迁移。所有命令的处理过程在commandaction方法中都被定义。
♦ 3-4-1 从说明主题画面进入应用程序画面
在说明主题画面中按[start]时,用setcurrent方法向下面的应用程序画面转换。画面转换,由于要用alert在应用程序说明画面上进行实际安装,所以与其他情况下的画面转换略有不同。因此,出现alert之后,要将他迁移到主画面,成为display.setcurrent(alert, main)。
if (displayable == titleform) { if (command == start) { display.setcurrent(alert, main); } } |
♦ 3-4-2 从应用程序的说明画面进入主画面
从应用程序的说明画面进入主画面,用setcurrent方法显示应用程序的说明画面时,将下面的迁移设定为主画面,没有必要再另外设定。
♦ 3-4-3 从主画面进入运算符选择画面
要从主画面选择运算符,用[operate]命令进入运算符选择画面。用display.setcurrent方法设定。
if (displayable == main) { if (command == operatorchoice) { display.setcurrent(operatorlist); } } |
♦ 3-4-4 从运算符画面进入主画面
选择运算符后就开始计算,必须在主画面显示运算结果。在list object中选择要素时,静止的command select_command 会动,而且能产生命令事件。所以,得到list命令时,下面记述的就是list.select_command命令。
if (displayable == operatorlist && command == list.select_command) { //向主画面迁移 display.setcurrent(main); }
|
这样,就完成了画面的迁移。
♦ 3-5 计算处理
计算处理是应用程序所必须的。首先,使用选择的运算符,表示和计算输入后的数值。应用程序作为事例变数,有tmp和operator。tmp保持计算后得出的结果,operator保持选择的演算符。用 showanswer方法表示实际的计算和计算结果。使用form和get 方法可以获得stringitem和textfield, form中附加的序号是从0开始,用get方法指定该号码能够获得item。
/** * 表示计算结果 。 */ public void showanswer() {
//获得stringitem,textfield stringitem answerstr = (stringitem) main.get(0); textfield tf = (textfield) main.get(2); int num = integer.parseint(tf.getstring()); //获得输入的值
//计算 switch (operator) { case 0 ://加法 tmp = tmp + num; break; case 1 : //减法 tmp = tmp - num; break; case 2 ://乘法 tmp = tmp * num; break; case 3 ://除法 tmp = tmp / num; break; default : //选择"="时 tmp = num; //照原样输入值 break; }
//表示计算结果 answerstr.settext(string.valueof(tmp)); //刚开始输入textfield tf.setstring("0"); }
|
♦ 3-6 运算符的选择
当选择演算符的时候就执行运算。把选择的演算符,必须保存在operator变量中。我们将在以下if语句中实现上面的操作。
if (displayable == operatorlist && command == list.select_command) { //获得stringitem stringitem si = (stringitem) main.get(1); switch (operatorlist.getselectedindex()) { case 0 : showanswer(); si.settext("+"); operator = 0; break; case 1 : showanswer(); si.settext("-"); operator = 1; break; case 2 : showanswer(); si.settext("*"); operator = 2; break; case 3 : showanswer(); si.settext("/"); operator = 3; break; case 4 : showanswer(); si.settext(""); tmp = 0; break; default : break; } //向主画面迁移 display.setcurrent(main); }
|
♦ 3-7 实际操作
下面运行一下这个简易的计算应用程序。
|  |
| 1.主题画面 | 2.应用程序的说明 |
|  |
| 3.主画面 | 4.选择演算符 |
|
| 5.表示计算结果 |
♦ 下一讲
在本讲中,主要讲述了怎样利用高级api制作简单的计算程序。下一讲将向各位介绍如何利用低级的api制作表格应用程序。