很抱歉,如果我要问您的是一个愚蠢的问题,但是由于我正在迈入j2me的第一步,所以我必须这样做。
我知道您可以在一个MIDlet中拥有多个屏幕,但是当您要拥有大量屏幕(超过10个)时,这似乎不是一个好主意,因为这样最终会导致混乱。
所以这是一个问题(如果可能,不确定),通常如何在j2me项目中组织代码?还是您将所有内容都放在一个MIDlet中,还是像在Web或桌面应用程序中通常那样,将代码分成每个屏幕一个独立的MIDlet?
我还注意到,当一个项目具有多个MIDlet并启动仿真器时,就有可能启动每个MIDlet。如果您可以在不同的MIDlet中具有不同的功能,而无需遵循特定的顺序就可以运行任何MIDlet,则似乎不太方便,因为MIDlet可能取决于先前MIDlet中读取的数据。
如果可以将不同的功能分离到不同的MIDlet中,请问您是否可以大致了解如何做到这一点?一般采取哪些步骤。
提前致谢。
最佳答案
一般规则:不要试图在单个MIDlet中变得复杂:),这是我非常喜欢java-me的东西,即做好一件事...MIDlet
对应于一个应用程序,因为它要进行生命周期管理。
在简单情况下(即在大多数情况下),我也让它实现了CommandListener
接口,因此在MVC术语中,它是控制器。控制器逻辑通过commandAction方法实现(基本上在组合命令和屏幕上为if then else
)。List
和TextBox
实例之类的不同屏幕与MVC中的视图相对应。将它们放在单独的* .java文件中。屏幕可能与模型中的对象(例如,编辑器)绑定在一起,因此可以通过MIDlet的commandAction
方法将其传递给屏幕。
我看过一些示例,这些示例在屏幕上实现了commandListener
,但是对我来说,这是混合概念,并且通常不太易于维护...
您可以自由选择实现模型的一部分,但是您可能希望研究javax.microedition.rms包的持久性,并且有联系人和日历条目的持久性实现...
假设您具有以下域对象类(DomainObject.java):
package mvc.midlet;
public class DomainObject {
public String name = "";
public String street = "";
public String phone = "";
}
并且您希望一个应用最多创建10个对象,并带有概述屏幕(对象列表)和对象的编辑器。
这是概述屏幕(Overview.java)的代码:
package mvc.midlet;
import javax.microedition.lcdui.List;
public class Overview extends List {
public static Overview create(DomainObject[] data) {
int i = 0;
for(; i < data.length; i++) {
if(data[i] == null) break;
}
String[] names = new String[i];
for(int j = 0; j < i; j++) {
names[j] = data[j].name;
}
return new Overview(names);
}
protected Overview(String names[]) {
super("Overview", IMPLICIT, names, null);
}
}
这是编辑器代码(Editor.java):
package mvc.midlet;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.TextField;
public class Editor extends Form {
public static Editor create(DomainObject object, boolean isNew) {
return new Editor(object, isNew);
}
private final DomainObject object;
public final boolean isNew;
public DomainObject getObject() {
return object;
}
private final TextField name;
private final TextField street;
private final TextField phone;
protected Editor(DomainObject object, boolean isNew) {
super("Edit");
this.object = object;
this.isNew = isNew;
this.name = new TextField("Name", object.name, 10, TextField.INITIAL_CAPS_WORD);
this.append(name);
this.street = new TextField("Street", object.street, 10, TextField.INITIAL_CAPS_WORD);
this.append(street);
this.phone = new TextField("Phone", object.phone, 10, TextField.PHONENUMBER);
this.append(phone);
}
public String getName() {
return name.getString();
}
public String getStreet() {
return street.getString();
}
public String getPhone() {
return phone.getString();
}
public void saveValues() {
object.name = getName();
object.street = getStreet();
object.phone = getPhone();
}
}
最后是控制这一切的MIDlet(MvcMIDlet.java):
/**
*
*/
package mvc.midlet;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/**
* @author cm
*
*/
public class MvcMIDlet extends MIDlet implements CommandListener {
private Command add = new Command("New", Command.SCREEN, 0x01);
private Command edit= new Command("Edit", Command.SCREEN, 0x01);
private Command exit= new Command("Exit", Command.EXIT, 0x01);
private Command ok= new Command("OK", Command.OK, 0x01);
DomainObject[] data = new DomainObject[10];
DomainObject current = null;
/**
* Initialize some sample data
*/
public MvcMIDlet() {
data[0] = new DomainObject();
data[0].name = "Hans";
data[1] = new DomainObject();
data[1].name = "Franz";
}
protected void startApp() throws MIDletStateChangeException {
showOverview();
}
/***
* create an overview, add commands and show it
*/
private void showOverview() {
Overview overview = Overview.create(data);
overview.addCommand(edit);
overview.addCommand(add);
overview.addCommand(exit);
overview.setCommandListener(this);
Display.getDisplay(this).setCurrent(overview);
}
/***
* create an editor for the given object, add commands and show it
*/
private void showEditor(DomainObject object, boolean isNew) {
Editor editor = Editor.create(object, isNew);
editor.addCommand(ok);
editor.addCommand(exit);
editor.setCommandListener(this);
Display.getDisplay(this).setCurrent(editor);
}
public void commandAction(Command c, Displayable d) {
if(d instanceof Overview) {
if(c == edit) {
int i = ((Overview) d).getSelectedIndex();
showEditor(data[i], false);
}
else if(c == add) {
showEditor(new DomainObject(), true);
}
else if(c == exit) {
this.notifyDestroyed();
}
}
else if(d instanceof Editor) {
if(c == ok) {
((Editor) d).saveValues();
if(((Editor) d).isNew) {
/// search free slot ...
int i = 0;
for(; i < data.length; i++) {
if(data[i] == null) break;
}
if(i < data.length) {
/// ... and store the new object
data[i] = ((Editor)d).getObject();
}
}
showOverview();
}
else if(c == exit) {
showOverview();
}
}
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
}
protected void pauseApp() {
}
}
希望对您有所帮助,请不要犹豫。