MIDP高级界面编程 (2).ppt
《MIDP高级界面编程 (2).ppt》由会员分享,可在线阅读,更多相关《MIDP高级界面编程 (2).ppt(101页珍藏版)》请在三一办公上搜索。
1、第6章 MIDP 高级界面编程,郝玉龙E_mail:,J2ME移动应用开发电子讲义,6.1 LCDUI体系结构概述6.2高级用户界面编程基础6.3 Command处理机制6.4 Screen对象6.5 List组件6.6 TextBox组件6.7 Alert组件6.8 Form类小结,6.1 LCDUI体系结构概述,为适应种类繁多的移动信息设备,CLDC本身没有定义任何GUI功能,而是由J2ME将所有与界面相关的类库都定义在简表(例如MIDP)中,这样在更大程度上包含了保证了界面类库的适应性。,6.1.1 LCDUI 工作模型,第一步:为了在MIDP 设备上显示信息,需要取得设备的显示屏幕。D
2、isplay对象代表的是移动设备显示屏幕,每个MIDlet 都有且仅有 Display 对象的一个实例。Display 对象实质上是设备显示屏的管理程序,它控制在设备上显示什么内容。在J2ME程序中只有一个Display的引用,通过静态方法Display.getDisplay(MIDlet midlet)得到。,第二步:通过Display的引用程序开发人员可以得到当前设备屏幕的一些信息,比如色彩之类,但是最常用的方法是通过Display的setCurrent()方法将抽象屏幕对象绑定到当前设备屏幕上来显示。图形用户界面开发中更多的工作是实现抽象屏幕对象,由抽象屏幕对象封装和管理实现程序与用户之
3、间交互的图形界面组件如文本框、选择框列表等。当使用高级图形API时,抽象屏幕由对象代表,当使用低级屏幕API时,抽象屏幕由对象代表。应用程序可以包含几个抽象屏幕对象,不过某一时间只能在显示器上显示一个屏幕(或者说只有一个当前屏幕)。,图61 LCDUI体系结构,图61 LCDUI体系结构,为了实现可移植性,高层API 进行了高度抽象,在界面外观上提供的控制很少。例如,不允许定义高层组件的视觉外观(形状、颜色或字体),与组件之间的大多数交互都被实现封装,即由底层实现而不是应用程序完成对设备硬件和本地用户界面类型的适应工作。因此,如果使用高级API,那么用户界面就具有较高移植性。但是高级API提供
4、的组件都会由底层的虚拟机直接映射到该设备的本地用户界面,所以程序开发人员无法决定最终显示到设备屏幕上时组件的颜色、字型和外观,因为这些细节都是由系统决定,程序开发人员对画面的控制程度相对较低。另外,采用高级API开发的用户界面,与用户的交互都会遵循该移动设备既有用户界面的操作方式。所以,采用高级用户界面开发的应用,如果发布到不同类型的移动设备上,用户界面的外观和交互方式出现一些差异是很正常的。,使用低级API开发应用就相对复杂。低层API提供很少的抽象。使用它们的应用程序需要精确地布局和控制图形元素,同时还需要访问低层输入事件。使用低级API时,将对移动设备的显示屏幕具有完全的控制权,同时也能
5、够决定用户该如何与程序交互,因此程序开发人员考虑的细节就比较多。由于每种设备都有不同的特性(不同的操作方式、颜色和大小),因此一旦采取低级API,程序的可移植性将大大降低,将不再保证程序可以在不同的机器上执行。,6.2高级用户界面编程基础,6.2.1 Display对象 MIDP使用Display对象进行用户界面的管理,负责与应用程序管理器进行交互。Display代表了系统显示屏和输入设备的管理器,包含用来获取设备属性的方法,以及请求在设备上显示抽象屏幕对象的方法。,表61 Display对象常用方法,程序61:DisplayTest.javapackage chap6;import;impo
6、rt;import;public class DisplayTest extends MIDlet Display display=null;public DisplayTest()super();protected void startApp()throws MIDletStateChangeException display=Display.getDisplay(this);int colors=display.numColors();boolean iscolor=display.isColor();boolean s=display.flashBacklight(2500);if(!s
7、)(您的设备不支持背景灯控制);s=display.vibrate(500);if(!s)(您的设备不支持震动);if(iscolor)(您的设备是彩色显示设备);else(您的设备不是彩色显示设备);(您的设备支持+Integer.toString(colors)+种颜色);protected void pauseApp()protected void destroyApp(boolean arg0)throws MIDletStateChangeException,6.2.2 Displayable对象,在显示屏设备上显示的用户界面对象为Displayable对象,在同一时刻应用程序最多只
8、能有一个Displayable对象,这个Displayable对象显示在显示屏设备上,并通过它与用户进行交互,这个被引用的Displayable对象被称为当前Displayable对象。从图 61可知,所有的GUI组件都实现了抽象类Displayable。,程序62:DisplayableTest.javapackage chap6;import;import;import;import;public class DisplayableTest extends MIDlet Display display=null;Form f;public DisplayableTest()super();
9、protected void startApp()throws MIDletStateChangeException display=Display.getDisplay(this);f=new Form(Displayable测试);display.setCurrent(f);protected void pauseApp()protected void destroyApp(boolean arg0)throws MIDletStateChangeException,6.2.3 Ticker对象,Ticker对象实现了在屏幕上连续滚动的滚动条或小段文本。Ticker 与在本节讨论的其他组件
10、有一些不同,它不是 Screen 的子类。相反,它是在Displayable 类中定义的一个变量。因此,所有从Displayable派生出的对象都可以显示一个Ticker。因此Ticker既可以使用在高级用户界面API中,也可以使用在低级用户界面API中。,程序63 TickerTest.javaimport;import;import;import;import;public class TickerTest extends MIDlet Display display=null;Form f;public TickerTest()super();f=new Form(Ticker 测试);
11、protected void startApp()throws MIDletStateChangeException display=Display.getDisplay(this);f.setTicker(new Ticker(你好.);display.setCurrent(f);protected void pauseApp()protected void destroyApp(boolean arg0)throws MIDletStateChangeException,6.3 Command处理机制,MIDP定义了抽象的Command机制来实现与设备的命令交互接口,而具体的实现根据与该设
12、备相适合的机制来提供支持。对于开发者来说,Command对象就类似于普通GUI编程的button,可以设定其标题,如确定、取消等。当用户调用该Command时,应用程序会做出适当的响应。而具体Command如何在屏幕上显示以及如何与具体设备的按键等建立联系是MIDP实现的责任,开发者不需要考虑 Command既适用于高级API(Screen类),又适用于低级API(Canvas类),Command类有两种构造函数,一个有三个参数,另一个则是四个参数。区别在于:前者第一个参数是显示在画面上名称,第二个参数是命令的类型,第三参数是优先权,以自然数形式表示,如:1,2,3,越小优先权越高,代表Com
13、mand将在屏幕越显眼的地方显示。而后者则是在前者的基础上增加了一个长命令的参数,具体位置位于前者第一和第二个参数之间。Command的类型共分为8种:Command.BACK,ommand.EXIT,Command.CANCEL,Command.HELP,Command.ITEM,Command.OK,Command.SCREEN,Command.STOP。,程序64:CommandTest.javaimport;import;import;import;import;public class CommandTest extends MIDlet private Display displa
14、y;public CommandTest()super();protected void startApp()throws MIDletStateChangeException display=Display.getDisplay(this);Form f=new Form(Command测试);Command c1=new Command(Comm_1,Command.BACK,2);Command c2=new Command(Comm_2,Command.BACK,1);f.addCommand(c1);f.addCommand(c2);display.setCurrent(f);pro
15、tected void pauseApp()protected void destroyApp(boolean arg0)throws MIDletStateChangeException,程序65:CommandTest2.javaimport.*;import;import;public class CommandTest2 extends MIDlet private Display display;public CommandTest2()super();protected void startApp()throws MIDletStateChangeException display
16、=Display.getDisplay(this);Form f=new Form(Command测试);Command c1=new Command(启动,启动应用程序,Command.BACK,1);Command c2=new Command(退出,退出应用程序,Command.OK,2);f.addCommand(c1);f.addCommand(c2);display.setCurrent(f);protected void pauseApp()protected void destroyApp(boolean arg0)throws MIDletStateChangeExcepti
17、on,在屏幕上仅仅显示出这些Command是没有任何意义的,程序开发人员必须还要将Command类和底层的事件处理方法关联起来,这样才能响应用户的操作。类Command对个用户动作的语义信息进行封装,而命令动作的行为没有封装进这个对象,也就是说命令只包含了“命令”描述信息,而不是命令被激活时所实际发生的动作,命令的动作在Displayable对象实例所绑定的接口CommandListener中定义。Command的事件处理模式采取的是标准的Listener模式,需要使用Displayable对象的setCommandListener()方法来注册Command的Listener。方法如下:pu
18、blic void setCommandListener(CommandListener l),用 Command 对象实现用户交互的基本步骤如下所示:创建一个 Command 对象。将这个 Command 添加到 Form、TextBox、List 或者 Canvas 上。创建一个Command监听器,它必须实现CommandListener接口。通过调用 setCommandListener(CommandListener l)方法将监听器注册到UI组件。当用户与UI组件交互,MIDP实现触发Command命令。注册到UI组件的监听器调用commandAction()方法来对Command
19、命令作出响应。用这个方法可以确定是哪一条命令生成了这个事件并对它进行相应处理。,程序66:CommandTicker.javaimport;import;import;import;import;import;import;import;public class CommandTicker extends MIDlet implements CommandListener private Display display;private Form f;public CommandTicker()super();protected void startApp()throws MIDletState
20、ChangeException display=Display.getDisplay(this);f=new Form(Ticker测试);Command start=new Command(开始,Command.OK,1);Command stop=new Command(退出,Command.EXIT,1);f.addCommand(start);f.addCommand(stop);f.setCommandListener(this);display.setCurrent(f);protected void pauseApp()protected void destroyApp(bool
21、ean arg0)throws MIDletStateChangeException public void commandAction(Command c,Displayable s)String cmd=c.getLabel();if(cmd.equals(开始)f.setTicker(new Ticker(运行中.);else if(cmd.equals(退出)f.setTicker(null);,6.4 Screen对象,所有的高级用户界面组件都是基于Screen类。Screen是一个封装了设备相关图形用户输入接口的对象。然而,Screen仅是一个有其自身一些功能的抽象类。每个Scre
22、en有两个属性:标题和ticker。标题是显示在screen 内容之上的一个字符串。在实际的应用开发过程中,一般不直接使用Screen对象,而是使用Screen的4个直接子类:TextBox、List、Alert和Form。其中Alert、List和TextBox代表一个完整的抽象屏幕,它们不能有父容器的,必须要独占屏幕。,6.5 List组件,6.5.1 Choice接口接口定义了这样一个用户界面组件的API:实现了从预定义的数个选项中进行选择,Choice的内容由字符串表示,也可用图像表示。,表62 Choice接口的主要字段和方法,Choice 对象可以分为3大类:单选类型:每次必须选中
23、一个元素且只能选中一个元素简易类型:同单选类型一样,每次必须选中一个元素且只能选中一个元素,并且用户在不同的元素间切换选项时,会自动触发一个Command命令。多选类型:用户可在显示的一系列元素间选择任意数量的元素。,程序67:ExclusiveList.javaimport javax.microedition.lcdui.*;import;import;public class ExclusiveList extends MIDlet implements CommandListener private Display display;public ExclusiveList()super
24、();protected void startApp()throws MIDletStateChangeException display=Display.getDisplay(this);List l=new List(List测试,Choice.EXCLUSIVE);l.append(语文,null);l.append(数学,null);l.append(英语,null);l.setSelectedIndex(1,true);l.addCommand(new Command(确定,Command.OK,1);l.setCommandListener(this);display.setCur
25、rent(l);protected void pauseApp()protected void destroyApp(boolean arg0)throws MIDletStateChangeException public void commandAction(Command c,Displayable s)String cmd=c.getLabel();if(cmd.equals(确定)List l=(List)s;int i=l.getSelectedIndex();(您选择了第+i+个选项);String con=l.getString(i);(选项的名称为+con);,程序68:Ex
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MIDP高级界面编程 2 MIDP 高级 界面 编程

链接地址:https://www.31ppt.com/p-6512469.html