很抱歉,如果我要问您的是一个愚蠢的问题,但是由于我正在迈入j2me的第一步,所以我必须这样做。
我知道您可以在一个MIDlet中拥有多个屏幕,但是当您要拥有大量屏幕(超过10个)时,这似乎不是一个好主意,因为这样最终会导致混乱。
所以这是一个问题(如果可能,不确定),通常如何在j2me项目中组织代码?还是您将所有内容都放在一个MIDlet中,还是像在Web或桌面应用程序中通常那样,将代码分成每个屏幕一个独立的MIDlet?

我还注意到,当一个项目具有多个MIDlet并启动仿真器时,就有可能启动每个MIDlet。如果您可以在不同的MIDlet中具有不同的功能,而无需遵循特定的顺序就可以运行任何MIDlet,则似乎不太方便,因为MIDlet可能取决于先前MIDlet中读取的数据。

如果可以将不同的功能分离到不同的MIDlet中,请问您是否可以大致了解如何做到这一点?一般采取哪些步骤。

提前致谢。

最佳答案

一般规则:不要试图在单个MIDlet中变得复杂:),这是我非常喜欢java-me的东西,即做好一件事...

MIDlet对应于一个应用程序,因为它要进行生命周期管理。

在简单情况下(即在大多数情况下),我也让它实现了CommandListener接口,因此在MVC术语中,它是控制器。控制器逻辑通过commandAction方法实现(基本上在组合命令和屏幕上为if then else)。

ListTextBox实例之类的不同屏幕与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() {

    }

}


希望对您有所帮助,请不要犹豫。

10-08 13:46