MIDlets中GUI(图形)编程
1. 概述
MIDP为运行在MIDP容器中的MIDP应用定义了一个API,此API本身是建立在CLDC API之上的。MIDP用户接口API的Java类设计不是基于Java Abstract Window Toolkit(AWT)类的,而是为移动电话这类小型移动信息设备特别设计的。这类设备只有有限的屏幕尺寸和键盘性能。当程序员采用MIDP编写图形应用时,他们只能使用MIDP或CLDC API。
2. MIDP GUI类
1)所有MIDP GUI类都是javax.microedition.lcdui包的组成部分。
2)MIDP用户接口的基本抽象图形是屏幕,Screen类对面向设备的图形和用户交互进行了封装。每次应用只能显示一个屏幕。
3)MIDP API具有”高级(high-level)”和”低级(low-level)”UI类。
高级UI-----例如Form,List,TextBox,TextField,Alert和Ticker具有设备适配功能,它对图象,文本,文本域以及单选按钮等进行支持。
低级UI-----例如Canvas类允许操作者任意绘画。
3. MIDP GUI中主要的类
1) Graphics类-----提供了用来绘画2D几何对象的Graphics对象。
javax.microedition.lcdui.Graphics类不是在MIDlet中显式创建的,表示抽象画面的Canvas类在MIDP GUI编程中提供了paint()方法,piant()方法取类型为Graphics的一个参数,用此参数实现MIDlet中Graphics类的功能。
2) Displayable类-----是一个抽象类 ,Displayable对象处理MIDlet的GUI输出.它有两个派生类javax.microedition.lcdui.Canvas和javax.microedition.lcdui.Screen。
3) Canvas类-----Canvas类允许操作者任意绘画,与Graphics类都是低级UI.由Graphics类类提供的方法总是在Canvas类的派生类中使用的。
4) Screen类-----是高级UI,Form,List,TextBox,Alert类都是它的派生类。
4. 下面是Graphics类用法的一段代码:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MidpGraphics extends MIDlet implements CommandListener
{
Display display;
testCanvas canvas;
public MidpGraphics()
{
display=Display.getDisplay(this);
canvas=new testCanvas();
}
public void startApp() throws MIDletStateChangeException
{
display.setCurrent(canvas);
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional) throws MIDletStateChangeException
{
}
public void commandAction(Command c,Displayable d)
{
}
}
class testCanvas extends Canvas
{
public void paint(Graphics g)
{
//创建字体对象
Font font=Font.getFont
(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
//设定字体对象
g.setFont(font);
//绘画出文本
g.drawString("Hello MIDP",getWidth()/2,getHeight ()/2,Graphics.HCENTER|Graphics.TOP);
try
{
//绘画出图像
Image image=Image.createImage("myimage.png");
g.drawImage(image,0,0,Graphics.HCENTER|Graphics.TOP);
}
catch(Exception e)
{
}
}
}
----------------------------运行效果就是在屏幕的中心显示文本”Hello MIDP”。
5.用MIDlet编程来实现SaveMyMoney银行应用的不同图形用户界面实例代码:
1) 任务陈述:第一屏幕显示包含名为Balance Enquiry(当前余额),Fixed Deposit Enquiry(定期储蓄),Check Status Enquiry(支票状况)项的菜单
当用户选择Balance Enquiry应显示进度指示器
当用户选择Fixed Deposit Enquiry应显示进度指示器
当用户选择Check Status Enquiry应显示打入支票号的TextBox
当用户打入支票号后应显示进度指示器
2.代码如下:
// 导入lcdui和Midlet包
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
// 定义扩展MidpGui类的MIDlet类
public class MidpGui extends MIDlet implements CommandListener
{
// 由Display类创建显示管理器
Display display;
// 定义窗体对象
Form form = new Form("Container Form");
// Screen类派生的
// 定义列表(主菜单)
List menu;
// 定义文本框
TextBox input;
// Item类的组件 (Gauge类表示显示屏幕上的一个条形图)
Gauge gauge = new Gauge("Your enquiry is being processed", false, 100, 30);
// 定义来自Command类的命令
static final Command okCommand = new Command("OK",Command.OK,1);
static final Command backCommand = new Command("Back",Command.BACK,0);
static final Command exitCommand = new Command("Exit", Command.STOP,2);
String currentMenu; // 定义串变量以标识当前的窗体名
public MidpGui()
{
}
/**
* The startApp() starts the MIDlet, creates a list of items and
* Uses the EXIT command */
public void startApp() throws MIDletStateChangeException
{
// 得到display对象
display = Display.getDisplay(this);
// 创建初始菜单并加入项
menu = new List("Enquiries", Choice.IMPLICIT);
menu.append("Current Balance ", null);
menu.append("Fixed Deposit ", null);
menu.append("Check Status ", null);
// 加入Exit命令到窗体
menu.addCommand(exitCommand);
menu.setCommandListener(this);
// 调用mainmenu方法,设置初始屏幕
mainMenu();
// 加入计量组件到窗体
form.append(gauge);
}
// mainMenu 方法
void mainMenu()
{
display.setCurrent(menu);
currentMenu = "Main";
}
public void pauseApp() {
form = null;
display = null;
menu = null;
input = null;
gauge = null;
}
// 当MIDlet被撤消是调用
public void destroyApp(boolean unconditional) throws MIDletStateChangeException
{
notifyDestroyed();
}
//显示TextBox组件
public void showTextBox()
{
input = new TextBox ("Enter the Check Number:", "", 20, TextField.ANY);
input.addCommand(backCommand);
input.addCommand(okCommand);
input.setCommandListener(this);
input.setString("");
display.setCurrent(input);
currentMenu = "input";
}
//显示进度指示器屏幕
public void showForm()
{
form.addCommand(backCommand);
form.setCommandListener(this);
display.setCurrent(form);
currentMenu = "form";
}
//命令激活
public void commandAction(Command c, Displayable d)
{
String label = c.getLabel();
if (label.equals("Exit"))
{
try{
destroyApp(true);}
catch (Exception e){}
}
else if (label.equals("Back"))
{
if(currentMenu.equals("input") || currentMenu.equals("form"))
{
// go back to menu
mainMenu();
}
}
else
{
if (label.equals("OK"))
{
showForm();
}
else
{
List down = (List)display.getCurrent();
switch(down.getSelectedIndex())
{
case 0: showForm();break;
case 1: showForm();break;
case 2: showTextBox();break;
}
}
}
}
}
注:所有类及方法的说明可以查看J2ME doc.路径为x:\WTK104\docs\api