2014-06-09 4 views
3

Désolé si ce que je vais vous demander est une question stupide, mais puisque je fais mes premiers pas dans j2me je dois le faire. Je sais que vous pouvez avoir plusieurs écrans dans un seul MIDlet, mais cela ne semble pas être une bonne idée quand vous allez avoir un nombre considérable d'écrans (plus de 10) car cela se terminerait par un désordre. Donc, voici la question (pas sûr si possible), comment organisez-vous habituellement votre code dans un projet j2me? Ou mettez-vous tout dans un seul MIDlet ou séparez-vous votre code en différents MIDlets, un par écran, comme nous le faisons habituellement dans les applications web ou de bureau?Comment organisez-vous votre code dans un projet j2me?

J'ai également remarqué que lorsqu'un projet a plusieurs MIDlets et que vous lancez l'émulateur, vous avez la possibilité de démarrer chacun d'entre eux. Si vous pouvez avoir différentes fonctionnalités dans différents MIDlets, être capable d'exécuter n'importe quel MIDlet sans suivre un ordre spécifique, ne semble pas très pratique car un MIDlet peut dépendre des données qui sont lues dans un MIDlet précédent.

S'il vous plaît s'il est possible de séparer différentes fonctionnalités en différents MIDlets, pensez-vous que vous pourriez donner une idée générale de la façon de le faire? Quelles étapes prendre en général.

Merci d'avance.

+0

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

+0

Ouais. Je ferais ça aussi si j'avais juste quelques écrans. – eddy

Répondre

2

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 ...

+1

Merci Gregor. J'apprécie vraiment vos suggestions, mais pensez-vous que vous pourriez clarifier ces deux points: 1) si la commandeAction est quelque chose comme un contrôleur et que les écrans sont comme des vues, quel serait l'équivalent des modèles? 2) Comment contrôler les écrans situés dans des fichiers .java indépendants? Pensez-vous que vous pourriez m'expliquer le point 2 en termes généraux? – eddy

+0

@eddy: Je vais ajouter une autre réponse avec du code ... –

+0

@Merci Gregor. Cela m'aiderait beaucoup. Je vais avoir hâte d'y être. :) – eddy

1

I Je développe maintenant au travail une application J2ME avec 10+ écrans et je n'utilise qu'un seul MIDlet pour mon projet. -je utiliser LWUIT pour mes fins de l'interface utilisateur, mais vous ne devez pas

chaque écran étend la classe de formulaire, et au MIDlet i avoir une méthode de commutation d'écran qui ressemble à ceci:

public class ExampleMIDlet extends MIDlet { 
    private J2meServerGateway gateway; 
    ..... 
    public void changeScreen(Form form) { 
     form.show(); 
    } 
} 

toutes les formes a le MIDlet comme paramètre et utilise la méthode changeScreen pour passer au suivant.

la plupart de la logique est dans les formes et j'ai aussi une interface que j'ai appelé J2meServerGateway qui sépare la logique de vue (entrées vérifie, et gérer le résultat) et les appels réels au serveur.

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)); 

    } 
} 

le J2meServerGatewayImpl est le contrôleur, et utilise le modèle - les objets, les parseurs etc ...

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

espoir qu'il a aidé

+0

Merci @arseny. J'espère que vous ne me dérange pas de demander, mais pense que vous pourriez partager l'exemple le plus simple (au moins les parties les plus pertinentes) dans lequel vous appliquez ce que vous avez expliqué dans votre réponse. Cela m'aiderait vraiment, étant donné que je suis dans le processus d'apprentissage et l'une des choses qui m'inquiète le plus est de savoir comment organiser mon application afin qu'elle soit facile à maintenir. – eddy

+0

ajouté un peu plus de code pour montrer ma structure d'application espère que cela clarifie certaines choses – arseny

Questions connexes