J2ME tutorial – Cum se construiesc si se afiseaza formulare si alerte intr-un MIDlet

Aplicatiile mobile J2ME sunt solutii simple, care permit utilizatorilor sa-si gestioneze datele folosind formulare/ferestre (Displayable in J2ME) ce contin diferite tipuri de controale. In API-ul J2ME, echivalentul ferestrelor din aplicatiile de tip desktop este reprezentat de un set relativ redus de formulare care reprezinta subclase ale clasei Displayable. Intregul framework este un set redus de clase, care sunt usor de utilizat si cu un impact mai mic asupra memoriei si resurselor procesorului decât omologul pentru desktop, Java AWT (Abstract Window Toolkit) sau Swing.

Platforma J2ME ofera dezvoltatorilor 2 API-uri (Application Programming Interface) pentru a defini si pentru a controla interfata cu utilizatorul a aplicatiei mobile:

  • API-ul de nivel inalt (high-level user interface API), care este descris in acest articol, este implementat de catre clasele din pachetul javax.microedition.lcdui;
  • API-ul de nivel scazut (low-level user interface API) pentru interfata utilizatorului, care este mult mai dificil de utilizat, dar mai puternic din punct de vedere a posibilitatilor; acest API permite, de asemenea, dezvoltarea de jocuri pentru dispozitivul mobil;

Inainte de a intelege modul de utilizare a clasei Display si a tipurilor de formulare Displayable, trebuie sa se inteleaga ca in ciuda faptului ca lucrurile arata mult mai complicate decat abordarea aplicatiilor desktop (J2SE – AWT sau Swing), de fapt este simplu de construit interfete pentru aplicatiile J2ME, pentru ca:

  • gama de dispozitive mobile care suporta aplicatii J2ME este foarte mare; fiecare dispozitiv are caracteristici unice, ca tip de tastatura, dimensiune ecran si numar de culori, metode de preluare a inputului, ecrane tactile;
  • arhitectura J2ME a fost proiectat pentru a optimiza utilizarea memoriei si a puterii procesorului; framework-ul este redus, iar masina virtuala este foarte eficient in ceea ce priveste cerintele de memorie.

Simplitatea interfetelor de tip J2ME se bazeaza pe aceste reguli:

  • numarul de controale disponibile este foarte redus in comparatie cu J2SE AWT sau Swing;
  • exista tipuri speciale de formulare pentru anumite tipuri de activitati; exista un formular multi-scop, dar este limitat in ceea ce priveste ce si cum poti fi utilizate sau configurate cotroalele ;
  • exista posibilitati limitate de a controla aspectul formelor deoarece nu puteti personaliza culorile, fonturile sau dispunerea componentelor;
  • DOAR o forma sau fereastra este vizibila, activa sau in prim-plan la un moment dat; API-ul J2ME ofera o modalitate, prin utilizarea unei instante Display, pentru a gestiona care forma este cea vizibila sau se afla in prim-plan;

Clasa Display

Clasa Display reprezinta un manager pentru un ecran virtual care este asociat cu ecranul dispozitivului mobil.

Clasa Display este foarte importanta, deoarece:

  • fiecare aplicatie MIDlet are asociata doar o singura instanta Display;
  • instanta Display nu poate fi creata,  ci este obtinuta prin metoda statica a clasei Display – getDisplay();
  • instanta Display este utilizata pentru a decide ce formular/fereastra este afisata sau se afla in prim-plan;

Pentru a economisi timp procesor, este mai bine sa salvezi referinta instantei Display imediat ce MIDlet-ul a fost creat, decat sa apelezi de fiecare data metoda getDisplay().

In ciclul de viata al MIDlet-ului (daca va amintiti de la J2ME tutorial – How to create a simple MIDlet application with NetBeans) exista o serie de evenimente importante, iar functia starter a aplicatiei startApp(), este o locatie buna pentru a initializa referinta de tip Display:

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

public class MidletUI extends MIDlet {

    //se defineste referinta Display a MIDlet-ului
    Display midletDisplay = null;

