3g游戏开发-用户界面开发
Display
Display
1.1 Jave ME
Java ME应用程序的高级用户界面一般都是由Display对象和Displayable对象组成,其中,Display类可以用于管理系统的输入的输入设备和显示设备。Displayable对象是一个可以被设置在Display上的对象。
1.2 Display
该类位于javax.microedition.lcdui.Display。
每个MIDlet只能有Display对象,应用程序可以通过调用静态成员函数getDisplay获得对Display对象的引用。在MIDlet的运行过程中,无论何时调用getDisplay函数,都会返回相同的Display对象的引用。getDisplay函数的语法定义如下:
public static Display getDisplay(MIDlet m);
参数m用于制定返回哪个MIDlet对象的Display对象引用,如果参数为null,则触发空指针异常NullPointerException。
Display
1、返回当前屏幕的Displayable对象方法为:
public Displayable getCurrent();
2、使Displayable在前台运行方法为:
public void setCurrent(Displayable nextDisplayable)
nextDisplayable参数是要被显示的Displayable对象,如果其值为null,那么,不会对当前显示产生任何影响,即当前显示不变。因此,应该设置一个非空的Displayable对象,向手机中的应用程序管理器发送一个应用程序
在前台运行的请求。应用程序没有默认
的Displayable对象,因此在应用程序初始化时,用户要通过setCurrent函数设置应用程序第一个被显示的界面。
Display可以获得边框类型和最佳图像大小。
1、通过Display的getBorderStyle函数返回系统采用的边框类型,语法定义:
public int getBorderStyle(Boolean highlighted)
参数为true,则
示返回高亮状态的边框类型。
返回值为边框类型,可能有下面两个值之一:
Graphics.DOTTED:虚线类型
Graphics.SOLID:实线类型
2、通过Display的getBestImageWidth(int imagetype)、getBestImageHeight(int imagetype)获得图像的最佳宽度和高度
public 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级别numAlphaLevels():显示当前设备能支持的; 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):高亮的边框颜色;
程序4~1
说明:本程序演示如何获得系统颜色属性
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 MIDletStateChangeException {
//获得当前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());
//显示颜色常量的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: " + color);
//边框颜色
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: " + color);
//高亮的前景颜色
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.println("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: 4096
Color Phone: true
Alpha Level: 256
Background: FFFFFF
foreground: 0
Border: AFAFAF
Highlighted Background: 0
Highlighted Foreground: FFFFFF
Highlighted Border: 606060
注意:
1、numColor():该函数的返回值与isColor函数的返回值相关。当isColor函数返回的值为true时,numColors函数的返回值表示当前显示设备所支持的最大彩色数;当isColor函数
返回flase时,numColor函数返回值表示当前显示设备所支持的最大灰度等级。对于黑白
手机,其返回值为2。
2、numAlphaLevels:该函数返回显示设备支持的透明等级。返回2,那么设置支持全透明或不透明。如果返回值大于2,则表示为透明的等级,有可能半透明。 3、public int getColor(int colorSpecifier):该参数colorSpecifier是颜色系统颜色常量的表示,返回值以0x00RRGGBB的
表示系统颜色的RGB值。在MIDP2。0规范中,有以下几个颜色常量的表示可以使用。
COLOR_BACKGROUND:常量值为0,表示屏幕上没有高亮显示的背景颜色 COLOR_BORDER:常量值为4,表示屏幕上没有高亮显示的边框颜色,通常和背景颜色
一起使用
COLOR_FOREGROUND:常量值为1,表示屏幕上没有高亮显示的前景色 COLOR_HIGHLIGHTED_BORDER:常量值为5,表示屏幕上被高亮显示的边框颜色 COLOR_HIGHLIGHTED_FOREGROUND:常量值为3,表示用于绘制一个高亮的文本或
简单图形的颜色
1.3 DisplayableScreen
Displayable类可以在手机屏幕上显示,一个MIDlet只可能有一个Display,可以有多个Displayable对象,但是在同一时刻只能显示一个Displayable对象。 其直接子类有:Canvas /Screen
Displayable 类中提供的成员函数
public void setTitle(String s):设置标题;
public void setTicker(Ticker ticker):为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 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)
参数说明:
label:命令按钮上显示的标签
CommandType:是命令按钮的类型,可以使用的类型有: Command.SCREEN、Command.BACK、Command.CANCEL、Command.OK 、
Command.HELP 、Command.ITEM、Command.STOP 、Command.EXIT。
Priority:命令按钮的优先级,即命令按钮的重要性。 程序4~2:
说明:本程序演示命令按钮的使用。
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.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("SCREEN1",
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.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.1
2)命令按钮的另外一个构造函数定义如下:
public Command(String label,int commandType,int priority)
实际上,每个按钮都有短标签和长标签两个标签,两个标签都可以为空,长标签可以
被显示时(有足够的空间显示长标签),命令按钮首先显示长标签;当没有足够的空间显
示长标签时,系统将选择显示短标签。参数commandType 和priority和第一种构造函数相同。命令按钮的短标签可以通过getLabel函数返回,长标签可以通过getLongLabel函
数返回。
程序4~3
说明:本程序演示长标签和短标签的使用
public class LongLabel extends MIDlet {
Display display;
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 cmdScreen3 = 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);
frmMain.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参数设置命令按钮的类型,命令按钮
的类型可以getCommandType函数返回。在MIDP2.0规范中定义了如表4-1所示的几种命令按钮类型。
4.1
类型 常量值 使用方法
BACK 2 通常用于在多个屏幕之间进行导航,返回上一个屏幕的
功能不会自动实现,需要开发人员通过代码进行控制 CANCEL 3 可以被用在对话框中,用于提供一个否定的回答,取消
某些操作,通常用于和OK类型一起使用。该类型的按
钮并没有提供取消操作的代码,开发人员需要根据实际
情况自己添加处理代码。当有多个屏幕时,CANCEL
类型命令可以用来取消当前屏幕上的一些操作,并返回
上一个屏幕,该功能和BACK类似,但是CANCEL更
强调取消了某种操作
EXIT 7 用于退出当前应用, 退出代码需要开发人员自己添加 HELP 5 用于提供在线帮助,具体的帮助
需要开发人员自己
实现
ITEM 8 可以提示其实现是屏幕的一个条目或者是Choice组件
的一个元素,相对于SCREEN类型而言,ITEM类型
表示命令按钮是屏幕布局的一个部分 OK 4 可以被用在对话框中,用于提供一个肯定的回答,确认
某些操作,通常和CANCEL类型一起使用。该类型的
按钮并没有提供确定以后的操作,开发人员需要根据实
际情况自己添加处理代码。当有多个屏幕时,OK类型
命令可以用来确定在这个屏幕上输入的数据并跳转到
下一个屏幕
SCREEN 1 当要执行的命令适合于整个屏幕,例如“保存”、“打开”
功能,或者用于进行屏幕切换时,可以使用该类型,想
对于ITEM类型而言,SCREEN类型表示命令按钮是
屏幕的一个部分
STOP 6 可以用于停止某些正在运行的操作,进程等,通常不许
要进行屏幕切换,停止操作的代码需要开发人员自己完
成
程序4~4
说明:本程序演示命令按钮类型对命令按钮位置及顺序的影响。 public class CommandType extends MIDlet {
Display display;
Form frmMain = new Form("命令按钮类型演示");
//命令按钮
Command cmdScreen1 = new Command("SCREEN1", Command.SCREEN, 1);
Command 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 = 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 CommandType() {
super();
// TODO Auto-generated constructor stub
}
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
frmMain.addCommand(cmdBack1);
frmMain.addCommand(cmdCancel1);
frmMain.addCommand(cmdHelp1);
frmMain.addCommand(cmdOk1);
frmMain.addCommand(cmdStop1);
frmMain.addCommand(cmdScreen1);
frmMain.addCommand(cmdItem1);
frmMain.addCommand(cmdBack2);
frmMain.addCommand(cmdCancel2);
frmMain.addCommand(cmdHelp2);
frmMain.addCommand(cmdOk2);
frmMain.addCommand(cmdStop2);
frmMain.addCommand(cmdExit1);
frmMain.addCommand(cmdExit2);
frmMain.addCommand(cmdScreen2);
frmMain.addCommand(cmdItem2);
display.setCurrent(frmMain);
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0)
throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
}
运行界面:
图4.3
注意:1、对于具有两个软键的手机,命令按钮区域被划分成两个部分,左边的部分被绑
定到左软键,右边的部分被绑定到右软键;
2、对于具有三个软键的手机,命令按钮区域被划分成3个部分,左边的部分被绑定到左软键,中间的部分被绑定到中软键,右边的部分被绑定到右软件;
3、当命令按钮多余2个或3个时,则其他命令按钮被折叠成一个“选项菜单”。 1.5 WTK
在WTK模拟器中,BACK、EXIT、CANCEL、STOP类型的命令按钮会尽量占据命
令按钮区的左边区域(左软键),这四种类型按钮占据左软键的优先级如表4.2:
4.2 WTK
命令按钮类型 占据左软键的优先级
BACK 1
CANCEL 3
EXIT 2
STOP 4
在WTK中,ITEM、SCREEN、OK、HELP这四种类型无论如何都会在命令按钮区
的右边显示。这四种类型按钮占据左软键的优先级如表4.3:
4.3 WTK
命令按钮类型 占据左软键的优先级
ITEM 1
SCREEN 2
OK 3
HELP 4
BACK 5
EXIT 6
CANCEL 7
STOP 8
注意:命令按钮出现的顺序,由其类型决定,但是,同一类型的按钮出现的顺序,可以通
过设置priority
程序4~5:
说明:本程序演示按钮优先级对命令出现顺序的影响。
package test;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class CommandPriority extends MIDlet {
Display display;
Form frmMain = new Form("命令按钮优先级演示");
//命令按钮
Command cmdScreen1 = new Command("SCREEN1", Command.SCREEN, 1);
Command cmdScreen2 = new Command("SCREEN2", Command.SCREEN, 2);
Command cmdScreen3 = new Command("SCREEN3", Command.SCREEN, 3);
Command cmdItem1 = new Command("ITEM1", Command.ITEM, 1);
Command cmdItem2 = new Command("ITEM2", Command.ITEM, 1);
Command cmdItem3 = new Command("ITEM3", Command.ITEM, 1);
Command cmdExit2 = new Command("EXIT2", Command.EXIT, 1);
Command cmdExit1 = new Command("EXIT1", Command.EXIT, 2);
public CommandPriority() {
super();
// TODO Auto-generated constructor stub
}
//同等级别的命令按钮,Priority决定重要程度,越小的重要程度越大,出现位置越靠前
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
frmMain.addCommand(cmdScreen3);
frmMain.addCommand(cmdScreen2);
frmMain.addCommand(cmdScreen1);
frmMain.addCommand(cmdItem3);
frmMain.addCommand(cmdItem2);
frmMain.addCommand(cmdItem1);
frmMain.addCommand(cmdExit1);
frmMain.addCommand(cmdExit2);
display.setCurrent(frmMain);
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0)
throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
}
运行界面:
图4.4 1.6
命令按钮的主要功能就是处理用户的操作,当用户按下某个键时,跟这个键相关的命
令按钮就会收到这个按键事件。如果这个命令按钮注册了监听器(CommandListener),
那么这个事件就会被传送到监听器中进行处理。命令按钮的动作监听器为
CommandListener接口,包含在
javax.microedition.lcdui.CommandListener;
命令按钮监听器只有一个的方法
public void commandAction(Command c,Displayable d)
说明:参数 c是被按下的命令按钮,参数d是包含命令按钮c的Displayable显示对象
程序4~6: 说明:本程序演示命令按钮事件处理的一般方法。
public class TestListener extends MIDlet implements CommandListener {
public Display display;
public Form frmMain = new Form("退出按钮监听测试");
Command command1 = new Command("增加",Command.HELP,1);
public TestListener() {
// TODO Auto-generated constructor stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
frmMain.addCommand(command1);
frmMain.setCommandListener(this);
display.setCurrent(frmMain);
}
public void commandAction(Command c, Displayable d) {
// TODO Auto-generated method stub
if(c == command1){
frmMain.append("hello");
}
}
}
运行界面:
图4.5
注意:在CommandActionHandle中必须实现commandAction函数,用于处理命令按钮事件。
1.7 TextBox
TextBox可以允许用户输入姓名、电话号码、电子邮件地址、密码等文本信息,通常可
以作为一个文本编辑器使用。
1.7.1 TextBox
TextBox类继承于Screen。在MIDP2.0规范中,TextField也可以用于文本输入,与TextBox 类似,但是TextField通常被添加到表单Form 中使用,而TextBox可以单独作
为一个屏幕显示。
构造函数:
public TextBox(String title,String text,int maxSize,int comstraints)
其中:
1、title是TextBox的标题
2、text是TextBox内初始化字符串
3、maxSize用于指定TextBox中的最大可容纳的字符数。如果maxSize设置的值小于或
等于0,或text的字符数超过了maxSize定义,都会引发java.lang.IllegalArgumentException异常。用户输入的文本超过该值,则超过的文本将不
被接受,引发java.lang.IllegalArgumentException异常。 4、comstraints用于指定输入的约束,例如只接受数字0~9。该参数必须为TextField类
中定义的几个输入约束类型,否则会产生java.lang.IllegalArgumentException异常。
TextField.ANY表示接受任何类型的数据。
程序4~7:
说明:本程序演示使用TextBox输入文本。
package test;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class BoxTest extends MIDlet{
public Display display;
public TextBox tb = new TextBox("编辑消息","请输入消息",100,TextField.ANY);
public BoxTest() {
// TODO Auto-generated constructor stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
display.setCurrent(tb);
}
}
运行界面:
图4.6 注意:1、不同的手机设备中TextBox的显示不相同。
2、TextBox的最大字符数不是越大越好,设置过大的字符数可能占用更多的系统
资源。
1.7.2
1
TextBox中的文本,可以在创建TextBox对象时设置,也可以在创建了TextBox对象
后,通过setString函数或setChars函数设置。语法定义如下: 程序4~8:
说明:演示文本替换。
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
tb.setString("我们改变TextBox的默认字符串");
display.setCurrent(tb);
}
public void setString(String text)
text是新的字符串
public void setChars(char[] data,int offset,int length)
data是一个字符数组。参数offset是要插入的内容在字符数组中的起始位置。Length是
要插入的内容在字符数组data中从起始位置offset开始的长度。 程序4~9
说明:本程序演示字符。
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
String str = "我们用字符数组函数改变TextBox的默认字符串";
tb.setChars(str.toCharArray(), 0, 15);
display.setCurrent(tb);
}
2、获得用户输入
TextBox的文本可以通过getString函数或者getChars函数返回。
getString函数把TextBox的文本内容作为字符串返回;
getChars函数通过参数字符数组返回。
程序4~10:
说明:本程序演示用字符串函数改变TextBox的默认字符串。 protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
tb.setString("我们用字符串函数改变TextBox的默认字符串");
tb.setChars(tb.getString().toCharArray(), 0, 10);
display.setCurrent(tb);
//获得用户输入
int size = tb.size();
char[] data = null;
if(size > 0){
data = new char[size];
tb.getChars(data);
}
System.out.println(data);
}
注意:1、data不能为空,否则引发NullPointerException异常
2、data的长度不能小于文本内容,否则引发ArrayIndexOutOfBoundsException异常
运行界面:
在控制台输出:“我们用字符串函数改变”。
3、插入文本
TextBox提供了两个insert函数,用于插入字符串。其语法定义如下:
第一个insert函数:
public void insert(char[] data,int offset,int length,int position);
Data包含了要插入的字符/字符串,该参数不能为null,否则引发
NullPointerException;
offset表示被插入内容在字符数组data中的起始位置。
length是字符数组data中起始位置开始要被插入的字符数。Offset和length都必须
有效,否则会引发,IllegalArgumentException。
position表示插入字符的位置。
第二个insert函数:
public void insert(String src,int position);
参数src是要被插入的字符串;
position表示插入字符的位置。
程序4~11:
说明:本程序演示插入文本。
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
tb.setString("我们用字符串函数改变TextBox的默认字符串");
tb.setChars(tb.getString().toCharArray(), 0, tb.size());
System.out.println(tb.size());
String str = "在第三个字符处插入的文本:)";
tb.insert(str, tb.size()-1);
System.out.println(tb.size());
tb.insert(tb.getString().toCharArray(), 0,tb.size(), tb.size());
System.out.println(tb.size());
display.setCurrent(tb);
//获得用户输入
int size = tb.size();
char[] data = null;
if(size > 0){
data = new char[size];
tb.getChars(data);
}
System.out.println(data);
}
4、删除文本
删除文本可以通过deltete函数实现,其语法定义如下 public void delete(int offset,int length);
程序4~12:
说明:本程序演示先插入文本,再删除文本中的内容。 protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
display = Display.getDisplay(this);
tb.setString("我们用字符串函数改变TextBox的默认字符串");
tb.setChars(tb.getString().toCharArray(), 0, tb.size());
System.out.println(tb.size());
String str = "在第三个字符处插入的文本:)";
tb.insert(str, tb.size()-1);
System.out.println(tb.size());
tb.insert(tb.getString().toCharArray(), 0,tb.size(), tb.size());
System.out.println(tb.size());
System.out.println("光标的位置:"+tb.getCaretPosition());
tb.delete(5, 9);
display.setCurrent(tb);
}
参数offset表示要被删除内容的起始位置,参数length是从起始位置开始要被删除的字符数。
1.8
getCaretPosition函数可以返回光标的位置。 程序4~13
说明:本程序演示了光标在不同模拟器和设备中的差异 import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TextEditor extends MIDlet
implements CommandListener {
//Display管理
Display display = null;
//TextBox对象
TextBox tbMain = new TextBox("Text Editor", //设置标题
"", //设置内容
255, //设置最大字符数255
TextField.ANY); //可以接受任何输入
//创建命令按钮
//插入
Command cmdInsertFirst =
new Command("Insert at start", Command.SCREEN,1);
Command cmdInsertCurrent =
new Command("Insert at current", Command.SCREEN,1);
//删除
Command cmdDeleteFirstChar =
new Command("Delete First char", Command.SCREEN,1);
Command cmdDeleteLastChar =
new Command("Delete Last char", Command.SCREEN,1);
Command cmdDeletePreviousChar =
new Command("Delete previous char", Command.SCREEN,1);
//替换
Command cmdReplace =
new Command("Replace", Command.SCREEN,1);
//显示光标位置
Command cmdCaret =
new Command("Caret Position", Command.SCREEN,1);
Command cmdExit = new Command("Exit", Command.EXIT, 2);
//用于插入数字的计数器
int count = 0;
public void startApp() {
//设置Displayable对象
tbMain.setInitialInputMode("MIDP_UPPERCASE_LATIN");
tbMain.addCommand(cmdExit);
tbMain.addCommand(cmdCaret);
tbMain.addCommand(cmdInsertFirst);
tbMain.addCommand(cmdInsertCurrent);
tbMain.addCommand(cmdDeleteFirstChar);
tbMain.addCommand(cmdDeleteLastChar);
tbMain.addCommand(cmdDeletePreviousChar);
tbMain.addCommand(cmdReplace);
tbMain.setCommandListener(this);
//获得当前MIDlet的Display对象
display = Display.getDisplay(this);
//设置TextBox对象为当前显示对象
display.setCurrent(tbMain);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
/**
* 处理命令按钮事件
*/
public void commandAction(Command c, Displayable d) {
if (c == this.cmdExit) {
destroyApp(true);
notifyDestroyed();
} else if(c == this.cmdCaret) {
//光标位置
int caret = tbMain.getCaretPosition();
System.out.println("\n\nCaret Position: "+caret);
tbMain.setTitle("Caret Position: " + String.valueOf(caret));
}
else if(c == this.cmdInsertFirst) {
//在开始处插入一个字符
String str = Integer.toString(count++);
tbMain.insert(str, 0);
} else if (c == this.cmdInsertCurrent) {
//在当前位置插入字符
String str = Integer.toString(count++);
int caret = tbMain.getCaretPosition();
System.out.println("Caret Position:"+caret);
System.out.println("Insert:"+str);
tbMain.insert(str, caret);
} else if(c == this.cmdReplace) {
//替换
String str = Integer.toString(count++);
tbMain.setChars(str.toCharArray(), 0, str.length());
}else if(c == this.cmdDeleteFirstChar) {
//删除第一个字符
int size = tbMain.size();
if (size>0) {
//当没有字符时不能执行该功能
tbMain.delete(0, 1);
}
} else if(c == this.cmdDeleteLastChar) {
//删除最后一个字符
int size = tbMain.size();
if (size>0) {
//当没有字符时不能执行该功能
tbMain.delete(size-1, 1);
}
} else if(c == this.cmdDeletePreviousChar) {
//删除前一个字符
int caret = tbMain.getCaretPosition();
if (caret > 0) {
tbMain.delete(caret-1, 1);
}
}
}
}
运行界面
图4.7
注意:1、变量count是计算器,当前计数值将被插入到TextBox中。
2、在NokiaS40和S60中,首先输入一些字符串,如:“ABCD”,在将光标移动到第一个和第二个字符之间,选择Caret Position命令按钮,如果光标移动,则将光标重
新移动到第一个和第二个字符之间,选择Insert at current命令按钮。
3、按照2中的步骤执行,在WTK中没有正确的返回光标位置。 1.9 Ticker
滚动条是一段不停地连续滚动的文字,滚动条的滚动速度和滚动方向有手机的具体实
现决定。MIDP2.0规范中提供了Ticker类,封装了滚动条功能。Ticker类的构造函数语
法定义如下
public Ticker(String str);
注意:1、str是滚动的内容,且只能显示一行文本。
2、创建Ticker对象后,滚动条不会自动出现在屏幕上,需要使用setTicker函数
进行设置。
语法:
public void setTicker(Ticker ticker)
值为null,则删除当前滚动条,在程序中可以取消滚动条,但是不能停止滚动条。
setTicker函数是Displayable类的公有成员函数,因此在其子类中都可以设置滚动条,例如Alert、From、List、TextBox等。通过getTicker函数可以返回当前屏幕的Ticker对象。
程序4~14
说明:演示滚动条的使用方法。 public class TickerDemo extends MIDlet implements CommandListener {
//Display管理
Display display = null;
//TextBox对象
TextBox tbMain = new TextBox("Ticker Demo", "", 255, TextField.ANY);
//Ticker对象
Ticker ticker = new Ticker("This is the scrolling text");
//创建命令按钮
private Command cmdAddTicker =
new Command("Add Ticker", Command.SCREEN,1);
private Command cmdRemoveTicker =
new Command("Remove Ticker", Command.SCREEN,1);
private Command cmdSetTickerText =
new Command("Set Ticker Text", Command.SCREEN,1);
private Command cmdGetTickerText =
new Command("Get Ticker Text", Command.SCREEN,1);
private Command cmdExit = new Command("Exit", Command.EXIT, 2);
//计数器
int count = 1;
public TickerDemo() {
super();
// TODO Auto-generated constructor stub
}
protected void startApp() throws MIDletStateChangeException {
//设置Displayable对象
tbMain.addCommand(cmdExit);
tbMain.addCommand(cmdAddTicker);
tbMain.addCommand(cmdRemoveTicker);
tbMain.addCommand(cmdSetTickerText);
tbMain.addCommand(cmdGetTickerText);
tbMain.setCommandListener(this);
//获得当前MIDlet的Display对象
display = Display.getDisplay(this);
//设置TextBox对象为当前显示对象
display.setCurrent(tbMain);
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0)
throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
/**
* 处理命令按钮事件
*/
public void commandAction(Command c, Displayable d) {
if (c == this.cmdExit) {
notifyDestroyed();
} else if(c == this.cmdAddTicker) {
//显示滚动条
tbMain.setTicker(ticker);
} else if(c == this.cmdRemoveTicker) {
//删除滚动条
tbMain.setTicker(null);
} else if(c == this.cmdSetTickerText) {
ticker.setString(ticker.getString() + "\n" +
"第" + ++count + "行滚动文字");
} else if(c == this.cmdGetTickerText) {
tbMain.setString(tbMain.getTicker().getString());
}
}
}
运行界面:
图4.8
1.10
可以通过List类实现列表窗口。List包含在javax.microedition.lcdui 包中,父类为Screen。
1.10.1
列表窗口包括一些选项,这些选项的类型可以分为隐式类型、单选类型、多选类型. List类的构造函数有两个:
构造函数一:
public List(String title,int listType)
Title是空列表的标题。
listType是列表选项的类型或称列表的类型。有三种类型: IMPLICIT(互斥的,通过隐式按钮实现),EXCLUSIVE(单选)和MULTIPLE(多选)。
构造函数二:
public List(String title, int listType,String[] stringElements,Image[] imageElements)
StringElements是字符串数组,可以指定具体的列表选项。
imageElements可以指定具体的列表选项以及列表选项的图标。
程序4~15
说明:演示List的用法。
package test;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ListImplicitTest extends MIDlet {
Display display;
String ima[] ={"已拨电话","未接来电"};
Command command1;
Command command2;
Command command3;
List list;
public ListImplicitTest () {
// TODO Auto-generated constructor stub
command1 = new Command("确定",Command.OK,1);
command2 = new Command("退出",Command.EXIT,1);
command3 = new Command("返回",Command.BACK,1);
list = new List("通讯纪录",List.IMPLICIT,ima,null);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
list.addCommand(command1);
display = Display.getDisplay(this);
display.setCurrent(list);
}
}
运行界面:
图4.9 1.11 EXCLUSIVE
常量List.EXCLUSIVE,表示单选按钮。 程序4~16
说明:本程序演示了单选按钮的使用。 public ListImplicitTest () {
// TODO Auto-generated constructor stub
command1 = new Command("确定",Command.OK,1);
command2 = new Command("退出",Command.EXIT,1);
command3 = new Command("返回",Command.BACK,1);
list = new List("hello", List.EXCLUSIVE,ima,null);
}
运行界面
图4.10 1.12 MULTIPLE
程序4~17
说明:本程序演示多选按钮的使用方法,常量List.EXCLUSIVE public ListImplicitTest () {
// TODO Auto-generated constructor stub
command1 = new Command("确定",Command.OK,1);
command2 = new Command("退出",Command.EXIT,1);
command3 = new Command("返回",Command.BACK,1);
list = new List("hello", List.EXCLUSIVE,ima,null);
}
运行界面
图4.11 1.13
1、 隐式类型的列表窗口
在隐式类型的列表窗口中选项的选择是隐式进行的。用户可以在命令按钮事件的处理
函数中可以获得被选中的选项。在List类中提供了一个静态成员命令常量
SELECT_COMMAND,该命令按钮是作为默认的隐式命令按钮,当用户按下选择键后
会触发该命令按钮的动作。
public static final Command SELECT_COMMAND
SELECT_COMMAND命令按钮的标签为空;优先级为0;类型为SCREEN或ITEM。
程序4~18
说明:本程序演示了隐式类型的列表窗口中获取被选中选项的方法。
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class SelectImplicitList extends MIDlet implements CommandListener {
private Display display;
//定义List菜单的内容
private static String menuItems[] = {"List Item1",
"List Item2",
"List Item3",
"List Item4",
"List Item5"
};
private List lstImplicit = new List(
"IMPLICIT List", //标题
List.IMPLICIT, //隐式类型
menuItems, //设置列表内容
null); //列表不使用图标
//Exit
private Command cmdExit = new Command("Exit", Command.EXIT, 1);
public SelectImplicitList() {
super();
// TODO Auto-generated constructor stub
}
protected void startApp() throws MIDletStateChangeException {
//设置命令监听
lstImplicit.addCommand(cmdExit);
lstImplicit.setCommandListener(this);
//获得当前MIDlet的Display对象
display = Display.getDisplay(this);
//设置List对象为当前显示对象
display.setCurrent(lstImplicit);
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0)
throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
/**
* 处理命令按钮事件
*/
public void commandAction(Command c, Displayable d) {
if (c == List.SELECT_COMMAND) {
//获得被选中选项的索引
int index = this.lstImplicit.getSelectedIndex();
//获得被选中选择的内容
String str = this.lstImplicit.getString(index);
//显示在标题中
this.lstImplicit.setTitle("Item: '" + str + "' is selected");
} else if (c == this.cmdExit) {
notifyDestroyed();
}
}
}
MIDlet实现了CommandListener接口,用于处理隐式命令按钮事件。在创建隐式类型列表后,要通过setCommandListener函数设置命令按钮事件监听。当用户在界面上按下选择键后,会触发隐式命令按钮SELECT_COMMAND的动作,在commandAction函
数中可以捕捉到该事件进行处理。通过List类的成员getSelectIndex可以返回被选种选项
的索引,然后通过getString函数返回被选种选项的内容getString函数的语法定义如下:
public String getString(int elementNum)
其中,elementNum是要返回内容的选项索引。如果参数elementNum小于0或者
大于实际选项的个数,则会引发IndexOutOfBoundsException异常。获得被选中选项的
内容后,通过setTitle函数显示在列表的标题中。 程序4~19
protected void startApp() throws MIDletStateChangeException {
list.addCommand(command1);
list.addCommand(command2);
list.setSelectCommand(null);
list.setCommandListener(this);
display = Display.getDisplay(this);
display.setCurrent(list);
}
注意:
1、如果用户想自己创建选择命令按钮,可以通过Displayable的setSelectCommand
覆盖默认的隐式命令按钮。其函数语法定语如下
public void setSelectCommand(Command command)
其中,参数command是用户定义的命令按钮,该命令按钮将覆盖
SELECT_COMMAND,如果参数为null,按下选择命令按钮则不会有任何反应。
2、 如果列表窗口的类型不为IMPLICIT,那么调用setSelectCommand函数不会有
任何的作用
3、 多选类型的列列表窗口
获得多选类型列表的值可以使用如下步骤
1) 获得被选中选项的索引。
int index = this.lstImplicit.getSelectedIndex();
2) 获得被选中选项的内容
Sstring str = this.lstImplicit.getString(index);
3) 显示在标题中
this.lstImplicit.setTitle(“Item:’””+str+”’is selected”);
程序4~20
说明:演示在多选类型的列表窗口中被选中选项的获取方法 import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class SelectMultipleList extends MIDlet implements CommandListener {
private Display display;
//定义List菜单的内容
private static String menuItems[] = {"List Item1",
"List Item2",
"List Item3",
"List Item4",
"List Item5"
};
private List lstMultiple = new List(
"Multiple List", //标题
List.MULTIPLE, //隐式类型
menuItems, //设置列表内容
null); //列表不使用图标
//用于读取选中的选项
private Command cmdRead = new Command("Read", Command.SCREEN, 1);
//用于设置被选中的选项
private Command cmdSet = new Command("Set", Command.SCREEN, 1);
//全部选中
private Command cmdSelectAll = new Command("Select All",
Command.SCREEN, 1);
//Exit
private Command cmdExit = new Command("Exit", Command.EXIT, 1);
public SelectMultipleList() {
super();
// TODO Auto-generated constructor stub
}
protected void startApp() throws MIDletStateChangeException {
//设置命令监听
lstMultiple.addCommand(cmdExit);
lstMultiple.addCommand(cmdRead);
lstMultiple.addCommand(cmdSet);
lstMultiple.addCommand(cmdSelectAll);
lstMultiple.setCommandListener(this);
//获得当前MIDlet的Display对象
display = Display.getDisplay(this);
//设置List对象为当前显示对象
display.setCurrent(lstMultiple);
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void destroyApp(boolean arg0)
throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
/**
* 处理命令按钮事件
*/
public void commandAction(Command c, Displayable d) {
if (c == this.cmdRead) {
//读取选中的选项 - 方法1
System.out.println("读取选中的选项 - 方法1输出内容");
for (int i=0; i< lstMultiple.size(); i++) {
if (lstMultiple.isSelected(i)) {
String str = lstMultiple.getString(i);
System.out.println("Item: '" + str + "' is selected");
}
}
//读取选中的选项 - 方法2
System.out.println("\n\n读取选中的选项 - 方法2输出内容");
boolean flags[] = new boolean[lstMultiple.size()];
lstMultiple.getSelectedFlags(flags);
for (int i=0; i< flags.length; i++) {
if (flags[i]) {
String str = lstMultiple.getString(i);
System.out.println("Item: '" + str + "' is selected");
}
}
} else if (c == this.cmdSet) {
//设置选中的内容 - 方法1
lstMultiple.setSelectedIndex(0, true);
lstMultiple.setSelectedIndex(1, true);
lstMultiple.setSelectedIndex(2, true);
lstMultiple.setSelectedIndex(3, false);
lstMultiple.setSelectedIndex(4, false);
//设置选中的内容 - 方法2
//boolean flags[] = {true, true, true, false, false};
//lstMultiple.setSelectedFlags(flags);
} else if (c == this.cmdSelectAll) {
//全选,下面的算法在选项很多时或者无法预先知道选项个数时有意义
boolean flags[] = new boolean[lstMultiple.size()];
for (int i=0;i