1、5g游戏开发用户界面开发用户界面开发本章目标 掌握Display的基本使用方法 熟悉Display的常用函数 掌握如何使用命令按钮及处理命令按钮的事件 熟悉文本框的使用 掌握如何为屏幕添加滚动条 掌握列表窗口的实现 掌握列表的维护及列表选项的选中判断1.1 Jave ME用户界面 Java ME应用程序的高级用户界面一般都是由Display对象和Displayable对象组成,其中,Display类可以用于管理系统的输入的输入设备和显示设备。Displayable对象是一个可以被设置在Display上的对象。1.2 Display类该类位于javax.microedition.lcdui.Di
2、splay。每个MIDlet只能有Display对象,应用程序可以通过调用静态成员函数getDisplay获得对Display对象的引用。在MIDlet的运行过程中,无论何时调用getDisplay函数,都会返回相同的Display对象的引用。getDisplay函数的语法定义如下:public static Display getDisplay(MIDlet m);参数m用于制定返回哪个MIDlet对象的Display对象引用,如果参数为null,则触发空指针异常NullPointerException。Display可以对当前显示屏幕的管理:1、返回当前屏幕的Displayable对象方法
3、为:public Displayable getCurrent(); 2、使Displayable在前台运行方法为:public void setCurrent(Displayable nextDisplayable)nextDisplayable参数是要被显示的Displayable对象,如果其值为null,那么,不会对当前显示产生任何影响,即当前显示不变。因此,应该设置一个非空的Displayable对象,向手机中的应用程序管理器发送一个应用程序要求在前台运行的请求。应用程序没有默认的Displayable对象,因此在应用程序初始化时,用户要通过setCurrent函数设置应用程序第一个被
4、显示的界面。 Display可以获得边框类型和最佳图像大小。1、通过Display的getBorderStyle函数返回系统采用的边框类型,语法定义:public int getBorderStyle(Boolean highlighted)参数为true,则表示返回高亮状态的边框类型。返回值为边框类型,可能有下面两个值之一:Graphics.DOTTED:虚线类型Graphics.SOLID:实线类型2、通过Display的getBestImageWidth(int imagetype)、getBestImageHeight(int imagetype)获得图像的最佳宽度和高度public
5、int getBestImageWidth(int imageType)public int getBestImageHeight(int imageType)参数imageType是要返回最佳图像大小的组件类型,可以选择的参数值有以下几种:1、LIST_ELEMENT:image类型为List的选项图像2、CHOICE_GROUP_ELEMENT:Image类型为ChoiceGroup的选项图像3、ALERT:Image类型Alert的图像可以获得系统颜色属性。numColors():获得当前设备支持的最大颜色数;isColor():是否支持彩色显示;Alpha级别numAlphaLevel
6、s():显示当前设备能支持的;getColor(Display.COLOR_BACKGROUND):显示背景颜色;getColor(Display.COLOR_FOREGROUND):显示前景颜色;getColor(Display.COLOR_BORDER):显示边框颜色;getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND):高亮的背景颜色;getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND):高亮的前景颜色;getColor(Display.COLOR_HIGHLIGHTED_BORDER):高亮的边框颜色;程序
7、41说明:本程序演示如何获得系统颜色属性import javax.microedition.lcdui.Display;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class DisplayColor extends MIDlet private Display display; public DisplayColor() super(); protected void startApp() throws MIDletStat
8、eChangeException /获得当前MIDlet的Display对象 display = Display.getDisplay(this); /numColor()获取当前设备支持的最大颜色数 System.out.println(Max Colors: + display.numColors(); /显示是否支持彩色显示 System.out.println(Color Phone: + display.isColor(); /显示当前设备能支持的Alpha级别 System.out.println(Alpha Level: + display.numAlphaLevels(); /
9、显示颜色常量的RGB值 /背景颜色 int c = display.getColor(Display.COLOR_BACKGROUND); String color = Integer.toHexString(c).toUpperCase(); System.out.println(Background: + color); /前景颜色 c = display.getColor(Display.COLOR_FOREGROUND); color = Integer.toHexString(c).toUpperCase(); System.out.println(foreground: + col
10、or); /边框颜色 c = display.getColor(Display.COLOR_BORDER); color = Integer.toHexString(c).toUpperCase(); System.out.println(Border: + color); /高亮的背景颜色 c= display.getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND); color = Integer.toHexString(c).toUpperCase(); System.out.println(Highlighted Background: + col
11、or); /高亮的前景颜色 c= display.getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND); color = Integer.toHexString(c).toUpperCase(); System.out.println(Highlighted Foreground: + color); /高亮的边框颜色 c = display.getColor(Display.COLOR_HIGHLIGHTED_BORDER); color = Integer.toHexString(c).toUpperCase(); System.out.printl
12、n(Highlighted Border: + color); protected void pauseApp() / TODO Auto-generated method stub protected void destroyApp(boolean arg0) throws MIDletStateChangeException / TODO Auto-generated method stub 运行界面:Max Colors: 4096Color Phone: trueAlpha Level: 256Background: FFFFFFforeground: 0Border: AFAFAFH
13、ighlighted Background: 0Highlighted Foreground: FFFFFFHighlighted Border: 606060注意:1、numColor():该函数的返回值与isColor函数的返回值相关。当isColor函数返回的值为true时,numColors函数的返回值表示当前显示设备所支持的最大彩色数;当isColor函数返回flase时,numColor函数返回值表示当前显示设备所支持的最大灰度等级。对于黑白手机,其返回值为2。2、numAlphaLevels:该函数返回显示设备支持的透明等级。返回2,那么设置支持全透明或不透明。如果返回值大于2,
14、则表示为透明的等级,有可能半透明。3、public int getColor(int colorSpecifier):该参数colorSpecifier是颜色系统颜色常量的表示,返回值以0x00RRGGBB的格式表示系统颜色的RGB值。在MIDP2。0规范中,有以下几个颜色常量的表示可以使用。COLOR_BACKGROUND:常量值为0,表示屏幕上没有高亮显示的背景颜色COLOR_BORDER:常量值为4,表示屏幕上没有高亮显示的边框颜色,通常和背景颜色一起使用COLOR_FOREGROUND:常量值为1,表示屏幕上没有高亮显示的前景色COLOR_HIGHLIGHTED_BORDER:常量值为
15、5,表示屏幕上被高亮显示的边框颜色COLOR_HIGHLIGHTED_FOREGROUND:常量值为3,表示用于绘制一个高亮的文本或简单图形的颜色1.3 Displayable类和Screen类Displayable类可以在手机屏幕上显示,一个MIDlet只可能有一个Display,可以有多个Displayable对象,但是在同一时刻只能显示一个Displayable对象。其直接子类有:Canvas /ScreenDisplayable类中提供的成员函数public void setTitle(String s):设置标题;public void setTicker(Ticker ticker
16、):为Displayable对象设置滚动条;public Ticker getTicker():返回Displayable对象的滚动条;public Boolean isShown():判断当前Displayable对象是否被显示;public addCommand(Command cmd):为Displayable添加一个命令按钮;public void removeCommand(Command cmd):从Displayable中删除一个命令按钮;public void setCommandListener(CommandListener 1):设置命令按钮监听器;public int
17、getWidth():;返回对象的宽度;public int getHeight();返回对象的高度;protected void sizeChanged(int w,int h),只能在派生类中使用,当Displayable对象的大小改变时,将触发sizeChanged函数执行。1.4 手机命令按钮的使用1.4.1 Command该类位于:javax.microedition.lcdui.Command;该类直接继承Object对象。构造函数:1)命令按钮的第一个构造函数public Command(String label,int commandType,int priority)参数说明
18、:label:命令按钮上显示的标签CommandType:是命令按钮的类型,可以使用的类型有:Command.SCREEN、Command.BACK、Command.CANCEL、Command.OK 、Command.HELP 、Command.ITEM、Command.STOP 、Command.EXIT。Priority:命令按钮的优先级,即命令按钮的重要性。程序42:说明:本程序演示命令按钮的使用。import javax.microedition.lcdui.Command;import javax.microedition.lcdui.Display;import javax.mi
19、croedition.lcdui.Form;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class T extends MIDlet public T() / TODO Auto-generated constructor stub Display display; Form frmMain = new Form(命令按钮长标签演示);/创建表单,设置标题 Command cmdScreen1 = new Command(SC
20、REEN1, Command.SCREEN, 1);/创建命令按钮,名称为cmdScreen1 Command cmdScreen2 = new Command(SCREEN2 , Command.SCREEN, 2); /创建命令按钮,名称为cmdScreen2 protected void startApp() throws MIDletStateChangeException display = Display.getDisplay(this); frmMain.addCommand(cmdScreen1);/通过addCommand方法将cmdScreen1加到表单中 frmMain.
21、addCommand(cmdScreen2); /通过addCommand方法将cmdScreen2加到表单中 display.setCurrent(frmMain);/将frmMain设置为当前显示 protected void pauseApp() / TODO Auto-generated method stub protected void destroyApp(boolean arg0) throws MIDletStateChangeException / TODO Auto-generated method stub 运行界面:图4.12)命令按钮的另外一个构造函数定义如下:pu
22、blic Command(String label,int commandType,int priority)实际上,每个按钮都有短标签和长标签两个标签,两个标签都可以为空,长标签可以被显示时(有足够的空间显示长标签),命令按钮首先显示长标签;当没有足够的空间显示长标签时,系统将选择显示短标签。参数commandType 和priority和第一种构造函数相同。命令按钮的短标签可以通过getLabel函数返回,长标签可以通过getLongLabel函数返回。程序43说明:本程序演示长标签和短标签的使用public class LongLabel extends MIDlet Display d
23、isplay; Form frmMain = new Form(命令按钮长标签演示); Command cmdScreen1 = new Command(SCREEN1,This is a short label!, Command.SCREEN, 1); /有足够的空间显示长标签,则显示长标签 Command cmdScreen2 = new Command(SCREEN2, This is a very vary very vary very vary long label!, Command.SCREEN, 2); /没有足够的空间显示长标签,则显示短标签 Command cmdScre
24、en3 = new Command(A Short Lable, Command.SCREEN, 3); Command cmdExit1 = new Command(EXIT1, Command.EXIT, 1); public LongLabel() super(); protected void startApp() throws MIDletStateChangeException display = Display.getDisplay(this); frmMain.addCommand(cmdScreen3); frmMain.addCommand(cmdScreen2); frm
25、Main.addCommand(cmdScreen1); frmMain.addCommand(cmdExit1); display.setCurrent(frmMain); protected void pauseApp() protected void destroyApp(boolean arg0) throws MIDletStateChangeException 运行效果图4.2注意:不同的手机生产厂商之间,以及同一手机生产厂商的不同模拟器之间都存在着一定的不同。1.4.2 CommandType命令按钮的类型 在创建命令按钮时,可以通过commandType参数设置命令按钮的类型,
26、命令按钮的类型可以getCommandType函数返回。在MIDP2.0规范中定义了如表4-1所示的几种命令按钮类型。表4.1 命令按钮的类型及其作用类型常量值使用方法BACK2通常用于在多个屏幕之间进行导航,返回上一个屏幕的功能不会自动实现,需要开发人员通过代码进行控制CANCEL3可以被用在对话框中,用于提供一个否定的回答,取消某些操作,通常用于和OK类型一起使用。该类型的按钮并没有提供取消操作的代码,开发人员需要根据实际情况自己添加处理代码。当有多个屏幕时,CANCEL类型命令可以用来取消当前屏幕上的一些操作,并返回上一个屏幕,该功能和BACK类似,但是CANCEL更强调取消了某种操作E
27、XIT7用于退出当前应用, 退出代码需要开发人员自己添加HELP5用于提供在线帮助,具体的帮助内容需要开发人员自己实现ITEM8可以提示其实现是屏幕的一个条目或者是Choice组件的一个元素,相对于SCREEN类型而言,ITEM类型表示命令按钮是屏幕布局的一个部分OK4可以被用在对话框中,用于提供一个肯定的回答,确认某些操作,通常和CANCEL类型一起使用。该类型的按钮并没有提供确定以后的操作,开发人员需要根据实际情况自己添加处理代码。当有多个屏幕时,OK类型命令可以用来确定在这个屏幕上输入的数据并跳转到下一个屏幕SCREEN1当要执行的命令适合于整个屏幕,例如“保存”、“打开”功能,或者用于
28、进行屏幕切换时,可以使用该类型,想对于ITEM类型而言,SCREEN类型表示命令按钮是屏幕的一个部分STOP6可以用于停止某些正在运行的操作,进程等,通常不许要进行屏幕切换,停止操作的代码需要开发人员自己完成程序44说明:本程序演示命令按钮类型对命令按钮位置及顺序的影响。public class CommandType extends MIDlet Display display; Form frmMain = new Form(命令按钮类型演示); /命令按钮 Command cmdScreen1 = new Command(SCREEN1, Command.SCREEN, 1); Comm
29、and cmdScreen2 = new Command(SCREEN2, Command.SCREEN, 1); Command cmdItem1 = new Command(ITEM1, Command.ITEM, 1); Command cmdItem2 = new Command(ITEM2, Command.ITEM, 1); Command cmdExit2 = new Command(EXIT2, Command.EXIT, 1); Command cmdExit1 = new Command(EXIT1, Command.EXIT, 1); Command cmdBack1 =
30、 new Command(BACK1, Command.BACK, 1); Command cmdBack2 = new Command(BACK2, Command.BACK, 1); Command cmdCancel1 = new Command(CANCEL1, Command.CANCEL, 1); Command cmdCancel2 = new Command(CANCEL2, Command.CANCEL, 1); Command cmdHelp1 = new Command(HELP1, Command.HELP, 1);Command cmdHelp2 = new Command(HELP2, Command.HELP, 1);Command cmdOk1 = new Command(OK1, Command.OK, 1); Command cmdOk2 = new Command(OK2, Command.OK, 1); Command cmdStop1 = new Command(STOP1, Command.STOP, 1); Command cmdStop2 = new Command(STOP2, Command.STOP, 1); public CommandTyp