    public void startApp() {
	//se initializeaza referinta Display
        if(midletDisplay==null)
            midletDisplay = Display.getDisplay(this);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

Dupa ce s-a initializat referinta instantei Display,  aceasta poate fi utilizata pentru a afisa diferite tipuri de formulare, dar cate unul pe rand.

Metoda clasei Display folosita pentru a afisa un formular este setCurrent(). Dar, pentru a construi formulare trebuie inteles ce reprezinta Displayable.

Clasa Displayable

Clasa Displayable este la fel de importanta ca si Display atunci când se dezvolta interfete cu utilizatorul pentru MIDlet-uri. Clasa Displayable reprezinta o clasa abstracta pentru toate obiectele care au capacitatea de a fi plasate pe o instanta de tip Display. Si aceste clase reprezinta tipurile diferite de forme.

Figura de mai jos descrie principalele tipuri de clase Displayable:

J2ME Display framework

J2ME Display framework

Screen – este o alta clasa abstracta din care sunt derivate principale formulare de nivel inalt ale interfetei;

Canvas – este o alta clasa abstracta, care permite dezvoltatorilor sa utilizeze API-ul low-level pentru interfata; clasa Canvas ofera metoda paint() care poate fi folosita pentru a controla si pentru a desena intreaga interfata;

Principalele tipuri de formulare sunt:

Form – acesta este tipul cel mai flexibil de formular J2ME, deoarece el poate sa contina diferite tipuri de controale: TextField, ChoiceGroup, StringItem si altele;

TextBox – este un tip special de formular care reprezinta o caseta de text multi-linie ce se extinde pe tot ecranul; editorul de SMS este un bun exemplu de formular TextBox;

List – este un formular care reprezinta o lista verticala de articole; in API-ul pentru desktop, acest formular este echivalentul controlului de tip ListBox;

Alert – este caseta de dialog clasica (message box) utilizata pentru a alerta/informa utilizatorul prin diferite mesaje scurte;

Cum se afiseaza un formular intr-un MIDlet

Pentru a vedea cât de simplu este sa construiesti si sa afisezi un formular, vom dezvolta o solutie mobila de tip editor de text bazata pe formularul TextBox:

J2ME TextBox Example

J2ME TextBox Example

1. Se defineste referinta de tip TextBox:

	//define the TextBox reference
	TextBox textBox = null;

2. Pentru ca formularul de tip TextBox este utilizat in permanenta de aplicatie si nu este ceva temporar (in realitate, aplicatia este formularul TextBox), acesta va fi construit odata cu MIDlet-ul; acest lucru este facut in constructorul MIDlet-ului; IMPORTANT, daca construiesti un formular acesta nu este afisat pana cand nu se utilizeaza metoda setCurrent() a instantei de tip Display:

    //define the MIDlet constructor
    public MidletUI()
    {
        textBox = new TextBox(
                "Hello J2ME!",      //textul din bara de titlu
                "Your message is: ", //continut
                255,    //numarul maxim de caractere
                TextField.ANY); //filtru pe input
    }

3. Constructorul clasei TextBox, public TextBox(String title, String text, int maxSize, int constraints) are ca parametri:

  • title – textul din bara de titlu a formularului; poate fi modificata mai tarziu folosind metoda setTitle();
  • text – continutul formularului de tip TextBox;
  • maxSize – numarul maxim de caractere acceptate; chiar daca se stabileste o limita superioara mare, limita reala impusa de masina virtuala si de framework-ul de pe dispozitivul respectiv poate sa fie mai mica;
  • constraints – reprezinta filtre pentru input-ul utilizatorului; toate valorile pentru constraints reprezinta campuri statice in clasa TextField (NU TextBox); aceste filtre pot fi utile deoarece faciliteaza introducerea de numere de la o tastatura non-QWERTY; de exemplu filtrul TextField.NUMERIC permite introducerea doar de cifre, literele fiind ignorate; alte filtre sunt TextField.ANY, TextField.EMAILADDR, TextField.NUMERIC, TextField.PHONENUMBER, TextField.URL, TextField.DECIMAL;

4. Deoarece se doreste afisarea formularului TextBox imediat ce este pornita aplicatia mobila, apelul metodei setCurrent() se face in metoda startApp():

    public void startApp() {
        //se obtine referinta catre instanta Display
        if(midletDisplay==null)
            midletDisplay = Display.getDisplay(this);

        //afisare formular
        midletDisplay.setCurrent(textBox);
    }

Cum se afiseaza formulare de tip Alert intr-un MIDlet

Formularul Alert este o alta clasa derivata din Screen si este un formular special utilizat pentru a afisa mesaje scurte. Constructorul detaliat al clasei Alert este public Alert(String title, String alertText, Image alertImage, AlertType alertType):

  • title– textul din bara de titlu a formularul;
  • alertText – textul din mesajul de alerta;
  • alertImage – o imagine care urmeaza sa fie incarcata in formular;
  • alertType – tipul de alerta; acestea sunt valori predefinite ca AlertType.INFO, AlertType.ALARM, AlertType.CONFIRMATION, AlertType.ERROR, AlertType.WARNING, utilizate pentru a controla (sunet, durata, iconita) modul in care este livrat mesajul de alerta pentru utilizator.

Ciclului de viata al formularului de tip Alert este foarte scurt (utilizatorul are doar optiunea de a confirma/inchide formularul) si dupa ce este inchis, un alt formular este plasat in prim-plan. Pentru a face acest lucru, Alert este afisat folosind versiunea cu doi parametri (al doilea parametru este formularul care urmeaza sa fie afisat dupa ce Alert-ul este inchis) a metodei setCurrent() din clasa Display:

public void startApp() {
        //se obtine referinta catre instanta Display
        if(midletDisplay==null)
            midletDisplay = Display.getDisplay(this);

        //afisare formular
        midletDisplay.setCurrent(textBox);

        //definire alerta
        Alert alert = new Alert("Info",	//text bara de titlu
                "The MIDlet has started !",	//mesaj alerta
                null, 				//fara poza
				AlertType.INFO);	//tip alerta
        
        //se afiseaza Alerta si 
		//	se indica TextBox-ul ca fiind urmatorul formular
        midletDisplay.setCurrent(alert, textBox);
    }

In mod implicit, un Alert este afisat numai pentru 2 secunde. Daca doriti sa modificati timpul de inchidere, puteti folosi metoda setTimeout(int timp) din clasa Alert. Pentru parametrul de tip Alert.FOREVER, formularul se afiseaza pâna când utilizatorul apasa tasta OK.

	alert.setTimeout(Alert.FOREVER);

J2ME Alert Example

J2ME Alert Example

Exemplul complet al aplicatiei mobile J2ME TextBox este disponibil in fisierul solutie.