czwartek, 17 lutego 2011

Klasa Command i interfejs CommandListener

Kontynuując nasz pierwszy midlet dodajmy do niego komendę umożliwiającą wyjście z aplikacji.

public class MojMidlet extends MIDlet {
    private Display display;
    private Form form;
    private Command exitCommand = new Command("Wyjdz", Command.EXIT, 1);

    public void startApp() {
        form = new Form("Jakis tekst");
        form.append("Pierwszy MIDlet");
        form.addCommand(exitCommand);
        
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }
    ...

Oczywiście musimy zadeklarować obiekt klasy Command której konstruktor ma następującą składnię
                  Command(String Etykieta, int TypKomendy, int Priorytet)


Pamiętajmy o zaimportowaniu klasy wciskając CTRL+SHIFT+I (Fix Imports).


Następnie dodajemy komendę do istniejącej juz formy używając metody addCommand(Command komenda) i po uruchomieniu naszego midletu zobaczymy komendę "Wyjdź" która... nie działa.

Tutaj z pomocą idzie interfejs CommandListener, który nasz midlet musi implementować

public class MojMidlet extends MIDlet implements CommandListener {
    private Display display;
...


CommandListener posiada tylko jedną metodę która obsługuje naszą komendę , więc dopiszmy ją na końcu naszego kodu

    public void destroyApp(boolean unconditional) {
    }
    
    public void commandAction(Command c, Displayable d) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }            
    }


Widzimy, że spełnienie warunku (c == exitCommand) owocuje zakończeniem midletu. Oczywiście posiadając tylko jedną komendę warunek bedzie zawsze spełniony.


Ostatnim krokiem będzie dodanie instrukcji setCommandListener do naszego programu w metodzie startApp() bez której commandAction nie zostałaby wywołana.

    public void startApp() {
        form = new Form("Jakis tekst");
        form.append("Pierwszy MIDlet");
        form.addCommand(exitCommand);
        form.setCommandListener(this);

...


Można teraz smiało uruchomić midlet i sprawdzić poprawność działania naszej komendy.


Dodajmy jeszcze dwie komendy napiszCommand dodającą na ekranie tekst i czyscCommand, po której wciśnieciu nasza forma zostanie wyczyszczona. Zasada jest identyczna jak w przypadku exitCommand

  private Command exitCommand = new Command("Wyjdz", Command.EXIT, 1);
  private Command dodajCommand = new Command("DodajTxt", Command.OK, 1);
  private Command czyscCommand = new Command("Czysc", Command.OK, 1);

  public void startApp() {
      form = new Form("Jakis tekst");
      form.append("Pierwszy MIDlet");
      form.addCommand(dodajCommand);
      form.addCommand(czyscCommand);
      form.addCommand(exitCommand);        
      form.setCommandListener(this);

...

Zostaje nam tylko zmodifikować commandAction o dodane komendy

public void commandAction(Command c, Displayable d) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        } else if (c == dodajCommand) {
            form.append("Dodany tekst\n");
        } else if (c == czyscCommand) {            
            form.deleteAll();
        }
    }

Metoda deleteAll() klasy Form usuwa wszystkie rzeczy umieszczone na danej formie, w tym przypadku wpisane teksty.

Kompletny kod naszego midletu i wynik działani powinien wyglądać następująco:




import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.*;


public class MojMidlet extends MIDlet implements CommandListener {
    private Display display;
    private Form form;
    private Command exitCommand = new Command("Wyjdz", Command.EXIT, 1);
    private Command dodajCommand = new Command("DodajTxt", Command.OK, 1);
    private Command czyscCommand = new Command("Czysc", Command.OK, 1);


    public void startApp() {
        form = new Form("Jakis tekst");
        form.append("Pierwszy MIDlet");
        
        form.addCommand(dodajCommand);
        form.addCommand(czyscCommand);
        form.addCommand(exitCommand);    
        
        form.setCommandListener(this);
        
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }


    public void pauseApp() {
    }


    public void destroyApp(boolean unconditional) {
    }


    public void commandAction(Command c, Displayable d) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        } else if (c == dodajCommand) {
            form.append("Dodany tekst\n");
        } else if (c == czyscCommand) {            
            form.deleteAll();
        }
    }
}








1 komentarz: