[Java中级教程]第二讲 制作应用程序-----转

第二讲 制作应用程序

♦ 介绍

上一讲主要讲如何设置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

MIDP用户接口是由高级API和低级API组成。高级API通过高度的抽象强调封装性,对于控件外观提供有限的控制而不支持定义它们。
另一方面,低级API则能够完全控制应用程序的用户接口,能够直接访问输入装置。但是,由于显示屏大小和按键数的不同而经常出现不同的固有装置,就会降低低级API的移植性能。

♦ 1-2-1 Displayable和Display

MIDP的用户接口的基本设置是Display类和Displayable类。用Displayable的对象表示画面本身,Display 的对象是控制这个画面的 display manager。

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

为了能利用画像数据,使用Image 对象。Image的对象能在Canvas上绘画。能够配置在Form,Alert,List,ChoiceGroup等要素中。
要制作Image 对象应先使用Image.createImage方法。
在N800上能处理png format画像文件。

♦ 高级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,分为交互对话和非交互对话两种。交互对话情况下,用户自己能够变更值,但在非交互对话时,只能从应用程序方操作值。

interactivenoninteractive

♦ 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]命令转换到运算符选择画面,选择[=]后,就会出现计算結果。
以下是简单的画面指示图。

图:计算应用程序的画面顺序

♦ 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,””)。

用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制作表格应用程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值