在开发移动应用程序时,用户界面是与用户交互的首要界面。当设计了一个应用程序的主界面后,接下来要考虑的就是向界面添加组件,并允许用户执行命令。本文将指导如何为可显示对象添加新的项目和命令,如何创建和更新不可编辑文本的StringItem内容,以及如何创建各种Command并处理Command动作。
在本文中,将创建一个名为“Say Hello”的应用程序。该应用程序包含一个主表单,表单中有一个带有标签和一些文本的字符串项。主表单还有两个命令:“Say Hello”和“Exit”命令。当用户选择“Say Hello”命令时,它会改变字符串项的标签和文本;而“Exit”命令则用于退出应用程序并销毁所有对象。
构建“Say Hello”应用程序的第一步是创建组件,即字符串项和两个命令。字符串项是可以添加到表单显示对象中的项目之一。字符串项用于显示不可编辑的文本,每个字符串项由两部分组成:标签和文本。要使用字符串项,首先需要创建一个StringItem类的实例,并调用其构造函数。构造函数接受两个字符串参数,分别用于标签和文本。
命令是用于用户交互的不同种类的组件,允许用户执行某些功能。创建命令时,应该指定三件事:标签作为字符串,用于在显示时代表此命令;类型用于指定此命令的意图,设备在显示时可以使用;以及优先级,用于描述此命令相对于同一屏幕上其他命令的重要性,数字越小表示优先级越高。例如,退出命令将有“Exit”作为标签,退出类型,并且可能具有相对于其他命令的最低优先级。
首先,在MIDlet类中添加三个数据成员,第一个是StringItem类型,用于显示文本,另外两个是Command类型,分别用于“Say Hello”和“Exit”命令。
public class SayHelloMIDlet extends MIDlet {
...
private StringItem helloString;
private Command sayHelloCmd;
private Command exitCmd;
...
}
在MIDlet类的构造函数中,首先创建StringItem类的实例,并向其构造函数传递两个参数,即标签和文本字符串。
public SayHelloMIDlet() {
...
helloString = new StringItem("Some Label:", "Some Text");
}
在同一个构造函数中,紧接着StringItem对象的创建,为两个命令创建两个Command类的实例。在Command的构造函数中传递标签、类型和优先级参数。将为“Say Hello”命令选择SCREEN类型,为“Exit”命令选择EXIT类型,并将“Say Hello”命令的优先级设置为零,即最高优先级。
public SayHelloMIDlet() {
...
sayHelloCmd = new Command("Say Hello", Command.SCREEN, 0);
exitCmd = new Command("Exit", Command.EXIT, 1);
}
创建任何项目或命令后,下一步是将它们添加到表单中以供显示(或者在命令组件的情况下,添加到任何其他Displayable对象中)。有三种方式可以将项目添加到表单中:使用构造函数、使用表单类的append()方法。在本应用程序中,将使用append()方法。命令是使用addCommand()方法添加到Displayable的。
因此,应该使用append()方法将StringItem添加到helloFrm。
public SayHelloMIDlet() {
...
helloFrm.append(helloString);
...
}
接下来,使用addCommand()方法添加两个命令。
public SayHelloMIDlet() {
...
helloFrm.addCommand(sayHelloCmd);
helloFrm.addCommand(exitCmd);
...
}
如果尝试运行应用程序,到目前为止,它会按要求工作,除了两个命令它们不会做任何事情,因为还没有指定命令动作。命令动作是当用户选择该命令时需要执行的代码。命令动作可以通过首先实现CommandListener接口,然后使用setCommandListener()方法将命令监听器设置为该实现来处理。
首先,在MIDlet类中实现CommandListener接口及其commandAction()方法。
public class SayHelloMIDlet extends MIDlet implements CommandListener {
...
public void commandAction(Command c, Displayable d) {
}
}
现在,通过在MIDlet构造函数中调用helloFrm的setCommandListener()方法,并将MIDlet对象的引用传递给它,将表单的命令监听器设置为MIDlet类。
public SayHelloMIDlet() {
...
helloFrm.setCommandListener(this);
}
现在,在commandAction()方法中为每个命令添加特定动作,为此可以使用该方法的两个参数。第一个参数指定了选择的命令,以防应用程序有多个命令,如本例中的情况。第二个参数指定了包含命令的Displayable对象,以防将同一个命令添加到多个Displayable中。可以简单地使用if/else语句来检查显示和特定命令。
public void commandAction(Command c, Displayable d) {
if (d == helloFrm) {
if (c == sayHelloCmd) {
// Say Hello command action
}
else if (c == exitCmd) {
// Exit command action
}
}
}
“Say Hello”命令的动作是改变字符串项的标签和文本。可以通过调用StringItem对象的setLabel()和setText()方法来改变字符串项的标签和文本。
if (c == sayHelloCmd) {
helloString.setLabel("Hello");
helloString.setText("J2ME");
}
“Exit”命令的动作将用于退出应用程序并销毁所有对象,为此只需调用notifyDestroyed()方法。
if (c == exitCmd) {
notifyDestroyed();
}
在本文中,学习了如何使用J2ME组件中的字符串项和命令。还学习了如何将不同的组件添加到可显示对象中,以及如何通过实现CommandListener接口和commandAction()方法来处理命令动作。
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class SayHelloMIDlet extends MIDlet implements CommandListener {
private Display display;
private Form helloFrm;
private StringItem helloString;
private Command sayHelloCmd;
private Command exitCmd;
public SayHelloMIDlet() {
helloFrm = new Form("Hello J2ME");
helloString = new StringItem("Some Label:", "Some Text");
sayHelloCmd = new Command("Say Hello", Command.SCREEN, 0);
exitCmd = new Command("Exit", Command.EXIT, 1);
helloFrm.append(helloString);
helloFrm.addCommand(sayHelloCmd);
helloFrm.addCommand(exitCmd);
helloFrm.setCommandListener(this);
}
protected void startApp() {
display = Display.getDisplay(this);
display.setCurrent(helloFrm);
}
public void commandAction(Command c, Displayable d) {
if (d == helloFrm) {
if (c == sayHelloCmd) {
helloString.setLabel("Hello");
helloString.setText("J2ME");
}
else if (c == exitCmd) {
notifyDestroyed();
}
}
}
protected void pauseApp() {
}
protected void destroyApp(boolean unconditional) {
}
}