作者:stone111 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=276
我们在这一节要介绍一下整个LCDUI包的结构,让读者对我们整个UI的学习的有个大致的了解。下图为我们展示了整个LCDUI包的体系:
Screen类属于高级图形用户界面组件,就是我们这一章要着重介绍的内容,Canvas是低级图形用户界面组件,在同一时刻,只能有唯一一个Screen或者Canvas类的子类显示在屏幕上,我们可以调用Display的setCurrent()的方法来将前一个画面替换掉,我们必须自行将前一个画面的状态保留起来,并自己控制整个程序画面的切换。
同时我们可以运用javax.microedition.lcdui.Command类来给我们的提供菜单项目的功能,分别是:Command.BACKCommand、Command.CANCEL、Command.EXIT、Command.HELP、Command.ITEM、Command.OK、Command.SCREEN和Command.STOP,我们在Displayable对象中定义了addCommand()和removeCommand()两个方法,这就意味着我们可以在高级UI和低级UI中同时使用Command类,同时我们通过注册Command事件来达到事件处理的目的,即Command必须与CommandListener接口配合使用才能反映用户的动作,具体的使用方法我们在具体的示例中会给出详细的用法,读者可以参阅API的说明文档获得进一步的认识。
还有在Displayable类的子类中都加入了Ticker,我们可以用setTicker()来设定画面上的Ticker,或者用getTicker()这个方法来取得画面所含的Ticker对象。
下面我们给出Screen类的主要结构图:
根据第零节的概述我们已经大概了解了Lcdui这个包,现在让我们来开始介绍Screen这个类里面的几个重要的类,我们本节介绍的是Screen的一个子类List,它一共有三种具体的类型:implicit(简易式),exclusive(单选式),multiple(多选式)。
与相关的List元素相关的应用程序操作一般可概括为ITEM型命令(在后续章节将会有详细介绍)或者SCREEN类型命令,其作用域范围的判断依据是看该操作是影响到被选择原则元素还是整个List来判定,List对象上的操作包括insert,append和delete,用于约束List具体类型的类是ChoiceGroup,List中的元素可以用getString、insert、set、append、delete、getImage等方法来具体操纵,对于项目的选择我们则使用getSelectedIndex()、setSelectedIndex()、getSelectedFlags()、setSelectedFlags()和isSelected()来处理,下面我们来详细介绍一下第一段提到的三个List类型。
和所有的List一样,我们可以在构造函数中指定它的标题和类型(构造函数类型1),也可以使用另一种构造函数类型,即直接传入一个String数组和一个Image数组,这种构造函数可以直接对List内容进行初试化(构造函数类型2),在我们进行的大多数开发中,类型1的使用是比较常见的,读者可以通过阅读API说明文档对其进行深入的掌握。
在类型1当中,我们需要对其增加内容的时候,就需要用到前面提到的append()方法了,该构造函数的第一个参数是屏幕上的文字,第二个则是代表选项的图标,当不需要图标的时候,和我们大多数的处理方法相同,只需传入NULL这个参数就行了,任何时候我们可以用insert()方法来插入项目,用set()方法来来重新设置一个项目,当我们不需要一个项目的时候,可以用delete()方法来删除特定的选项,我们只需往该方法内传入索引值即可,需要注意的是我们的索引值是从0开始,deleteAll()这个方法则是一次性删除所有的指定List的内容。
我们在命令处理函数commandAction()中,可以用上面提到的几种方法来对用户选择的操作进行侦测,同时定义好对应的处理函数,来达到对应的处理效果。
IMPLICIT(隐含式)其实和上面的单选式没什么大的区别,唯一不同的地方在于命令的处理机制上有一些细微的区别:Choice.IMPLICIT类型的List会在用户选择之后立刻引发事件,并将List.SELECTCOMMAND作为第一个参数传入。
如果我们不希望该类型的List在按下后发出该命令作为commandAction ()的第一个参数传入,我们可以用setSelectCommand(null),将它关掉,需要注意的是,这样做的后果是使commandAction()接受到的第一个参数为null。
multiple(多选式)类型的List顾名思义,可以进行多重选择,其他的地方和上面两种类型大同小异,可以进行多项的List选择。
下面我们以WTK2.1自带的DEMO为例,通过一段代码来加深巩固我们这一小节的内容:
public class ListDemoextends MIDlet implements CommandListener
{
//这里注意如何使用
//CommandListener这个接口
private final static Command CMD_EXIT = new Command("Exit", Command.EXIT, 1);
private final static Command CMD_BACK = new Command("Back", Command.BACK, 1);
private Display display;
private List mainList;
private List exclusiveList;
private List implicitList;
private List multipleList;
private boolean firstTime;
public ListDemo() {
display = Display.getDisplay(this);
String[] stringArray = {
"Option A",
"Option B",
"Option C",
"Option D"
};
//待传入进行初始化的String数组,即Choice选项的文字部分。
Image[] imageArray = null;
//我们这里只是为Image[]数组进行初始化。
exclusiveList = new List("Exclusive", Choice.EXCLUSIVE, stringArray,
imageArray);
exclusiveList.addCommand(CMD_BACK);
exclusiveList.addCommand(CMD_EXIT);
exclusiveList.setCommandListener(this);
//ExlcusiveList的声明
implicitList = new List("Implicit", Choice.IMPLICIT, stringArray,
imageArray);
implicitList.addCommand(CMD_BACK);
implicitList.addCommand(CMD_EXIT);
implicitList.setCommandListener(this);
//ImplicitList的声明
multipleList = new List("Multiple", Choice.MULTIPLE, stringArray,
imageArray);
multipleList.addCommand(CMD_BACK);
multipleList.addCommand(CMD_EXIT);
multipleList.setCommandListener(this);
//MutipleList的声明
firstTime = true;
}
protected void startApp() {
if(firstTime)
Image[] imageArray = null;
try
{
Image icon = Image.createImage("/midp/uidemo/Icon.png");
//注意!这里的路径是相对路径,请大家千万注意这里的细节问题
imageArray = new Image[] {
icon,
icon,
icon
};
} catch (java.io.IOException err) {
// ignore the image loading failure the application can recover.
}
String[] stringArray = {
"Exclusive",
"Implicit",
"Multiple"
};
mainList = new List("Choose type", Choice.IMPLICIT, stringArray,
imageArray);
mainList.addCommand(CMD_EXIT);
mainList.setCommandListener(this);
display.setCurrent(mainList);
firstTime = false;
}
}
protected void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
public void commandAction(Command c, Displayable d) {
//注意这里是如何实现CommandListener这个接口的!
if (d.equals(mainList)) {
if (c == List.SELECT_COMMAND) {
if (d.equals(mainList)) {
switch (((List)d).getSelectedIndex()) {
case 0:
display.setCurrent(exclusiveList);
break;
case 1:
display.setCurrent(implicitList);
break;
case 2:
display.setCurrent(multipleList);
break;
}
}
}
} else {
// in one of the sub-lists
if (c == CMD_BACK) {
display.setCurrent(mainList);
}
}
if (c == CMD_EXIT) {
destroyApp(false);
notifyDestroyed();
}
}
}
当我们要在移动设备上输入数据时,TextBox就派上用场了,我们可以TextBox的构造函数参数共有四个,第一个是我们长说的Title,即标题,第二个是TextBox的初始内容,第三个是允许输入字符的最大长度,第四个是限制类型,关于限制类型我们一般按照限制存储内容和限制系统的类型分为两种,这两种各有6个具体的类型,大家可以参阅API说明文档,获得具体类型的运用,在这里我想要提醒读者注意的一点是:一个TextBox必须附加一个命令,否则,用户将不能激发任何行为,而陷入这个TextBox中。
我们给出一个常见的TextBox的例子,让大家进一步了解一下TextBox:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class TextBoxDemo
extends MIDlet
implements CommandListener {
private Display display;
private ChoiceGroup types;
private ChoiceGroup options;
private Form mainForm;
private final static Command CMD_EXIT = new Command("Exit",
Command.EXIT, 1);
private final static Command CMD_BACK = new Command("Back",
Command.BACK, 1);
private final static Command CMD_SHOW = new Command("Show", Command.SCREEN,
1);
/** TextBox的labels
*
*/
static final String[] textBoxLabels = {
"Any Character", "E-Mail", "Number", "Decimal", "Phone", "Url"
};
/**
* 这里列出了几种TextBox的Types
*/
static final int[] textBoxTypes = {
TextField.ANY, TextField.EMAILADDR, TextField.NUMERIC,
TextField.DECIMAL, TextField.PHONENUMBER, TextField.URL
};
private boolean firstTime;
public TextBoxDemo() {
display = Display.getDisplay(this);
firstTime = true;
}
protected void startApp() {
if(firstTime) {
mainForm = new Form("Select a Text Box Type");
mainForm.append("Select a text box type");
// the string elements will have no images
Image[] imageArray = null;
types = new ChoiceGroup("Choose type", Choice.EXCLUSIVE,
textBoxLabels, imageArray);
mainForm.append(types);
// 进一步选择的选项
String[] optionStrings = { "As Password", "Show Ticker" };
options = new ChoiceGroup("Options", Choice.MULTIPLE,
optionStrings, null);
mainForm.append(options);
mainForm.addCommand(CMD_SHOW);
mainForm.addCommand(CMD_EXIT);
mainForm.setCommandListener(this);
firstTime =false;
}
display.setCurrent(mainForm);
}
protected void destroyApp(boolean unconditional) { /*抛出异常throws MIDletStateChangeException*/
}
protected void pauseApp() {
}
public void commandAction(Command c, Displayable d) {
if (c == CMD_EXIT) {
destroyApp(false);
notifyDestroyed();
} else if (c == CMD_SHOW) {
// these are the images and strings for the choices.
Image[] imageArray = null;
int index = types.getSelectedIndex();
String title = textBoxLabels[index];
int choiceType = textBoxTypes[index];
boolean[] flags = new boolean[2];
options.getSelectedFlags(flags);
if (flags[0]) {
choiceType |= TextField.PASSWORD;
}
TextBox textBox = new TextBox(title, "", 50,
choiceType);
if (flags[1]) {
textBox.setTicker(new Ticker("TextBox: " + title));
}
textBox.addCommand(CMD_BACK);
textBox.setCommandListener(this);
display.setCurrent(textBox);
} else if (c == CMD_BACK) {
display.setCurrent(mainForm);
}
}
}
这个类比较有意思,它是用来提醒用户关于错误或者其他异常情况的屏幕对象,这个警告只能作为简短的信息记录和提醒,如果我们需要长一点的,我们可以使用其它的Screen子类,最常见的是Form。同时我们顺便提一下跟它相关的一个类AlertType,需要提醒读者注意的一点是AlertType是一个本身无法实体化的工具类。(即我们不能象Form那样产生具体的对象)
AlertType共有5个类型:ALARM(警报),CONFIRMATION(确定),ERROR(错误),INFO(信息提示),WARNING(警告)。
Alert是一个比较特殊的屏幕对象,当我们在setCurrent()方法中调用它的时候,它会先发出一段警告的声音,然后彩绘显示在屏幕上,过了一段时间之后,它会自动跳回之前的画面。
我们需要注意的是我们必须在使用setCurrent()显示Alert之前定义好它可以跳回的画面,否则会发生异常。
在Alert中我们可以通过setTimeout()方法来设定间隔的时间,setType()来调用我们上面提到的四种类型,setImage()来定义图片,setString()来定义内含文字,同时通过getType(),getImage(),getString()来取得相应的对象。
当Alert显示了我们在setTimeout()中指定的间隔时间后,它会跳回我们之前指定的对象,如果我们在指定显示时间时传入了Alert.FOREVER作为参数,这时,除非用户按下定义哈哦的接触键,否则,屏幕会一直显示这个Alert。如果在一个定时的Alert中只有一个命令,那么超时发生时命令会自动激活。
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class AlertDemo
extends MIDlet {
private final static Command CMD_EXIT = new Command("Exit", Command.EXIT,
1);
private final static Command CMD_SHOW = new Command("Show", Command.SCREEN,
1);
private final static String[] typeStrings = {
"Alarm", "Confirmation", "Error", "Info", "Warning"
};
private final static String[] timeoutStrings = {
"2 Seconds", "4 Seconds", "8 Seconds", "Forever"
};
private final static int SECOND = 1000;
private Display display;
private boolean firstTime;
private Form mainForm;
public AlertDemo() {
firstTime = true;
mainForm = new Form("Alert Options");
}
protected void startApp() {
display = Display.getDisplay(this);
showOption();
}
/**
* 制造这个MIDlet的基本显示
* 在这个Form里面我们可以选择Alert的个中类型和特性
*/
private void showOption() {
if(firstTime) {
// choice-group for the type of the alert:
// "Alarm", "Confirmation", "Error", "Info" or "Warning"
ChoiceGroup types = new ChoiceGroup("Type", ChoiceGroup.POPUP,
typeStrings, null);
mainForm.append(types);
// choice-group for the timeout of the alert:
// "2 Seconds", "4 Seconds", "8 Seconds" or "Forever"
ChoiceGroup timeouts = new ChoiceGroup("Timeout", ChoiceGroup.POPUP,
timeoutStrings, null);
mainForm.append(timeouts);
// a check-box to add an indicator to the alert
String[] optionStrings = { "Show Indicator" };
ChoiceGroup options = new ChoiceGroup("Options", Choice.MULTIPLE,
optionStrings, null);
mainForm.append(options);
mainForm.addCommand(CMD_SHOW);
mainForm.addCommand(CMD_EXIT);
mainForm.setCommandListener(new AlerListener(types, timeouts, options));
firstTime = false;
}
display.setCurrent(mainForm);
}
private class AlerListener
implements CommandListener {
AlertType[] alertTypes = {
AlertType.ALARM, AlertType.CONFIRMATION, AlertType.ERROR,
AlertType.INFO, AlertType.WARNING
};
ChoiceGroup typesCG;
int[] timeouts = { 2 * SECOND, 4 * SECOND, 8 * SECOND, Alert.FOREVER };
ChoiceGroup timeoutsCG;
ChoiceGroup indicatorCG;
public AlerListener(ChoiceGroup types, ChoiceGroup timeouts,
ChoiceGroup indicator) {
typesCG = types;
timeoutsCG = timeouts;
indicatorCG = indicator;
}
public void commandAction(Command c, Displayable d) {
if (c == CMD_SHOW) {
int typeIndex = typesCG.getSelectedIndex();
Alert alert = new Alert("Alert");
alert.setType(alertTypes[typeIndex]);
int timeoutIndex = timeoutsCG.getSelectedIndex();
alert.setTimeout(timeouts[timeoutIndex]);
alert.setString(
typeStrings[typeIndex] + " Alert, Running " + timeoutStrings[timeoutIndex]);
boolean[] SelectedFlags = new boolean[1];
indicatorCG.getSelectedFlags(SelectedFlags);
if (SelectedFlags[0]) {
Gauge indicator = createIndicator(timeouts[timeoutIndex]);
alert.setIndicator(indicator);
}
display.setCurrent(alert);
} else if (c == CMD_EXIT) {
destroyApp(false);
notifyDestroyed();
}
}
}
protected void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
/**
* 我们在这里生成Alert的indicator.
* 如果这里没有timeout, 那么这个indicator 将是一个 "非交互性的" gauge
* 用有一个后台运行的thread更新.
*/
private Gauge createIndicator(int maxValue) {
分享到:
相关推荐
**J2ME中文教程 MIDP2.0** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机和智能家电。MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了...
### J2ME中文教程MIDP 2.0 #### 概述 本文档旨在提供一个全面且深入的Java 2 Micro Edition (J2ME)的MIDP 2.0教程,尤其针对移动设备开发。J2ME是Sun Microsystems(现已被Oracle收购)为嵌入式和消费类电子产品...
**J2ME高级UI总结** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备上的应用程序开发。在J2ME中,UI(用户界面)的设计和实现对于提供良好的用户体验至关重要。本文将深入探讨...
第三章“MIDP 高级UI 的使用”介绍了MIDP 的可移植UI API,我们称之为高级UI。这 样您的应用就可以栩栩如生了。 第四章“MIDP 低级UI 的使用” 介绍了MIDP 的不可移植UI API,我们称之为低级UI。 利用他你可以更加...
**J2ME游戏开发包MIDP2使用详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。MIDP(Mobile Information Device Profile)是J2ME的一...
3. **兼容性问题**:不同的J2ME设备可能对MIDP和CLDC的支持程度不同,需要广泛的设备测试。 4. **安全性**:在处理敏感的文件操作时,需要确保应用的安全性,防止恶意操作。 总之,"J2ME文件浏览器(MIDP版本)"是...
第三章“MIDP高级UI 的使用”介绍了MIDP的可移植UI API,我们称之为高级UI。这样您的应用就可以栩栩如生了。 第四章“MIDP低级UI的使用” 介绍了MIDP的不可移植UI API,我们称之为低级UI。利用他你可以更加自由的...
第三章“MIDP 高级UI 的使用”介绍了MIDP 的可移植UI API,我们称之为高级UI。这 样您的应用就可以栩栩如生了。 第四章“MIDP 低级UI 的使用” 介绍了MIDP 的不可移植UI API,我们称之为低级UI。 利用他你可以更加...
4. **用户界面(UI)组件**:J2ME提供了一些基础的UI组件,如Canvas(画布)用于自定义绘图,Displayable(显示元素)作为UI的基本单位,ChoiceGroup(选择组)和TextBox(文本框)用于用户输入。 5. **网络通信**...
通过这个J2ME中文教程,开发者不仅可以学习到J2ME的基本概念和使用方法,还能通过实际的代码示例深化理解和提升技能。无论你是初学者还是有一定经验的开发者,都可以从这个教程中受益匪浅,为你的移动应用开发之路...
第三章“MIDP高级UI 的使用”介绍了MIDP的可移植UI API,我们称之为高级UI。这样您的应用就可以栩栩如生了。 第四章“MIDP低级UI的使用” 介绍了MIDP的不可移植UI API,我们称之为低级UI。利用他你可以更加自由的...
总结,J2ME中文教程涵盖了从基础理论到实际开发的各个方面,旨在帮助开发者理解J2ME的体系结构,掌握开发技能,并能运用到实际项目中,创建高效、用户友好的移动应用程序。通过学习本教程,你将能够充分利用J2ME的...
6. **用户界面(UI)编程**:J2ME的UI通常基于 Lightweight User Interface Toolkit (LWUIT) 或者 MIDP的Canvas类。LWUIT提供了更丰富的图形和组件库,可以创建更美观的用户界面。 7. **网络编程**:MIDP提供了...
这个J2ME中文教程涵盖了J2ME平台的基础知识、开发实践以及高级特性。无论是初学者还是有经验的开发者,都能从中受益,提升自己在移动开发领域的技能。通过学习和实践,你可以创建出适应不同设备特性的、功能丰富的...
**J2ME高级UI编程源码详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于移动设备、嵌入式系统等资源有限的设备上进行应用程序开发。在J2ME中,创建用户界面(UI)是一项关键任务,它直接影响到...
对于初学者,J2ME中文教程会从基础知识开始,逐步讲解MIDP的概念、API使用、网络编程和用户界面设计,再到高级主题如优化和设备适配。通过深入学习和实践,开发者可以掌握开发高质量J2ME应用的技能。 总的来说,...
源代码示例详细介绍MIDP高层UI,具体如下: 1、入门 2、介绍J2ME和MIDP 3、事件处理 4、Display、Displayable和Screens对象 5、Form和Item组件 6、List、TextBox、Alert和Ticker 7、结束语和参考资料
**J2ME开发教程全集概述** J2ME(Java 2 Micro Edition)是Java平台的一个子集,专为资源有限的嵌入式设备,如移动电话、PDA和家用电器设计。它提供了运行Java应用程序的环境,使开发者能够创建跨平台的应用程序,...
Java 2 Micro Edition(J2ME)是一...通过这个J2ME中文教程,你可以逐步掌握移动设备开发的基础,从创建简单的应用到构建复杂的系统。不断实践和探索,你将成为一名熟练的J2ME开发者。祝你在学习过程中取得丰硕的成果!