Règle générale: Ne pas essayer de se rendre à un seul complexe MIDlet :), quelque chose que je un peu comme sur moi-java, à savoir faire une chose bien ...
Le MIDlet
correspond à une application, car il est soumis à la gestion du cycle de vie. Dans des cas simples (c'est-à-dire dans la plupart des cas), je laisse également implémenter l'interface CommandListener
, donc en termes de MVC, c'est le contrôleur. La logique du contrôleur est implémentée dans la méthode commandAction (essentiellement if then else
sur la commande et l'écran de combinaison).
Les différents écrans comme List
et TextBox
correspondent aux vues dans MVC. Mettez-les dans des fichiers * .java séparés. Un écran peut être lié à un objet de votre modèle (par exemple, un éditeur), passez-le à l'écran dans la méthode commandAction
du MIDlet.
J'ai vu des exemples où les écrans mettent en œuvre le commandListener
, mais pour moi qui est des concepts de mélange et généralement moins maintenable ...
Vous êtes assez libre dans le choix de la mise en œuvre de la partie du modèle, mais vous voudrez peut-être regarder dans le paquet javax.microedition.rms pour la persistance et il existe des implémentations persistantes des contacts et des entrées d'agenda ...
Disons que vous avez la classe d'objets de domaine suivant (DomainObject.java):
package mvc.midlet;
public class DomainObject {
public String name = "";
public String street = "";
public String phone = "";
}
et vous souhaitez qu'une application crée jusqu'à 10 objets, avec un écran d'aperçu (une liste d'objets) et un éditeur pour l'objet.
Voici le code pour l'écran d'aperçu (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);
}
}
et est ici le code de l'éditeur (éditeur.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();
}
}
Et enfin le MIDlet qu'il contrôle tous (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() {
}
}
J'espère que cette aide, ne pas hésiter à demander ...
Une fois, je l'ai fait un très petit projet, mais Étant un très petit projet, j'ai fini par tout mettre dans un seul MIDlet. – Axel
Ouais. Je ferais ça aussi si j'avais juste quelques écrans. – eddy