《第6章 MIDP 高级界面编程68446.ppt》由会员分享,可在线阅读,更多相关《第6章 MIDP 高级界面编程68446.ppt(102页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章 MIDP 高级界面编程 任柯E_mail:J2ME移动应用开发移动应用开发电子讲义电子讲义1n n6.1 LCDUI6.1 LCDUI体系结构概述体系结构概述n n6.26.2高级用户界面编程基础高级用户界面编程基础n n6.3 Command6.3 Command处理机制处理机制n n6.4 Screen6.4 Screen对象对象n n6.5 List6.5 List组件组件n n6.6 6.6 TextBoxTextBox组件组件n n6.7 Alert6.7 Alert组件组件n n6.8 Form6.8 Form类类n n小结小结26.1 LCDUI体系结构概述n n为适应种
2、类繁多的移动信息设备,CLDC本身没有定义任何GUI功能,而是由J2ME将所有与界面相关的类库都定义在简表(例如MIDP)中,这样在更大程度上包含了保证了界面类库的适应性。36.1.1 LCDUI 工作模型工作模型n n第一步:为了在MIDP 设备上显示信息,需要取得设备的显示屏幕。Display对象代表的是移动设备显示屏幕,每个MIDlet 都有且仅有 Display 对象的一个实例。Display 对象实质上是设备显示屏的管理程序,它控制在设备上显示什么内容。在J2ME程序中只有一个Display的引用,通过静态方法Display.getDisplay(MIDlet midlet)得到。4
3、n n第二步:通过第二步:通过DisplayDisplay的应用程序,开发人员可以得到当前的应用程序,开发人员可以得到当前设备屏幕的一些信息,比如色彩,但是最常用的方法是通设备屏幕的一些信息,比如色彩,但是最常用的方法是通过过DisplayDisplay的的setCurrentsetCurrent()()方法将抽象屏幕对象绑定到当前设方法将抽象屏幕对象绑定到当前设备屏幕上来显示。图形用户界面开发中更多的工作是实现备屏幕上来显示。图形用户界面开发中更多的工作是实现抽象屏幕对象,由抽象屏幕对象封装和管理实现程序与用抽象屏幕对象,由抽象屏幕对象封装和管理实现程序与用户之间交互的图形界面组件如文本框、
4、选择框列表等。当户之间交互的图形界面组件如文本框、选择框列表等。当使用高级图形使用高级图形APIAPI时,抽象屏幕由时,抽象屏幕由javax.microedition.lcdui.Screenjavax.microedition.lcdui.Screen对象代表,当使用低级屏幕对象代表,当使用低级屏幕APIAPI时,抽象屏幕由时,抽象屏幕由javax.microedition.lcdui.canvasjavax.microedition.lcdui.canvas对象代对象代表。应用程序可以包含几个抽象屏幕对象,不过某一时间表。应用程序可以包含几个抽象屏幕对象,不过某一时间只能在显示器上显示一个
5、屏幕(或者说只有一个当前屏幕)只能在显示器上显示一个屏幕(或者说只有一个当前屏幕)。5图图61 LCDUI体系结构体系结构图图61 LCDUI体系结构体系结构6n n为了实现可移植性,高层为了实现可移植性,高层API API 进行了高度抽象,在界面外进行了高度抽象,在界面外观上提供的控制很少。例如,不允许定义高层组件的视觉观上提供的控制很少。例如,不允许定义高层组件的视觉外观(形状、颜色或字体),与组件之间的大多数交互都外观(形状、颜色或字体),与组件之间的大多数交互都被实现封装,即由底层实现而不是应用程序完成对设备硬被实现封装,即由底层实现而不是应用程序完成对设备硬件和本地用户界面类型的适应
6、工作。件和本地用户界面类型的适应工作。n n因此,如果使用高级因此,如果使用高级APIAPI,那么用户界面就具有较高移植,那么用户界面就具有较高移植性。但是高级性。但是高级APIAPI提供的组件都会由底层的虚拟机直接映提供的组件都会由底层的虚拟机直接映射到该设备的本地用户界面,所以程序开发人员无法决定射到该设备的本地用户界面,所以程序开发人员无法决定最终显示到设备屏幕上时组件的颜色、字型和外观,因为最终显示到设备屏幕上时组件的颜色、字型和外观,因为这些细节都是由系统决定,程序开发人员对画面的控制程这些细节都是由系统决定,程序开发人员对画面的控制程度相对较低。另外,采用高级度相对较低。另外,采用
7、高级APIAPI开发的用户界面,与用开发的用户界面,与用户的交互都会户的交互都会遵循该移动设备既有用户界面的操作方式遵循该移动设备既有用户界面的操作方式。所以,采用高级用户界面开发的应用,所以,采用高级用户界面开发的应用,如果发布到不同类如果发布到不同类型的移动设备上,用户界面的外观和交互方式出现一些差型的移动设备上,用户界面的外观和交互方式出现一些差异是很正常的异是很正常的。7n n使用低级使用低级APIAPI开发应用就相对复杂。低层开发应用就相对复杂。低层APIAPI提供提供很少的抽象。使用它们的应用程序需要精确地布很少的抽象。使用它们的应用程序需要精确地布局和控制图形元素,同时还需要访问
8、低层输入事局和控制图形元素,同时还需要访问低层输入事件。件。使用低级使用低级APIAPI时,将对移动设备的显示屏幕具时,将对移动设备的显示屏幕具有完全的控制权有完全的控制权,同时也能够决定用户该如何与,同时也能够决定用户该如何与程序交互,因此程序开发人员考虑的细节就比较程序交互,因此程序开发人员考虑的细节就比较多。由于每种设备都有不同的特性(不同的操作多。由于每种设备都有不同的特性(不同的操作方式、颜色和大小),因此一旦采取低级方式、颜色和大小),因此一旦采取低级APIAPI,程,程序的可移植性将大大降低,将不再保证程序可以序的可移植性将大大降低,将不再保证程序可以在不同的机器上执行。在不同的
9、机器上执行。86.2高级用户界面编程基础n n6.2.1 Display对象 MIDP使用Display对象进行用户界面的管理,负责与应用程序管理器进行交互。Display代表了系统显示屏和输入设备的管理器,包含用来获取设备属性的方法,以及请求在设备上显示抽象屏幕对象的方法。9表表61 Display对象常用方法对象常用方法方法名称方法说明void callSerially(Runnable r)用来序列化事件流,使Runnable 对象r 的run方法在重画周期完成后马上运行Displayable getCurrent()获得MIDlet的当前Displayable对象static getD
10、isplay(MIDlet m)获得MIDlet唯一的Display对象Boolean isColor()获得设备所支持的彩色信息int numColors()获得设备表示的彩色数或灰度级void setCurrent(Alert a,Displayable d)请求设置alert对象为当前显示对象,alert解除后将Displayable对象设置为当前显示对象void setCurrent(Displayable d)请求将Displayable对象设置为当前显示对象public boolean flashBacklight(int duration)控制屏幕背景灯闪烁public bool
11、ean vibrate(int duration)控制手机震动10n程序程序61:DisplayTest.java1.package chap6;2.import javax.microedition.lcdui.Display;3.import javax.microedition.midlet.MIDlet;4.import javax.microedition.midlet.MIDletStateChangeException;5.public class DisplayTest extends MIDlet 6.Display display=null;7.public Display
12、Test()8.super();9.10.protected void startApp()throws MIDletStateChangeException 11.display=Display.getDisplay(this);12.int colors=display.numColors();13.boolean iscolor=display.isColor();14.boolean s=display.flashBacklight(2500);15.if(!s)16.System.out.println(您的设备不支持背景灯控制您的设备不支持背景灯控制);17.s=display.v
13、ibrate(500);18.if(!s)19.System.out.println(您的设备不支持震动您的设备不支持震动);20.if(iscolor)21.System.out.println(您的设备是彩色显示设备您的设备是彩色显示设备);22.else23.System.out.println(您的设备不是彩色显示设备您的设备不是彩色显示设备);24.System.out.println(您的设备支持您的设备支持+Integer.toString(colors)+种颜色种颜色);25.26.protected void pauseApp()27.28.protected void de
14、stroyApp(boolean arg0)throws MIDletStateChangeException 29.30.11126.2.2 Displayable对象对象n n在显示屏设备上显示的用户界面对象为Displayable对象,在同一时刻应用程序最多只能有一个Displayable对象,这个Displayable对象显示在显示屏设备上,并通过它与用户进行交互,这个被引用的Displayable对象被称为当前Displayable对象。从图 61可知,所有的GUI组件都实现了抽象类Displayable。13n程序程序62:DisplayableTest.java1.package
15、 chap6;2.import javax.microedition.lcdui.Display;3.import javax.microedition.lcdui.Form;4.import javax.microedition.midlet.MIDlet;5.import javax.microedition.midlet.MIDletStateChangeException;6.public class DisplayableTest extends MIDlet 7.Display display=null;8.Form f;9.public DisplayableTest()10.s
16、uper();11.12.protected void startApp()throws MIDletStateChangeException 13.display=Display.getDisplay(this);14.f=new Form(Displayable测试测试);15.display.setCurrent(f);16.17.protected void pauseApp()18.19.protected void destroyApp(boolean arg0)throws MIDletStateChangeException 20.21.14156.2.3 Ticker对象对象
17、n nTicker对象实现了在屏幕上连续滚动的滚动条或小段文本。n nTicker 与在本节讨论的其他组件有一些不同,它不是 Screen 的子类。相反,它是在Displayable 类中定义的一个变量。因此,所有从Displayable派生出的对象都可以显示一个Ticker。因此Ticker既可以使用在高级用户界面API中,也可以使用在低级用户界面API中。16n程序程序63 TickerTest.java1.import javax.microedition.lcdui.Display;2.import javax.microedition.lcdui.Form;3.import java
18、x.microedition.lcdui.Ticker;4.import javax.microedition.midlet.MIDlet;5.import javax.microedition.midlet.MIDletStateChangeException;6.public class TickerTest extends MIDlet 7.Display display=null;8.Form f;9.public TickerTest()10.super();11.f=new Form(Ticker 测试测试);12.13.protected void startApp()throw
19、s MIDletStateChangeException 14.display=Display.getDisplay(this);15.f.setTicker(new Ticker(你好你好.);16.display.setCurrent(f);17.18.protected void pauseApp()19.20.protected void destroyApp(boolean arg0)throws MIDletStateChangeException 21.22.17186.3 Command处理机制n nMIDPMIDP定义了抽象的定义了抽象的CommandCommand机制来实现
20、与设备的机制来实现与设备的命令交互接口,而具体的实现根据与该设备相适命令交互接口,而具体的实现根据与该设备相适合的机制来提供支持。合的机制来提供支持。n n对于开发者来说,对于开发者来说,CommandCommand对象就类似于普通对象就类似于普通GUIGUI编程的编程的buttonbutton,可以设定其标题,如确定、取,可以设定其标题,如确定、取消等。当用户调用该消等。当用户调用该CommandCommand时,应用程序会做时,应用程序会做出适当的响应。而具体出适当的响应。而具体CommandCommand如何在屏幕上显如何在屏幕上显示以及如何与具体设备的按键等建立联系是示以及如何与具体设
21、备的按键等建立联系是MIDPMIDP实现的责任,开发者不需要考虑实现的责任,开发者不需要考虑 n nCommandCommand既适用于高级既适用于高级API(ScreenAPI(Screen类类),又适用于,又适用于低级低级API(CanvasAPI(Canvas类类)19n nCommandCommand类有两种构造函数,一个有三个参数,另一个则类有两种构造函数,一个有三个参数,另一个则是四个参数。区别在于:前者第一个参数是显示在画面上是四个参数。区别在于:前者第一个参数是显示在画面上名称,第二个参数是命令的类型,第三参数是优先权,以名称,第二个参数是命令的类型,第三参数是优先权,以自然数
22、形式表示,如:自然数形式表示,如:1 1,2 2,33,越小优先权越高,代,越小优先权越高,代表表CommandCommand将在屏幕越显眼的地方显示。而后者则是在前将在屏幕越显眼的地方显示。而后者则是在前者的基础上增加了一个长命令的参数,具体位置位于前者者的基础上增加了一个长命令的参数,具体位置位于前者第一和第二个参数之间。第一和第二个参数之间。n nCommandCommand的类型共分为的类型共分为8 8种:种:Command.BACKCommand.BACK,ommand.EXITommand.EXIT,Command.CANCELCommand.CANCEL,Command.HELP
23、Command.HELP,Command.ITEMCommand.ITEM,Command.OKCommand.OK,Command.SCREENCommand.SCREEN,Command.STOPCommand.STOP。20n n程序程序程序程序6 64 4:CommandTest.javaCommandTest.java1.1.import import javax.microedition.lcdui.Commandjavax.microedition.lcdui.Command;2.2.import import javax.microedition.lcdui.Displayja
24、vax.microedition.lcdui.Display;3.3.import import javax.microedition.lcdui.Formjavax.microedition.lcdui.Form;4.4.import import javax.microedition.midlet.MIDletjavax.microedition.midlet.MIDlet;5.5.import import javax.microedition.midlet.MIDletStateChangeExceptionjavax.microedition.midlet.MIDletStateCh
25、angeException;6.6.public class public class CommandTestCommandTest extends extends MIDletMIDlet 7.7.private Display private Display displaydisplay;8.8.public public CommandTestCommandTest()()9.9.super();super();10.10.11.11.protected void protected void startAppstartApp()throws()throws MIDletStateCha
26、ngeExceptionMIDletStateChangeException 12.12.display=display=Display.getDisplay(thisDisplay.getDisplay(this););13.13.Form f=new Form f=new Form(CommandForm(Command测试测试测试测试););14.14.Command c1=new Command(Comm_1,Command.BACK,2);Command c1=new Command(Comm_1,Command.BACK,2);15.15.Command c2=new Comman
27、d(Comm_2,Command.BACK,1);Command c2=new Command(Comm_2,Command.BACK,1);16.16.f.addCommand(c1);f.addCommand(c1);17.17.f.addCommand(c2);f.addCommand(c2);18.18.display.setCurrent(fdisplay.setCurrent(f););19.19.20.20.protected void protected void pauseApppauseApp()()21.21.22.22.protected void protected
28、void destroyApp(booleandestroyApp(boolean arg0)throws arg0)throws MIDletStateChangeExceptionMIDletStateChangeException 23.23.24.24.2122图图68 按照优先权映射按照优先权映射Command按钮按钮23n n程序程序程序程序6 65 5:CommandTest2.javaCommandTest2.java1.1.import import javax.microedition.lcduijavax.microedition.lcdui.*;.*;2.2.impor
29、t import javax.microedition.midlet.MIDletjavax.microedition.midlet.MIDlet;3.3.import import javax.microedition.midlet.MIDletStateChangeExceptionjavax.microedition.midlet.MIDletStateChangeException;4.4.public class CommandTest2 extends public class CommandTest2 extends MIDletMIDlet 5.5.private Displa
30、y private Display displaydisplay;6.6.public CommandTest2()public CommandTest2()7.7.super();super();8.8.9.9.protected void protected void startAppstartApp()throws()throws MIDletStateChangeExceptionMIDletStateChangeException 10.10.display=display=Display.getDisplay(thisDisplay.getDisplay(this););11.11
31、.Form f=new Form f=new Form(CommandForm(Command测试测试测试测试););12.12.Command c1=new Command(Command c1=new Command(启动启动启动启动,启动应用程序启动应用程序启动应用程序启动应用程序,Command.BACKCommand.BACK,1);,1);13.13.Command c2=new Command(Command c2=new Command(退出退出退出退出,退出应用程序退出应用程序退出应用程序退出应用程序,Command.OKCommand.OK,2);,2);14.14.f.a
32、ddCommand(c1);f.addCommand(c1);15.15.f.addCommand(c2);f.addCommand(c2);16.16.display.setCurrent(fdisplay.setCurrent(f););17.17.18.18.protected void protected void pauseApppauseApp()()19.19.20.20.protected void protected void destroyApp(booleandestroyApp(boolean arg0)throws arg0)throws MIDletStateCha
33、ngeExceptionMIDletStateChangeException 21.21.22.22.24图图69 显示长名称的显示长名称的Command命令命令 25n n在屏幕上仅仅显示出这些在屏幕上仅仅显示出这些CommandCommand是没有任何意义的,程是没有任何意义的,程序开发人员必须还要将序开发人员必须还要将CommandCommand类和底层的事件处理方法类和底层的事件处理方法关联起来,这样才能响应用户的操作。类关联起来,这样才能响应用户的操作。类CommandCommand对对个个用户动作的语义信息进行封装,而命令动作的行为没有封用户动作的语义信息进行封装,而命令动作的行为
34、没有封装进这个对象,也就是说命令只包含了装进这个对象,也就是说命令只包含了“命令命令”描述信息,描述信息,而不是命令被激活时所实际发生的动作,命令的动作在而不是命令被激活时所实际发生的动作,命令的动作在DisplayableDisplayable对象实例所绑定的接口对象实例所绑定的接口CommandListenerCommandListener中定义。中定义。CommandCommand的事件处理模式采取的是标准的的事件处理模式采取的是标准的ListenerListener模式,需模式,需要使用要使用DisplayableDisplayable对象的对象的setCommandListeners
35、etCommandListener()()方法来注册方法来注册CommandCommand的的Listener Listener。方法如下:。方法如下:n npublic void public void setCommandListener(CommandListenersetCommandListener(CommandListener l)l)26用用 Command Command 对象实现用户交互的基本步骤如下所示:对象实现用户交互的基本步骤如下所示:n n创建一个创建一个 Command Command 对象。对象。n n将这个将这个 Command Command 添加到添加到
36、FormForm、TextBoxTextBox、List List 或者或者 Canvas Canvas 上。上。n n创建一个创建一个CommandCommand监听器,它必须实现监听器,它必须实现CommandListenerCommandListener接口。接口。n n通过调用通过调用 setCommandListener(CommandListenersetCommandListener(CommandListener l)l)方法将监方法将监听器注册到听器注册到UIUI组件。组件。n n当用户与当用户与UIUI组件交互,组件交互,MIDPMIDP实现触发实现触发CommandCom
37、mand命令。命令。n n注册到注册到UIUI组件的监听器调用组件的监听器调用commandActioncommandAction()()方法来对方法来对CommandCommand命令作出响应。用这个方法可以确定是哪一条命命令作出响应。用这个方法可以确定是哪一条命令生成了这个事件并对它进行相应处理。令生成了这个事件并对它进行相应处理。27n n程序程序程序程序6 66 6:CommandTicker.javaCommandTicker.java1.import javax.microedition.lcdui.Command;2.import javax.microedition.lcdui
38、.CommandListener;3.import javax.microedition.lcdui.Display;4.import javax.microedition.lcdui.Displayable;5.import javax.microedition.lcdui.Form;6.import javax.microedition.lcdui.Ticker;7.import javax.microedition.midlet.MIDlet;8.import javax.microedition.midlet.MIDletStateChangeException;9.public cl
39、ass CommandTicker extends MIDlet implements CommandListener 10.private Display display;11.private Form f;12.public CommandTicker()13.super();14.15.protected void startApp()throws MIDletStateChangeException 16.display=Display.getDisplay(this);17.f=new Form(Ticker测试测试);18.Command start=new Command(开始开
40、始,Command.OK,1);19.Command stop=new Command(退出退出,Command.EXIT,1);20.f.addCommand(start);21.f.addCommand(stop);22.f.setCommandListener(this);23.display.setCurrent(f);24.25.protected void pauseApp()26.27.protected void destroyApp(boolean arg0)throws MIDletStateChangeException 28.29.public void command
41、Action(Command c,Displayable s)30.String cmd=c.getLabel();31.if(cmd.equals(开始开始)32.f.setTicker(new Ticker(运行中运行中.);33.else if(cmd.equals(退出退出)34.f.setTicker(null);35.36.37.28图图611 实现命令处理的实现命令处理的Ticker显示显示 296.4 Screen对象n n所有的高级用户界面组件都是基于所有的高级用户界面组件都是基于ScreenScreen类。类。ScreenScreen是一个封装了设备相关图形用户输入接口的是
42、一个封装了设备相关图形用户输入接口的对象。然而,对象。然而,ScreenScreen仅是一个有其自身一些功能的仅是一个有其自身一些功能的抽象类。每个抽象类。每个ScreenScreen有两个属性:标题和有两个属性:标题和tickerticker。标题是显示在标题是显示在screen screen 内容之上的一个字符串。内容之上的一个字符串。n n在实际的应用开发过程中,一般不直接使用在实际的应用开发过程中,一般不直接使用ScreenScreen对象,而是使用对象,而是使用ScreenScreen的的4 4个直接子类:个直接子类:TextBoxTextBox、ListList、AlertAler
43、t和和FormForm。其中。其中AlertAlert、ListList和和TextBoxTextBox代表代表一个完整的抽象屏幕,它们不能有父容器的,必一个完整的抽象屏幕,它们不能有父容器的,必须要独占屏幕。须要独占屏幕。306.5 List组件n n6.5.1 Choice接口n n接口javax.microedition.lcdui.choice定义了这样一个用户界面组件的API:实现了从预定义的数个选项中进行选择,Choice的内容由字符串表示,也可用图像表示。31表表62 Choice接口的主要字段和方法接口的主要字段和方法字段字段static int EXCLUSIVE代表一次只有
44、一个元素被代表一次只有一个元素被选择选择的的Choice类类型型Static int IMPLICIT类类似命令菜似命令菜单单或按或按钮钮的的Choice类类型,当某个元素型,当某个元素获获得焦点并被得焦点并被选择选择时时,自,自动动触触发发Command事件事件Static int MULTIPLE代表一次可以有任意个元素被代表一次可以有任意个元素被选择选择的的Choice类类型型方法方法int append(String s,Image m)追加一个元素到追加一个元素到Choice中中void delete(int index)删删除由除由index所指定的元素所指定的元素void ins
45、ert(int index,String s,Image m)在索引在索引为为index的元素之后插入一个元素的元素之后插入一个元素void set(int index,String s,Image m)设设置索引置索引为为index元素的内容元素的内容int getSelectedFlags(Boolean r)以以boolean数数组组的形式返回所有元素的状的形式返回所有元素的状态态void set SelectedFlags(Boolean r)设设置置Choice中所有元素的状中所有元素的状态态boolean isSelected(int index)返回索引返回索引为为index的元
46、素是否被的元素是否被选选中中void setSelectedIndex(int index,boolean selected)设设置索引置索引为为index的元素的的元素的选选中状中状态态int size()获获得得Choice接口的元素数目接口的元素数目Image getImage(int index)获获取索引取索引为为index的元素的的元素的图图像部分像部分String getString(int index)获获取索引取索引为为index的元素的字符串部分的元素的字符串部分32Choice 对象可以分为3大类:n n单选类型:每次必须选中一个元素且只能选中一个元素n n简易类型:同单
47、选类型一样,每次必须选中一个元素且只能选中一个元素,并且用户在不同的元素间切换选项时,会自动触发一个Command命令。n n多选类型:用户可在显示的一系列元素间选择任意数量的元素。33n程序程序67:ExclusiveList.java1.import javax.microedition.lcdui.*;2.import javax.microedition.midlet.MIDlet;3.import javax.microedition.midlet.MIDletStateChangeException;4.public class ExclusiveList extends MIDl
48、et implements CommandListener5.6.private Display display;7.public ExclusiveList()8.super();9.10.protected void startApp()throws MIDletStateChangeException 11.display=Display.getDisplay(this);12.List l=new List(List测试测试,Choice.EXCLUSIVE);13.l.append(语文语文,null);14.l.append(数学数学,null);15.l.append(英语英语,
49、null);16.l.setSelectedIndex(1,true);17.l.addCommand(new Command(确定确定,Command.OK,1);18.l.setCommandListener(this);19.display.setCurrent(l);20.21.protected void pauseApp()22.23.protected void destroyApp(boolean arg0)throws MIDletStateChangeException 24.25.public void commandAction(Command c,Displayabl
50、e s)26.27.String cmd=c.getLabel();28.if(cmd.equals(确定确定)29.30.List l=(List)s;31.int i=l.getSelectedIndex();32.System.out.println(您选择了第您选择了第+i+个选项个选项);33.String con=l.getString(i);34.System.out.println(选项的名称为选项的名称为+con);35.36.37.34图图612 显示单选显示单选List 35图图613 获取单选获取单选List的选项信息的选项信息 36n程序程序68:ExclusiveI