第二讲 制作应用程序
♦ 介绍
上一讲主要讲如何设置N800的JAVA应用程序的开发环境。这一讲则主要讲述如何利用MIDP的高级API制作简单的计算应用程序。
♦ 基本的用户接口
Displayable | 表示MIDP上的画面 |
Display | 控制画面的display manager |
Image | 表示画像的数据 |
Screen | 预先定好结构,不能再增加其他component的画面父类 |
List | 选择画面。Screen子类 |
TextBox | 输入TEXT的画面。Screen子类 |
Alert | 向用户传达例外状况的画面。Screen子类 |
Form | 能复数配置部分的画面。Screen子类 |
ItemItem | 配置在Form上的部分父类。 |
ChoiceGroup | 选择的Item |
TextField | 输入TEXT的Item |
ImageItem | 表示画像的Item |
Gauge | 表示Gauge的Item |
StringItem | 表示文字列的Item |
DateField | 表示年月日和时刻信息的Item |
Command | 软键 |
CommandListener | 处理Command的接口 |
ItemStateChangedListener | 处理ItemStateChanged的接口 |
♦ 1-2 高级API和低级API
♦ 1-2-1 Displayable和Display
Displayable有下述3个种类。
Screen | 预先定好结构,不能再增加其他的component。(TextBox,List等) |
Form | 不通用的Screen可能会导致TEXT、画像、Item混杂 。 |
Canvas | 能够控制图表的表示,能够完全访问低级的事件。 |
图:Displayable的层次结构
MIDP应用程序中,Display自当别论,一个MIDlet里必须得有一个Display的对象。用Display.getDisplay()能够得到Display的对象。利用Display.setCurrent(Displayable nextDisplayable)等方法能够切换画面。
♦ 1-2-2 Image
♦ 高级API
♦ 2-1 运用高级API(Screen子类)
♦ 2-1-1 List
• List(String title,int listType)
• List(String title,int listType,String[] stringElements,Image[] imageElements)
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(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){ 记述处理 } } |
♦ 制作应用程序
现在我们来制作应用程序吧!这次制作的是简单计算应用程序。按以下工作流程进行。
♦ 3-1 简易计算应用程序的制作
图:计算应用程序的画面顺序 |
♦ 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定义一个对象变量。
private Form titleForm; |
为了要在Form上出现画像,要创建Image的对象。用Image.createImage方法。其次,创建ImageItem对象。可用下面的构造函数创建:
ImageItem imgItem = new ImageItem(“”,img,ImageItem.LAYOUT_CENTER,””)。
//制作主题画面 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制作表格应用程序。