- 浏览: 22101840 次
- 性别:
- 来自: 杭州
最新评论
-
ZY199266:
配置文件还需要额外的配置ma
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
ZY199266:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我又一个问题就是 如果像你的这种形式写。配置文件还需要额外的 ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
y1210251848:
你的那个错误应该是项目所使用的目标框架不支持吧
log4net配置(web中使用log4net,把web.config放在单独的文件中)
我们在这一节要介绍一下整个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类型。
3.2.1 Exclusive(单选式)
和所有的List一样,我们可以在构造函数中指定它的标题和类型(构造函数类型1),也可以使用另一种构造函数类型,即直接传入一个String数组和一个Image数组,这种构造函数可以直接对List内容进行初试化(构造函数类型2),在我们进行的大多数开发中,类型1的使用是比较常见的,读者可以通过阅读API说明文档对其进行深入的掌握。
在类型1当中,我们需要对其增加内容的时候,就需要用到前面提到的append()方法了,该构造函数的第一个参数是屏幕上的文字,第二个则是代表选项的图标,当不需要图标的时候,和我们大多数的处理方法相同,只需传入NULL这个参数就行了,任何时候我们可以用insert()方法来插入项目,用set()方法来来重新设置一个项目,当我们不需要一个项目的时候,可以用delete()方法来删除特定的选项,我们只需往该方法内传入索引值即可,需要注意的是我们的索引值是从0开始,deleteAll()这个方法则是一次性删除所有的指定List的内容。
我们在命令处理函数commandAction()中,可以用上面提到的几种方法来对用户选择的操作进行侦测,同时定义好对应的处理函数,来达到对应的处理效果。
3.2.2 Implicit (隐含式)
IMPLICIT(隐含式)其实和上面的单选式没什么大的区别,唯一不同的地方在于命令的处理机制上有一些细微的区别:Choice.IMPLICIT类型的List会在用户选择之后立刻引发事件,并将List.SELECTCOMMAND作为第一个参数传入。
如果我们不希望该类型的List在按下后发出该命令作为commandAction ()的第一个参数传入,我们可以用setSelectCommand(null),将它关掉,需要注意的是,这样做的后果是使commandAction()接受到的第一个参数为null。
3.2.3 Multiple(多选式)
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) {
if (maxValue == Alert.FOREVER) {
return new Gauge(null, false, Gauge.INDEFINITE,
Gauge.CONTINUOUS_RUNNING);
}
final int max = maxValue / SECOND;
final Gauge indicator = new Gauge(null, false, max, 0);
// if (maxValue != Gauge.INDEFINITE) {
new Thread() {
public void run() {
int value = 0;
while (value < max) {
indicator.setValue(value);
++value;
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
// ignore
}
}
}
}.start();
}
return indicator;
}
}
3.5 Form概述
Form是J2ME里面一个比较重要的容器类型,可以说是集中了高级UI中的精华,是开发当中常常用到的一个关键类,下图很好的说明了FORM及其相关子类的关系:
我们通常是往Form里面添加个中Item的子类(使用append()方法),从而达到让画面更加丰富的目的,每一个Item的子类在同一时刻只能属于同一个容器,否则会引发异常。
在Form画面中,我们通过Item.LAYOUT_LEFT、Item.LAYOUT_CENTER和Item.LAYOUT_RIGHT来控制各个Item在Form的位置,通过这几个参数的字面意思我们很容易明白分别是左,中,右。在不设定的情况下,Item会依照LAYOUT_DEFAULT来绘制,如果我们希望自己来设定等效线,可以用setLayout()这个方法来控制。
同时,Form缺省的设定会在空间足够的情况下,尽可能让Item出现在同一个逻辑区域中。如果组件在显示时,比我们预期的最大的尺寸要大(或比预期最小尺寸更小),那么系统会自动忽略我们之前的设定,转而采用最大尺寸或者最小尺寸,这时系统会自动调用setPreferredSize(),将预期尺寸设置好。
3.6 StringItem及ImageItem
StringItem的作用,从它字面上意思来看就可以很明白,就是在屏幕上显示一串字,配合不同的外观类型, StringItem有两个构造函数,最长见的是需要三个参数的,第一个是Label,第二个是内容,第三个则是外观,外观共分三种:PLAIN,BUTTON,HYPERLINK,(只需两个参数的构造函数等同于使用PLAIN的外观的三个参数的构造函数),对于外观的提取,我们可以使用getAppearanceMode()取得,以此类推,需要修改/得到相应的参数只需进行相应的set/get操作即可。
我们可以把Item和其他的高级UI部分结合起来,这样也是对我们学习的一种促进:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class StringItemDemo
extends MIDlet
implements CommandListener, ItemCommandListener {
private Display display;
private Form mainForm;
private final static Command CMD_GO = new Command("Go", Command.ITEM, 1);
private final static Command CMD_PRESS = new Command("Press", Command.ITEM, 1);
private final static Command CMD_EXIT = new Command("Exit", Command.EXIT, 1);
protected void startApp() {
display = Display.getDisplay(this);
mainForm = new Form("String Item Demo");
mainForm.append("This is a simple label");
StringItem item = new StringItem("This is a StringItem label: ",
"This is the StringItems text");
mainForm.append(item);
item = new StringItem("Short label: ", "text");
mainForm.append(item);
item = new StringItem("Hyper-Link ", "hyperlink", Item.HYPERLINK);
item.setDefaultCommand(CMD_GO);
item.setItemCommandListener(this);
mainForm.append(item);
item = new StringItem("Button ", "Button", Item.BUTTON);
item.setDefaultCommand(CMD_PRESS);
item.setItemCommandListener(this);
mainForm.append(item);
mainForm.addCommand(CMD_EXIT);
mainForm.setCommandListener(this);
display.setCurrent(mainForm);
}
public void commandAction(Command c, Item item) {
if (c == CMD_GO) {
String text = "Go to the URL...";
Alert a = new Alert("URL", text, null, AlertType.INFO);
display.setCurrent(a);
} else if (c == CMD_PRESS) {
String text = "Do an action...";
Alert a = new Alert("Action", text, null, AlertType.INFO);
display.setCurrent(a);
}
}
public void commandAction(Command c, Displayable d) {
destroyApp(false);
notifyDestroyed();
}
protected void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
}
下面我们来看ImageItem,ImageItem和StringItem其实区别仅仅在于一个是显示图像,一个是文字,它同样有两个构造函数,其中用到最多的是5个参数的构造函数,第一个是该Item的Label,第二个是图片,第三个是等效线,第四个是取代的文字(图片无法现实时),第五个是外观(和StringItem相同)。
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ImageItemMIDlet extends MIDlet
implements ItemCommandListener
{
private Display display;
public ImageItemMIDlet()
{
display = Display.getDisplay(this);
}
public void startApp()
{
Image img = null ;
try
{
img = Image.createImage("/pic.png") ;
}catch(Exception e){}
Form f = new Form("ImageItem测试") ;
f.append(img) ;
ImageItem ii1 =
new ImageItem("图片1",img,
Item.LAYOUT_CENTER|Item.LAYOUT_NEWLINE_BEFORE,"图片1取代文字",Item.BUTTON);
f.append(ii1) ;
ImageItem ii2 =
new ImageItem("图片2",img,
Item.LAYOUT_RIGHT|Item.LAYOUT_NEWLINE_BEFORE,"图片2取代文字",Item.HYPERLINK);
f.append(ii2) ;
display.setCurrent(f);
}
public void commandAction(Command c,Item i)
{
System.out.println(c.getLabel());
System.out.println(i.getLabel());
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}
CustomItem是Item中一个比较重要的子类,它最大的优点是提高了Form中的可交互性。它和Canvas有很大的相似处。我们通过改写CustomItem可以实现完全控制在新的子类中条目区域的显示,它可以定义使用的颜色,字体和图形,包括特殊高亮的条目可能有的所有的焦点状态,只有条目的Label是有系统控制生成的,但是Label总是生成在CustomItem的内容区域外。
每个CustomItem都负责把它的行为与目标设备上可用的交互模式匹配。一个CustomItem调用方法来观察特定设备所支持的交互模式,这个方法会返回一个支持模式的位标记,支持的模式会的返回对应位会被设置,不支持的不被设置。
CustomItem一个比较重要的特性即是Form内部的遍历,即实现可能临时把遍历的责任委派给Item本身,这样可以实现特殊的高亮,动画等等效果。
由于customItem在Form类里扮演很重要的角色,其内容很庞杂,我们通过三个代码段来教读者如何使用CustomItem,希望大家通过对代码的深刻认识,提高自己对CustomItem的掌握程度。
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class CustomItemDemo extends MIDlet implements CommandListener {
private final static Command CMD_EXIT = new Command("Exit", Command.EXIT, 1);
private Display display;
private boolean firstTime;
private Form mainForm;
public CustomItemDemo() {
firstTime = true;
mainForm = new Form("Custom Item");
}
protected void startApp() {
if(firstTime) {
display = Display.getDisplay(this);
mainForm.append(new TextField("Upper Item", null, 10, 0));
mainForm.append(new Table("Table", Display.getDisplay(this)));
mainForm.append(new TextField("Lower Item", null, 10, 0));
mainForm.addCommand(CMD_EXIT);
mainForm.setCommandListener(this);
firstTime = false;
}
display.setCurrent(mainForm);
}
public void commandAction(Command c, Displayable d) {
if (c == CMD_EXIT) {
destroyApp(false);
notifyDestroyed();
}
}
protected void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
}
import javax.microedition.lcdui.*;
public class Table
extends CustomItem
implements ItemCommandListener {
private final static Command CMD_EDIT = new Command("Edit",
Command.ITEM, 1);
private Display display;
private int rows = 5;
private int cols = 3;
private int dx = 50;
private int dy = 20;
private final static int UPPER = 0;
private final static int IN = 1;
private final static int LOWER = 2;
private int location = UPPER;
private int currentX = 0;
private int currentY = 0;
private String[][] data = new String[rows][cols];
// Traversal stuff
//indicating support of horizontal traversal internal to the CustomItem
boolean horz;
//indicating suppor
相关推荐
第三章“MIDP 高级UI 的使用”介绍了MIDP 的可移植UI API,我们称之为高级UI。这 样您的应用就可以栩栩如生了。 第四章“MIDP 低级UI 的使用” 介绍了MIDP 的不可移植UI API,我们称之为低级UI。 利用他你可以更加...
1. **用户界面(UI)设计**:J2ME使用MIDP(Mobile Information Device Profile)作为其UI框架,通过Canvas类创建自定义图形界面。源码中的界面设计展示了如何绘制游戏面板,以及如何处理用户的触摸或按键输入。 2....
第三章“MIDP高级UI 的使用”介绍了MIDP的可移植UI API,我们称之为高级UI。这样您的应用就可以栩栩如生了。 第四章“MIDP低级UI的使用” 介绍了MIDP的不可移植UI API,我们称之为低级UI。利用他你可以更加自由的...
第三章“MIDP 高级UI 的使用”介绍了MIDP 的可移植UI API,我们称之为高级UI。这 样您的应用就可以栩栩如生了。 第四章“MIDP 低级UI 的使用” 介绍了MIDP 的不可移植UI API,我们称之为低级UI。 利用他你可以更加...
第三章“MIDP高级UI 的使用”介绍了MIDP的可移植UI API,我们称之为高级UI。这样您的应用就可以栩栩如生了。 第四章“MIDP低级UI的使用” 介绍了MIDP的不可移植UI API,我们称之为低级UI。利用他你可以更加自由的...
总之,Java移动通信程序设计——J2ME MIDP是开发移动设备应用的重要技术,通过学习和实践,开发者可以为各种小型设备创建功能丰富的应用程序。虽然现在随着智能手机和Android、iOS等现代操作系统的发展,MIDP的应用...
**J2ME中文教程——移动开发的基石** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,尤其是移动设备如手机和智能手表等设计。本教程专注于J2ME在移动开发中的应用,特别是针对MIDP...
**J2ME游戏开发之RPG——源码详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。在J2ME中开发角色扮演游戏(RPG)是一项挑战性的任务,...
**J2ME(Java 2 Micro Edition)实用教程——手机游戏开发** J2ME是Java平台的一个重要组成部分,主要用于嵌入式系统,如移动设备、智能家电等。它提供了丰富的功能,让开发者能够构建功能强大的应用程序,特别是...
**J2ME手机游戏MIDP1.0游戏入门** ...通过学习这个教程,初学者将掌握MIDP1.0的基础知识,能够创建出自己的第一个手机游戏——五子棋。在这个过程中,他们将深化对J2ME的理解,为更复杂的移动应用开发打下坚实基础。
本文是对 Java 2 Micro Edition (J2ME) 及移动信息设备描述(Mobile Information Device Profile, MIDP)进行全面介绍的由四部分 —— 两篇教程和两篇文章 —— 组成的系列文章的第二部分。第一篇教程(请参阅 参考...
- 内容覆盖了J2ME的基本架构、常用类库、MIDP和CDC等子平台的使用方法。 - 通过实例演示如何构建简单的应用程序,并逐步深入到复杂功能的实现。 #### J2ME开发全方位基础教程 - **专题地址**:...
**J2ME轻量级UI控件:LWUIT 1.2.1** Java Micro Edition(J2ME)是一种适用于小型设备和嵌入式系统的Java平台,它为开发移动应用提供了基础。在J2ME中,用户界面的构建通常是一项挑战,因为它需要在资源有限的设备...
所使用的虚拟机是ORP(开放式运行平台)的一个变种——XORP,该项目团队对原始ORP进行了定制,以适应移动手持设备的需求,使其符合J2ME规范标准。 在设计MIDP UI的本地方法时,需要考虑性能和粒度的平衡。通常,...
**J2ME应用小实例——深入理解J2ME_pro** J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式系统和移动设备,如手机、PDA等。J2ME_pro是针对这个平台的一系列实践教程,旨在帮助开发者深入...
3. **用户界面(UI)设计**:使用J2ME的 Lightweight User Interface Toolkit (LWUIT) 或者 Mobile Media API (MMAPI) 创建游戏的图形界面,包括按钮、图像和动画效果。 4. **事件处理**:监听并响应用户的按键输入...
**J2ME用户使用手册** 是一份专门为Java平台上的微型版Java技术——Java 2 Micro Edition(J2ME)编写的指南。这份手册通常包含了如何在各种嵌入式设备和移动设备上开发、部署和运行J2ME应用程序的详细信息。J2ME是...
本教程主要关注如何使用J2ME开发经典游戏——《俄罗斯方块》。 一、J2ME基础知识 1. MIDP(Mobile Information Device Profile):这是J2ME的核心部分,定义了移动设备上的应用程序接口。 2. CLDC(Connected ...
4. **用户界面设计**:j2ME使用Java Foundation Classes (JFC)的轻量级部分——CLDC和MIDP API来创建UI。文档可能涵盖了如何使用Form、ChoiceGroup、TextBox等组件创建简单的用户界面。 5. **设备模拟**:为了在...