2 votes

Utilisation d'une commande pour passer à un affichable dans une classe qui étend MIDlet

Je travaille en Java. J'essaie de passer d'une conception visuelle à l'autre en utilisant les commandes ok et back. J'ai un formulaire affichable que j'ai nommé formA dans ma classe principale A.java et un formB dans une autre classe B.java . J'ai utilisé une commande ok dans le formulaire A qui, lorsqu'elle est sélectionnée, est supposée amener l'utilisateur au formulaire B.

J'ai créé une référence à B.java dans le constructeur de ma classe principale A.java.

B b;

 // A.java constructor
public A() {
    b = new B(this);
}

maintenant je pourrais appeler la méthode getFormB à partir de ma commandAction dans formA. J'ai ensuite ajouté une backCommand qui est censée me ramener au formulaire A dans A.java et j'ai essayé de créer une référence dans B.java de la même manière que dans A.java mais j'ai obtenu une SecurityException MIDletManager ERROR au moment de l'exécution. On m'a conseillé d'ajouter un attribut A à ma classe B et de recevoir l'instance comme paramètre de constructeur afin que je puisse appeler la méthode getFormA() pour passer au formulaire A dans A.java.

A a;

B(A a) {
    this.a = a;
}

en action de commandement j'ai fait ds sur le backCommand : switchDisplayable ( null , a.getFormA()) ; Cela a été compilé, mais au moment de l'exécution, lorsque j'ai appuyé sur la touche BACK à partir du formulaire B, j'ai obtenu l'erreur java/lang/NullPointerException.

Quelqu'un peut-il me dire pourquoi cela s'est produit et comment le réparer ? Tout ce que j'essaie de faire, c'est de faire en sorte que la commande de retour ramène l'utilisateur du formulaire B au formulaire A.

3voto

newbie Points 923

Si votre classe A étend Form ou votre classe A est Displayable puis dans la commande Back, vous pouvez juste dire switchDisplayable(null, a) .

Si votre classe A n'est pas une Form alors assurez-vous que votre classe A possède les méthodes suivantes :

public Form getFormA() {
   return ...;  // return the `Form` here so you will not get NullPointerException
}

UPDATE :

Si vous utilisez NetBeans, vous pouvez ouvrir Débit et faites glisser backCommand du formulaire B au formulaire A. NetBeans générera le code requis pour vous.

enter image description here

Si vous codez à la main, cela ressemblera à ce qui suit :

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ExampleMidlet extends MIDlet {

    private Display display;
    private Form formA;
    private Form formB;
    private Command formA_next;
    private Command formB_back;

    public void startApp() {
        if (display==null) {
            display = Display.getDisplay(this);

            formA = new Form("Form A");
            formA_next = new Command("Next", Command.SCREEN, 0);
            formA.addCommand(formA_next);
            formA.setCommandListener(new CommandListener() {

                public void commandAction(Command c, Displayable d) {
                    if (c==formA_next) {
                        display.setCurrent(formB);
                    }
                }
            });

            formB = new Form("Form B");
            formB_back = new Command("Back", Command.BACK, 0);
            formB.addCommand(formB_back);
            formB.setCommandListener(new CommandListener() {

                public void commandAction(Command c, Displayable d) {
                    if (c==formB_back) {
                        display.setCurrent(formA);
                    }
                }

            });
        }        
        display.setCurrent(formA);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

Je ne sais pas comment vous codez votre Form mais il semble que a es null . Vous pouvez peut-être me montrer le code complet. Passage de this dans le constructeur n'est généralement pas recommandé. D'ailleurs, vous avez toujours besoin d'une classe 'principale' qui prolonge MIDlet n'est-ce pas ? Alors il y aura 3 classes, telles que :

ExampleMiddlet.java (c'est là que vous placez le cycle de vie de votre MIDlet, tel que startApp() , pauseApp() etc) :

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ExampleMidlet extends MIDlet {

    private Display display;
    private Form formA, formB;    

    public void startApp() {
        if (display==null) {
            display = Display.getDisplay(this);
            formA = new FormA(this);
            formB = new FormB(this);
        }        
        display.setCurrent(formA);
    }

    public Form getFormA() {
        return formA;
    }

    public Form getFormB() {
        return formB;
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

FormA.java (c'est ici que vous mettez le contenu de votre Form ) :

import javax.microedition.lcdui.*;

public class FormA extends Form {

    private Command cmdNext;    

    public FormA(final ExampleMidlet midlet) {
        super("Form A");        
        append("This is form A.");
        cmdNext = new Command("Next", Command.SCREEN, 0);        
        addCommand(cmdNext);
        setCommandListener(new CommandListener() {

            public void commandAction(Command c, Displayable d) {
                Display.getDisplay(midlet).setCurrent(midlet.getFormB());
            }
        });
    }

}

FormB.java (c'est ici que vous mettez le contenu de votre Form ) :

import javax.microedition.lcdui.*;

public class FormB extends Form {

    private Command cmdBack;

    public FormB(final ExampleMidlet midlet) {
        super("Form B");        
        append("This is form B.");
        cmdBack = new Command("Back", Command.SCREEN, 0);        
        addCommand(cmdBack);
        setCommandListener(new CommandListener() {

            public void commandAction(Command c, Displayable d) {
                Display.getDisplay(midlet).setCurrent(midlet.getFormA());
            }

        });
    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X