如何在j2me项目中组织代码?

时间:2014-06-09 11:10:31

标签: java-me midlet

很抱歉,如果我要问你的是一个愚蠢的问题,但是因为我已经迈出了第一步,我必须这样做。 我知道你可以在一个MIDlet中拥有多个屏幕,但是当你将拥有相当数量的屏幕(超过10个)时,这似乎不是一个好主意,因为它最终会一团糟。 所以这就是问题(不确定是否可能),您通常如何在j2me项目中组织代码?或者你把所有东西都放在一个MIDlet中,或者你把你的代码分成不同的MIDlet,每个屏幕一个,就像我们在网络或桌面应用程序中一样?

我还注意到,当项目有多个MIDlet并启动模拟器时,您可以启动它们中的每一个。如果你可以在不同的MIDlet中拥有不同的功能,能够在不遵循特定顺序的情况下运行任何MIDlet,那么看起来非常方便,因为MIDlet可能依赖于在之前的MIDlet中读取的数据。

如果可以将不同的功能分成不同的MIDlet,你认为你可以大致了解如何做到这一点吗?采取哪些步骤一般

提前致谢。

2 个答案:

答案 0 :(得分:2)

一般规则:不要尝试在单个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() {

    }

}

我希望这有帮助,不要犹豫......

答案 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...
}

希望它有所帮助