很抱歉,如果我要问你的是一个愚蠢的问题,但是因为我已经迈出了第一步,我必须这样做。 我知道你可以在一个MIDlet中拥有多个屏幕,但是当你将拥有相当数量的屏幕(超过10个)时,这似乎不是一个好主意,因为它最终会一团糟。 所以这就是问题(不确定是否可能),您通常如何在j2me项目中组织代码?或者你把所有东西都放在一个MIDlet中,或者你把你的代码分成不同的MIDlet,每个屏幕一个,就像我们在网络或桌面应用程序中一样?
我还注意到,当项目有多个MIDlet并启动模拟器时,您可以启动它们中的每一个。如果你可以在不同的MIDlet中拥有不同的功能,能够在不遵循特定顺序的情况下运行任何MIDlet,那么看起来非常方便,因为MIDlet可能依赖于在之前的MIDlet中读取的数据。
如果可以将不同的功能分成不同的MIDlet,你认为你可以大致了解如何做到这一点吗?采取哪些步骤一般。
提前致谢。
答案 0 :(得分:2)
一般规则:不要尝试在单个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() {
}
}
我希望这有帮助,不要犹豫......
答案 1 :(得分:1)
我现在正在开发一个具有10多个屏幕的J2ME应用程序,而我只为项目使用一个MIDlet。 我将LWUIT用于我的用户界面,但你不必
每个屏幕都扩展了Form类,在MIDlet中我有一个屏幕切换方法,如下所示:
public class ExampleMIDlet extends MIDlet {
private J2meServerGateway gateway;
.....
public void changeScreen(Form form) {
form.show();
}
}
每个表单都有MIDlet作为参数,并使用changeScreen方法切换到下一个。
大多数逻辑都在表单中,我还有一个名为J2meServerGateway的接口,用于分隔视图逻辑(输入检查和处理结果)以及对服务器的实际调用。
public class BackupForm extends Form implements ActionListener{
private CloudBackupMIDlet midlet; // as parameter in the constructor
......
public void actionPerformed(ActionEvent ae) {
if (ae.getSource().equals(signupButton)) {
doSomething(firstField.getText(), secondField.getText());
}
}
private void doSomething(String st1, String st2) {
midlet.getGateway().callServer(st1, st2);
midlet.changeScreen(new OtherForm(midlet));
}
}
J2meServerGatewayImpl是控制器,并使用模型 - 对象,解析器等......
public class J2meServerGatewayImpl implements J2meServerGateway {
......
public void register(String email, String phone,int password) throws IOException,
ApiException {
String params = ...//params
String resultStr = sendPost(url, params);///actual server call
//parsing logic etc...
}
希望它有所帮助