CATEGORII DOCUMENTE |
FOLOSIREA APLICATIILOR JAVA IN LUMEA REALA
Aplicatiile din lumea reala difera de aplicatiile independente simple, cum ar fi SumGraph, prin dimensiune, complexitate si utilitate. Acest capitol va prezinta unele dintre tehnicile folosite pentru dezvoltarea aplicatiilor complexe.
Capitolul se bazeaza pe un singur exemplu, o aplicatie Java de nivel mediu, prezentand instrumente si obiecte utile in construirea ulterioara a unor aplicatii Java complexe. Capitolul se incheie cu un plan pentru testarea aplicatiei.
Aplicatii mai mari, mai bune si mai rapide
Utilizatorii se asteapta ca aplicatiile din lumea reala sa aiba un timp scurt de raspuns, ecrane de asistenta prietenoase, prezentari atractive si bine concepute si o organizare usor de inteles. Multe caracteristici care nu sunt necesare in miniaplicatii sunt solicitate in cazul aplicatiilor.
Adaugarea componentelor necesare intr-o aplicatie impune un efort suplimentar de programare. Unele dintre acestea, cum ar fi organizarea meniurilor si aspectul cadrelor, trebuie sa fie similare in diferite programe care ruleaza sub acelasi sistem de operare. Majoritatea aplicatiilor contin o caseta About, care furnizeaza informatii despre versiunea programului, drepturile de copiere si autori. De asemenea, aplicatiile pot include un ecran pentru inregistrare, bare cu instrumente de lucru grafice, casete de dialog pentru prezentarea informatiilor si multe altele.
Limbajul Java poate fi folosit pentru dezvoltarea unor programe cu toate aceste caracteristici, dintre care unele sunt introduse mai usor, altele mai greu. Tehnica de baza pentru dezvoltarea aplicatiilor ramane aceeasi, indiferent de marimea acestora. O atentie deosebita trebuie acordata proiectarii, pentru a permite adaugarea unor noi componente si a asigura robustetea programului, astfel incat sa poata fi indeplinite cerintele celor mai pretentiosi utilizatori. Un program bine proiectat poate fi impartit cu usurinta in sectiuni, pentru ca mai multe persoane sau o echipa sa lucreze la sectiuni diferite ale programului. Sectiunile sunt apoi reunite, rezultand un program functional, realizat intr-o perioada scurta de timp.
Pe masura ce Java dispune de tot mai multe instrumente de lucru si programe utilitare, timpul de dezvoltare se reduce. Deoarece limbajul Java este orientat pe obiecte, incorporarea instrumentelor de lucru existente nu ridica probleme; amintiti-va cat de simplu s-a realizat incorporarea miniaplicatiei ScrollText in aplicatia din capitolul 17, "Crearea unei aplicatii independente".
Cu ajutorul pachetului java.awt, puteti crea un program al carui aspect sa reflecte sistemul de operare sub care lucreaza. Prin urmare, programatorii pot incorpora in aplicatii diverse componente, fara sa se preocupe de modul cum vor arata acestea pe fiecare platforma.
In viitor: In acest capitol, veti dezvolta o aplicatie complexa. Aceasta contine multe dintre caracteristicile intalnite frecvent in aplicatiile din lumea reala.
Unele au fost prezentate deja in aplicatia prezentata in capitolul 17, dar exemplele de aici sunt mult mai robuste. Discutiile din acest capitol va vor pregati pentru programele complexe prezentate in partea a VII-a, 'Elemente avansate".
Conceperea unei aplicatii reale
In capitolul 17, ati vazut cum poate fi modificat proiectul unei aplicatii simple in timpul crearii aplicatiei. Capitolul de fata dezvolta un exemplu mai complex, incluzand multe dintre componentele intalnite in aplicatiile din lumea reala.
Proiectarea unei aplicatii de dimensiuni mari este, in general, un proces iterativ, care poate fi realizat in mai multe etape: aplicatia este impartita in sectiuni mai mici, care sunt proiectate separat.
Una dintre cele mai importante decizii din faza de proiectare priveste modul de impartire a aplicatiei, care nu rezulta intotdeauna din specificatiile programului. Nu este necesar ca sectiunile sa fie echivalente ca dimensiuni si complexitate, dar trebuie ca acestea sa fie bine definite si clar delimitate.
Resurse utile on-line
In procesul dezvoltarii unor aplicatii complexe, puteti economisi timp pretios folosind programe utilitare create anterior. Unul dintre marile avantaje ale limbajului Java este usurinta cu care aceste utilitare pot fi partajate de mai multi utilizatori.
Unele programe utilitare sunt disponibile in diverse situri din Internet. Puteti gasi programe de contorizare, proceduri de analizare si separare in atomi a sirurilor de caractere, proceduri pentru verificarea adreselor URL, ca sa luam numai cateva exemple.
Printre sursele disponibile on-line de utilizare Java se numara:
https://www.yahoo.com/Computers_and_Internet/Languages/Java/Utilities/
https://www.blackdown.org/~kbs/
Incercati sa vizitati aceste situri, precum si altele, pentru a gasi utilitare Java pe care sa le incorporati in aplicatiile dumneavoastra.
Determinarea cerintelor
Specificatiile aplicatiei SlideShow, pe care urmeaza sa o dezvoltam in acest capitol, sunt foarte simple:
Aplicatia va rula o prezentare cu diapozitive, pe baza unor imagini GIF si a unor texte referitoare la acestea.
Desi specificatiile nu precizeaza nimic despre meniuri si controale, este de presupus ca aplicatia trebuie sa contina aceste elemente. De asemenea, se presupune ca aplicatia are posibilitatea de a incarca prezentarea dintr-un fisier si ca furnizeaza o modalitate eleganta de iesire din program.
Prin extinderea descrierii de mai sus, aplicatia SlideShow trebuie sa raspunda urmatoarelor cerinte:
Sa incarce o prezentare dintr-un fisier
Sa afiseze imagini
Sa afiseze text
Sa treaca la urmatorul diapozitiv din prezentare
Sa revina la diapozitivul anterior
Sa sara la ultimul diapozitiv
Sa revina la primul diapozitiv
Sa activeze si sa dezactiveze afisarea diapozitivelor
Sa activeze si sa dezactiveze afisarea textului
Sa furnizeze informatii de asistenta
Sa furnizeze informatii despre autor
Sa iasa din program
Proiectarea unei aplicatii reale
In aceasta sectiune, intreaga aplicatie este impartita in obiecte, care urmeaza sa fie implementate in Java. In unele cazuri, obiectele sunt compuse din alte obiecte pe care trebuie sa le definiti si sa le implementati. Procesul se opreste in momentul in care sunt definite toate componentele necesare pentru indeplinirea cerintelor. Aceste componente vor fi implementate ca noi clase Java sau vor fi create folosind clasele deja definite.
Proiectarea si organizarea generala a aplicatiei
Mai intai, trebuie sa definiti caracteristicile principale ale aplicatiei. De obicei, aplicatiile sunt proiectate in jurul unei zone principale de afisare, la care se adauga instrumente de lucru furnizate in ferestre separate. Zona principala de afisare este cea asupra careia se concentreaza atentia utilizatorului in timpul rularii aplicatiei; ca urmare, ea trebuie sa fie bine proiectata si atractiva din punct de vedere grafic.
Zona de afisare a aplicatiei poate fi formata din mai multe elemente grupate intr-un singur container pentru a simplifica manevrarea lor. Containerul trebuie sa furnizeze metodele care pot fi folosite pentru a modifica dispunerea elementelor pe ecranul utilizatorului. Pentru aceasta, containerul foloseste metodele furnizate de fiecare dintre obiectele pe care le contine. Metodele sunt grupate astfel incat evenimentele inrudite sa fie tratate uniform, chiar daca sunt apelate de controale diferite.
Ecranul principal va fi ceva mai mult decat o simpla fereastra de afisare. Utilizatorul trebuie sa aiba posibilitatea de a se deplasa de la un diapozitiv la altul, in prezentare. Pentru aceasta, el trebuie sa dispuna pe ecran de controalele necesare. Acestea vor functiona asemanator cu controalele unui videorecorder, permitand utilizatorului sa se deplaseze inainte si inapoi in prezentarea cu diapozitive.
Observatie: Aspectul ecranului este esential pentru o aplicatie comerciala. De multe ori, clientii se decid sa cumpere un anumit produs pe baza impresiei pe care le-o produce aspectul sau. Ei urmeaza sa petreaca mult timp interactionand cu aplicatia creata de dumneavoastra; aceasta trebuie sa constituie o experienta placuta.
Atunci cand stabiliti organizarea ecranului unei aplicatii, trebuie sa tineti seama de fonturi, de pictograme si de dimensiunea textului. Unele aplicatii necesita un font modern; altele impun folosirea unui text de dimensiuni mai mari sau mai mici. Java va permite sa alegeti o anumita pictograma si sa o atribuiti fiecarei ferestre, astfel incat aplicatia respectiva sa fie identificata prin
simboluri grafice familiare utilizatorilor. Pictograma este stabilita cu ajutorul metodei setIcon-Image( ) din clasa Frame.
La crearea structurii programului, am luat unele decizii care reflecta modul in care va fi organizat ecranul. Programul va avea o zona pentru afisare si o alta zona pentru controale. De asemenea, va avea un meniu. Zona de afisare va fi impartita in doua sectiuni, una pentru text si una pentru imagini. Aceste informatii nu sunt suficiente pentru a stabili aspectul ecranului, dar constituie un bun punct de pornire.
Proiectarea ferestrei principale
Fereastra principala furnizeaza cadrul aplicatiei. Multe obiecte din zona de afisare apar in fereastra principala. In general, fereastra principala a aplicatiei stabileste culorile, fonturile, organizarea si alte aspecte legate de afisare. Apoi sunt adaugate obiectele care au legatura cu afisarea, cum ar fi procedura de tratare a evenimentelor si metoda main( ), folosita pentru lansarea aplicatiei.
In aplicatia SlideShow, sunt stabilite doua aspecte legate de afisare: culoarea de fundal va fi gri deschis, iar dispunerea va fi de tip chenar.
In fereastra principala, vor fi afisate trei obiecte: bara de meniuri, plasata in partea superioara a cadrului, panoul de afisare, format din obiecte de tip text si de tip imagine, si un set de controale pentru comanda prezentarii cu diapozitive.
Proiectarea barei de meniuri
Bara de meniuri este un obiect distinct, atasat cadrului aplicatiei. Daca aplicatia contine mai multe cadre, fiecare dintre acestea va avea propria bara de meniuri; daca insa fereastra principala poate controla evenimentele din celelalte ferestre, ele nu au nevoie de bare de meniuri proprii. In cazul in care aplicatia are mai multe bare de meniuri, trebuie sa stabiliti ce contine fiecare dintre ele. In aplicatia SlideShow, avem o singura fereastra principala, care va avea o singura bara de meniuri. Fereastra de asistenta soft (Help) nu va contine o bara de meniuri.
Observatie: Adaugarea unei bare de meniuri la o aplicatie nu este o sarcina simpla. Trebuie sa decideti ce va contine bara de meniuri, cum sa grupati optiunile din meniu, cand trebuie sa fie vizibile anumite optiuni si cum sa corelati aceste meniuri cu activitatile pe care le apeleaza.
In majoritatea aplicatiilor este de dorit ca toate operatiunile sa fie disponibile din bara de meniuri, deoarece acesta este locul pe care il va examina utilizatorul atunci cand modul de
executare a unei anumite operatii nu este evident. Meniul trebuie sa contina si o optiune pentru iesirea din aplicatie. Daca exista si ecrane de asistenta soft, ele ar trebui sa fie accesibile tot din meniu.
In cazul aplicatiei SlideShow, toate operatiile care pot fi executate din panoul de control sunt disponibile si ca optiuni de meniu. In plus, meniul va ofera posibilitatea de a incarca o noua prezentare cu diapozitive. Doua casete de validare adaugate meniului permit utilizatorului sa dezactiveze afisarea imaginilor sau a textului. De asemenea, meniul va oferi utilizatorului posibilitatea sa afiseze caseta de dialog About si fereastra de asistenta soft sau sa iasa din aplicatie.
Dupa selectarea activitatilor care vor fi incluse in meniu trebuie sa grupati aceste optiuni. In majoritatea aplicatiilor, primul meniu este File (Fisier), care include optiuni pentru incarcarea si
salvarea fisierelor. In plus, meniul File contine, de obicei, optiuni pentru tiparirea unui fisier, controlul imprimantei, inchiderea unei anumite ferestre si iesirea din aplicatie.
Pentru aplicatia SlideShow, meniul File va avea doua elemente: Load, care permite incarcarea unei noi prezentari, si Exit, care permite utilizatorului sa iasa din aplicatie.
Help este, de obicei, ultimul meniu al unei aplicatii. Optiunile pe care le contine sunt legate, in general, de furnizarea unor informatii de asistenta pentru utilizator. Acestea pot fi livrate in diferite forme. Meniul Help va contine o optiune pentru fiecare tip de informatii disponibile.
Aplicatia SlideShow contine un ecran simplu pentru descrierea fiecaruia dintre controalele folosite. De asemenea, aplicatia are o caseta de dialog About, in care sunt afisate informatii despre drepturile de copiere, numarul versiunii si autor. Toate aceste ecrane sunt accesibile din meniul Help.
Celelalte functii ale aplicatiei SlideShow sunt grupate in meniul Display (Afisare), care furnizeaza optiunile pentru deplasare in prezentarea cu diapozitive si pentru dezactivarea unor elemente de afisare.
Optiunile din bara de meniuri a aplicatiei SlideShow sunt prezentate in tabelul 18.1.
Tabelul 18.1. Componentele barei de meniuri a aplicatiei SlideShow.
Categorie Articol Descriere
File Load Incarca in aplicatie diapozitivele unei prezentari
Exit Iesire din aplicatia SlideShow
Display Forward Deplasare la urmatorul diapozitiv din prezentare
Back Revenire la diapozitivul anterior din prezentare
Beginning Revenire la primul diapozitiv din prezentare
End Deplasare la ultimul diapozitiv din prezentare
No Text Atunci cand optiunea este validata, textul nu mai
apare pe ecran
No Slides Atunci cand potiunea este validata, imaginile nu
mai apar pe ecran
Help Help Topics Furnizeaza descrierea controalelor
About Furnizeaza informatii despre autor
Pentru unele aplicatii, anumite articole de meniu sunt uneori oportune, alteori irelevante. Atunci cand nu este disponibil, un anumit articol din meniu poate fi facut invizibil. In Java, articolele devin invizibile numai prin eliminarea lor din meniu. Se permite insa ca articolele de meniu sa fie modificate in timpul executiei.
Sugestie: In anumite momente, este oportun ca unele articole de meniu sa fie scrise estompat, de exemplu cele care nu sunt disponibile in momentul respectiv. Aceasta caracteristica nu este folosita in aplicatia SlideShow. In mod frecvent, tehnica estomparii este utilizata in cazul optiunilor Cut (Decupare), Copy (Copiere) si Paste (Lipire) din meniul Edit (Editare). Metoda folosita in Java pentru dezactivarea unui articol de meniu este disable().Articolele respective pot fi apoi activate cu ajutorul metodei enable().
Pentru aplicatia SlideShow, nu este necesara dezactivarea vreunei optiuni de meniu. Casetele de validare vor fi activate numai la selectarea unei anumite optiuni de catre utilizator.
Proiectarea obiectului SlidePanel
Puteti crea obiectul folosit pentru afisare definind o noua clasa, SlidePanel. Aceasta extinde clasa Panel si contine doua noi clase: SlideCanvas, care va controla afisarea diapozitivelor, si SlideText, care va controla afisarea textului.
Observatie: SlideCanvas si SlideText sunt cele mai importante clase ale aplicatiei. Acestea furnizeaza caracteristici care vor fi puse la dispozitia celorlalte obiecte din aplicatie.
Clasa SlidePanel trebuie sa contina metode pentru executarea urmatoarelor operatii:
Trecerea la urmatorul diapozitiv
Revenirea la diapozitivul anterior
Revenirea la primul diapozitiv
Saltul la ultimul diapozitiv
Activarea afisarii diapozitivelor
Dezactivarea afisarii diapozitivelor
Activarea afisarii textului
Dezactivarea afisarii textului
Incarcarea unei noi prezentari
Metodele clasei SlidePanel incapsuleaza apelurile la metodele furnizate de obiectele din panou si sunt folosite atat de meniuri, cat si de controale. De asemenea, clasa SlidePanel verifica daca textul afisat corespunde diapozitivului din prezentare.
Proiectarea obiectului SlideCanvas
Clasa SlideCanvas va contine matricea de imagini care urmeaza sa fie afisate. Aceasta clasa citeste fisierele de imagini .gif, construieste matricea, afiseaza imaginile pentru utilizator si furnizeaza metode pentru controlul afisarii. Clasa SlideCanvas inregistreaza numarul de diapozitive din matrice, diapozitivul curent si un indicator care semnaleaza daca diapozitivele sunt afisate sau nu.
Proiectarea obiectului SlideText
Clasa SlideText este asemanatoare cu clasa SlideCanvas, dar contine text, nu imagini. Sirurile de caractere sunt citite din fisiere .txt si contin descrieri ale diapozitivelor din obiectul SlideCanvas.
Clasa SlideText are aceleasi variabile de referinta si metode similare cu cele ale clasei SlideCanvas. In locul metodelor pentru activarea si dezactivarea afisarii diapozitivelor, clasa SlideText va furniza metode care activeaza si dezactiveaza afisarea textului.
Proiectarea controalelor
In afara de meniuri, multe aplicatii afiseaza pe ecran un tip oarecare de controale grafice. Selectarea controalelor corespunzatoare si dispunerea acestora reprezinta elemente importante in proiectare. Controalele pot fi grupate si plasate ca bare cu instrumente sau ca palete. Aplicatiile pun la dispozitia utilizatorilor butoane mari, prin care acestia pot indica efectuarea unei anumite operatii, sau imagini care conduc utilizatorul in realizarea diferitelor sarcini. Aplicatiile pot furniza utilizatorilor bare de derulare, casete cu liste derulante sau butoane radio. Java contine mecanisme pentru implementarea multor tipuri de controale.
Puteti crea controale ca instante ale obiectelor existente in pachetul java.awt sau prin extinderea si combinarea acestor obiecte, rezultand controale personalizate. Controalele sunt obiecte distincte care pot fi grupate intr-o aplicatie. De obicei, ele sunt separate de zona de afisare, desi nu este obligatoriu. Fiecare control sau grup de controale trebuie sa contina o procedura de tratare a evenimentelor, astfel incat sa poata reactiona corespunzator atunci cand este selectat de utilizator.
Controalele aplicatiei SlideShow vor fi construite sub forma de obiect Panel, continand instante ale clasei Button. Controalele vor furniza butoane care sa-i permita utilizatorului deplasarea de la un diapozitiv la altul, precum si saltul la primul sau la ultimul diapozitiv al prezentarii.
Proiectarea casetelor de dialog
In aplicatia SlideShow vor fi create trei casete de dialog. Prima dintre ele va fi activata de optiunea Load (Incarcare) a meniului File si va permite utilizatorului sa selecteze numele fisierului care va fi incarcat. Celelalte doua casete de dialog vor fi activate de meniul Help.
Caseta de dialog Load va fi creata cu ajutorul clasei FileDialog, existenta in Java. Clasa FileDialog este un exemplu de clasa utilitara, care poate fi folosita de mai multe aplicatii. Pentru aceasta, o clasa utilitara trebuie sa fie autocontinuta si usor de inteles. Setul de dezvoltare Java (JDK) furnizeaza cateva utilitare. Altele pot fi obtinute din diverse surse, cum ar fi referinta Java din situl Gamelan. Utilitarele dezvoltate pentru o aplicatie pot fi transferate cu usurinta in alte aplicatii.
Celelalte doua casete de dialog vor fi create ca extensii ale clasei Panel. Titlul si continutul fiecarei casete de dialog vor fi incluse in extensiile create. Ele vor pune la dispozitia utilizatorului un buton OK pentru inchiderea ferestrei.
Operatiile de intrare/iesire din fisiere
Una dintre deosebirile esentiale intre dezvoltarea miniaplicatiilor si dezvoltarea aplicatiilor independente este faptul ca aplicatiile au acces la fisierele locale pentru operatii de scriere si de citire. In capitolul 17, a fost prezentat un scurt exemplu de scriere intr-un fisier. Aceasta sectiune cuprinde detalii suplimentare despre citirea fisierelor si despre accesul la fisierele sistemului local.
Aplicatia SlideShow citeste mai multe fisiere diferite. Mai intai, citeste un fisier pentru a determina ce diapozitive fac parte din prezentare, apoi fisierele care contin diapozitivele respective. La sfarsit, sunt citite fisierele de text care contin descrierea fiecarui diapozitiv.
In cadrul accesului la primul fisier, aplicatia va citi numele fisierelor fara extensie, astfel incat acestea sa poata fi folosite atat pentru imagini, cat si pentru comentarii. Diapozitivele sunt stocate in fisiere cu extensia .gif, iar comentariile referitoare la ele in fisiere cu extensia .txt.
Desi exista mai multe tipuri de fluxuri care pot fi folosite pentru citirea unui fisier, cea mai simpla metoda de executare a operatiilor de intrare/iesire consta in folosirea unui obiect de tip RandomAccessFile. Acesta incapsuleaza multe dintre mecanismele de acces la fisiere, reducand complexitatea codului pentru citirea unui fisier.
In timpul executarii metodelor din clasa RandomAccessFile pentru citirea sau scrierea fisierelor, pot aparea diferite erori, cum ar fi inexistenta fisierelor, fisiere alterate, fisiere protejate la scriere sau alte probleme legate de accesul la fisier si de stocarea acestuia. Desi clasa poate sa trateze o parte dintre aceste probleme, multe erori trebuie raportate utilizatorului. Ca urmare, metodele acestei clase lanseaza exceptia IOException
.
Observatie: Obiectele Exception reprezinta o modalitate eleganta de tratare o conditiilor de eroare. Orice secventa de cod care apeleaza o metoda capabila sa lanseze o exceptie trebuie fie sa intercepteze exceptia, fie sa o returneze metodei apelante. Este posibil ca o metoda sa lanseze mai multe tipuri de exceptii. (A se vedea capitolul 8, "Integrarea tuturor elementelor: fire de executie, exceptii si altele", pentru detalii referitoare la lansarea si interceptarea exceptiilor.)
Daca intercepteaza exceptia, metoda trebuie sa furnizeze codul necesar. Codul pentru interceptarea exceptiei va respecta sintaxa de mai jos, in care metoda sau metodele ce pot sa lanseze exceptii ar urma sa fie incadrate de acoladele care urmeaza dupa cuvantul cheie try:
try catch (TipExceptie numeexceptie)
Codul de tratare a exceptiei este incadrat de acoladele care urmeaza dupa cuvantul cheie catch. Obiectul de tip Exception care va fi interceptat trebuie sa aiba un nume prin care sa poata fi desemnat. Modalitatea de tratare a exceptiei depinde de tipul problemei si de contextul in care aceasta a aparut.
Unele exceptii pot fi ignorate. In acest caz, acoladele pentru instructiuni incadreaza un spatiu alb. Alte exceptii pot fi afisate pe ecranul utilizatorului, cu sau fara un mesaj de eroare. Unele exceptii sunt afisate in propriile casete. Altele pot fi inregistrate intr-un fisier jurnal. Unele pot determina chiar oprirea programului. In aplicatia SlideShow, exceptiile aparute in timpul operatiilor de intrare/iesire din fisiere determina afisarea unui mesaj de eroare in fereastra standard de iesire, adica fereastra din care a fost lansata, nu cea in care ruleaza aplicatia.
Relatiile dintre obiecte
Dupa ce ati stabilit componentele majore ale aplicatiei, trebuie sa determinati relatiile dintre acestea. Exista obiecte intre care nu apare nici-o interactiune. Unele obiecte afecteaza aspectul ecranului pe care apar, in timp ce altele afecteaza aspectul mai multor ecrane. Meniul trebuie sa interactioneze cu multe dintre obiectele aplicatiei.
In aplicatia care urmeaza, casetele de dialog sunt afisate cu ajutorul optiunilor de meniu. Meniul este folosit si pentru incarcarea unei prezentari cu diapozitive in fereastra principala. Controalele definite trebuie sa apeleze metodele panoului pentru a modifica afisarea pe ecran. Functiile furnizate de controale trebuie sa fie disponibile si din meniu; prin urmare, si metodele controalelor trebuie sa fie disponibile pentru meniu.
Relatiile dintre obiecte si utilizatorii programului indica evenimentele care trebuie sa fie tratate. Actiunile care apar in cadrul meniului vor fi tratate de procedura de tratare a evenimentelor din clasa SlideShow, iar actiunile care apar in casetele de dialog vor fi tratate de procedura de tratare a evenimentelor din caseta de dialog. La randul lor, si controalele contin o procedura de tratare a evenimentelor care trebuie sa raspunda la actiunile utilizatorului.
Principiul lui Peter: In lumea reala, proiectarea aplicatiilor este ingreunata de natura schimbatoare a cerintelor utilizatorilor. Procesul de proiectare porneste intr-o directie, dar pe parcurs apar noi cerinte si noi restrictii. Flexibilitatea limbajului Java simplifica aceasta problema; totusi, abilitatea de coordonare a proiectelor este foarte importanta pentru finalizarea cu succes a unei aplicatii.
Implementarea unei aplicatii reale
In cadrul procesului de implementare a aplicatiei, veti crea clasele proiectate in sectiunea anterioara, instante ale acestora, precum si instante ale altor clase, care sa indeplineasca cerintele aplicatiei. Pentru crearea aplicatiei SlideShow, trebuie definite sapte noi clase.
Construirea ferestrei principale
Prima clasa care urmeaza sa fie definita este o extensie a clasei Frame si se numeste SlideShow. Fereastra principala este construita in aceasta clasa, ca si metoda main( ),folosita pentru pornirea aplicatiei. Dupa declararea noii clase, sunt definite doua containere principale pentru crearea instantelor obiectelor MenuBar si SlidePanel. Iata aceste declaratii:
public class SlideShow extends Frame
Crearea barei de meniuri
Clasa SlideShow este folosita si pentru construirea barei de meniuri, care este o instanta a clasei MenuBar din pachetul java.awt. Prin comparatie cu efortul depus pentru stabilirea continutului meniului, codul care creeaza meniul este destul de scurt. Pentru mai multa claritate, acest cod este plasat intr-o metoda separata, numita InitializeMenu( ). Metoda, prezentata in listingul 18.2, este apelata de metoda SlideShow( ).
Pentru a asigura usurinta de folosire a barei de meniuri, articolele sunt grupate in categorii de operatii. Bara de meniuri a aplicatiei SlideShow contine trei categorii: File, Display si Help, definite cu ajutorul clasei Menu. Aricolele de meniu sunt definite ca obiecte MenuItem si CheckBoxMenuItem, din acelasi pachet.
Ca si categoriile de meniu, articolele de meniu trebuie grupate logic. Daca un anumit meniu poate fi grupat in subcategorii, puteti folosi metoda addSeparator( ) pentru a introduce o linie care separa grafic categoriile de articole din meniu.
Dupa ce definiti toate articolele unui anumit meniu, trebuie sa il adaugati la bara de meniuri, folosind metoda add( ).
Listingul 18.2. Metoda InitializeMenu().
// Creeaza meniul si il ataseaza la bara de meniuri
private void InitializeMenu()
Figura 18.2 prezinta meniul Display al aplicatiei SlideShow. Meniul contine toate articolele definite in cod si o linie de separare intre subcategorii.
Tratarea evenimentelor
Procedura de tratare a evenimentelor din clasa SlideShow raspunde la evenimentele aparute in meniul aplicatiei. Codul procedurii de tratare a evenimentelor este prezentat in listingul 18.3. Remarcati faptul ca numele articolului de meniu este folosit pentru a determina optiunea selectata de utilizator. Prin urmare, numele articolelor din procedura de tratare a evenimentelor trebuie sa coincida cu cele din meniu.
Procedura de tratare a evenimentelor se ocupa de afisarea celor trei casete de dialog mentionate in sectiunea precedenta. In fiecare caz, procedura creeaza caseta de dialog si atribuie un nume instantei. Acesta este folosit apoi pentru afisarea casetei de dialog. La inchiderea casetei de dialog Load, aceasta transmite panoului de afisare numele fisierului selectat, astfel incat sa fie incarcat fisierul corespunzator.
Pentru meniul Display, procedura de tratare a evenimentelor apeleaza metodele corespunzatoare ale panoului de afisare. Atunci cand utilizatorul selecteaza optiunea Exit (Iesire) sau inchide fereastra, procedura determina iesirea din aplicatie.
Listingul 18.3. Procedura de tratare a evenimentelor pentru aplicatia SlideShow
// Procedura de tratare a evenimentelor care raspunde la evenimentele
// din fereastra si din meniu
public boolean handleEvent(Event evt) else if (evt.target instanceof CheckboxMenuItem) else if (evt.arg.equals("No Slides"))
} else if(evt.target instanceof MenuItem) else if (evt.arg.equals("Forward")) else if (evt.arg.equals("Back")) else if (evt.arg.equals("Beginning")) else if (evt.arg.equals("End")) else if (evt.arg.equals("Exit")) else if (evt.arg.equals("About SlideShow")) else if (evt.arg.equals("Help Topics")) // trateze evenimentul
Lansarea aplicatiei
Ultima metoda definita in clasa SlideShow este main( ). Aceasta este prima metoda apelata la lansarea oricarei aplicatii. Listingul 18.4 prezinta aceasta metoda.
Metoda main( ) a aplicatiei SlideShow asteapta sa i se transmita ca argument din linia de comanda numele unui fisier. Daca aplicatia nu primeste acest parametru, afiseaza un mesaj si isi incheie executia. In cazul in care numele fisierului este transmis ca argument, metoda main( ) executa urmatoarele operatii:
Creeaza o noua instanta a clasei SlideShow
Stabileste titlul cadrului principal
Redimensioneaza cadrul aplicatiei la dimensiunile ferestrei curente
Afiseaza obiectele construite la apelarea metodei SlideShow
Redimensionarea cadrului principal al aplicatiei in functie de fereastra curenta este un concept esential in proiectare. In acest mod, va asigurati ca fereastra aplicatiei incape pe ecranul utilizatorului.
Listingul 18.4. Metoda main().
// Metoda main() folosita pentru lansarea aplicatiei
public static void main(String args[])
Adaugarea clasei SlidePanel
In continuare, este implementata clasa SlidePanel, adaugata la aplicatie in metoda SlideShow( ). Aceasta clasa defineste zona principala de afisare a aplicatiei, care este impartita in doua regiuni: una pentru imagini si una pentru text. Aceste zone corespund celor doua obiecte din clasa SlidePanel.
Modificarea celor doua zone de afisare trebuie sa se faca in mod sincronizat. Ca urmare, aceste obiecte din clasa SlidePanel sunt declarate ca protejate si toate evenimentele referitoare la
continutul lor intervin prin obiectul SlidePanel. Acest lucru devine important daca va uitati la codul controalelor. Declaratia si constructorul clasei SlidePanel sunt prezentate in listingul 18.5.
Listingul 18.5. Constructorul clasei SlidePanel.
/**
* Clasa SlidePanel stocheaza obiectele care sunt folosite
* la prezentare. Obiectele stocate intr-o matrice sunt
* afisate pe rand utilizatorului
*/
class SlidePanel extends Panel
}
Toate componentele care contribuie la afisarea in zona principala trebuie sa foloseasca metodele definite in obiectul care furnizeaza afisarea principala. Pentru controalele personalizate, numele obiectului care furnizeaza afisarea este transmis ca parametru. Pentru optiunile de meniu, metoda corecta este activata de procedura de tratare a evenimentelor.
In obiectul SlidePanel, definiti metode pentru fiecare functie prevazuta in faza de proiectare. Corpul acestor metode contine apeluri ale unor metode similare pentru cele doua obiecte afisate. (A se vedea listingul 18.6.) Aceste metode vor fi implementate la definirea obiectelor SlideCanvas si SlideText.
Listingul 18.6. Metodele clasei SlidePanel.
public void ShowNextSlide()
public void ShowPrevSlide()
public void ShowFirstSlide()
public void ShowLastSlide()
public void NoText()
public void ShowText()
public void NoSlides()
public void ShowSlides()
public void LoadShow(StringShowName)
Adaugarea obiectului SlideCanvas
Creati mai intai obiectul SlideCanvas, folosit pentru afisarea imaginilor. Informatiile continute de acest obiect sunt stocate in variabile implementate ca protejate. Declaratia completa arata astfel:
/**
* SlideCanvas este o extensie a clasei Canvas.
* Furnizeaza modalitati pentru afisarea diapozitivelor
*/
class SlideCanvas extends Canvas
Clasa afiseaza imaginile pe ecran prin redefinirea metodei paint( ). Daca afisarea este dezactivata, noua metoda va afisa pe ecran un dreptunghi gol. In caz contrar, metoda va determina dimensiunea curenta a ferestrei de afisare si va afisa o imagine cu dimensiunile respective:
public void paint(Graphics g)
}
Metodele de acces necesare pentru aceste variabile sunt descrise in sectiunea "Proiectarea unei aplicatii reale" din acest capitol. Ele se asigura ca instanta unei clase este redesenata de fiecare data cand diapozitivul curent este schimbat. Puteti aprecia si in acest caz avantajul folosirii unor variabile protejate. Daca variabila care contine numarul diapozitivului curent ar fi accesibila direct, nu ar mai exista nici o garantie in privinta reafisarii la schimbarea diapozitivului.
Primele metode de acces sunt cele care permit utilizatorului sa parcurga prezentarea cu diapozitive. Metodele pentru deplasarea inainte sau inapoi cu cate un diapozitiv trebuie sa verifice daca nu s-au depasit limitele matricei de imagini. In cazul in care metoda ajunge la unul dintre capetele matricei, ramane la acelasi diapozitiv. Metoda opereaza prin stabilirea noului diapozitiv curent si apelarea metodei repaint( ) pentru afisarea diapozitivului, ca in fragmentul de cod urmator:
public void ShowNextSlide()
}
public void ShowPrevSlide()
}
public void ShowFirstSlide()
public void ShowLastSlide()
In vederea activarii si dezactivarii afisarii diapozitivelor, trebuie sa fie furnizate metode de acces pentru variabila de tip boolean slideshow. Acestea schimba valoarea variabilei, apoi forteaza redesenarea ecranului, astfel incat noua valoare sa aiba efect imediat:
public void NoSlides()
public void ShowSlides()
Ultima metoda care trebuie definita in clasa SlideCanvas este cea care incarca matricea de imagini. Aceasta metoda trebuie sa deschida fisierul specificat de utilizator, sa citeasca fiecare linie din fisier, sa stocheze liniile citite in matrice, sa inchida fisierul si sa trateze exceptiile aparute. Aceste functii sunt prezentate in fragmentul de cod urmator:
public void LoadShow(String LoadFile)
// Inchide fisierul.
ListFile.close();
// Detecteaza erorile aparute la citirea din fisier.
} catch (java.io.IOException e)
}
RandomAccessFile este o clasa care implementeaza doua interfete diferite, DataOutput si DataInput. Ca urmare, obiectele care sunt instante ale acestei clase pot fi folosite atat pentru scrierea, cat si pentru citirea fisierelor. Aplicatia SlideShow nu are nevoie sa scrie intr-un fisier; oricum, intr-o aplicatie, scrierea intr-un fisier se realizeaza intr-un mod asemanator cu citirea din fisier.
Acest tip de acces la fisiere trateaza scrierea si citirea fisierelor de tip text. Pentru citirea fisierelor care contin imagini, lucrurile se schimba. Miniaplicatiile folosesc metoda getImage( ) pentru incarcarea unei imagini dintr-un fisier sau de la o adresa URL. Aceasta metoda nu poate fi folosita in aplicatii, deoarece preluarea imaginilor se bazeaza pe adresa URL a miniaplicatiei. Aplicatiile nu au adrese URL, asa incat necesita un alt mecanism pentru incarcarea imaginilor.
Imaginile pot fi incarcate in aplicatii cu ajutorul metodei getImage( ) din clasa Toolkit. Pentru aceasta, aplicatia trebuie sa obtina mai intai un obiect Toolkit si apoi sa incarce imaginea. Metoda getImage( ) din obiectul Toolkit incapsuleaza toate detaliile necesare pentru citirea fisierului si pentru stocarea imaginii. Iata fragmentul de cod folosit pentru incarcarea prezentarii cu diapozitive:
NumSlides = i;
for (i=0; i<NumSlides; i++)
CurrentSlide = 0;
}
}
Adaugarea obiectului SlideText
Clasa SlideText este similara cu clasa SlideCanvas, cu exceptia faptului ca include o matrice de siruri de caractere. Iata cum se modifica declaratia acestei clase:
/**
* SlideText este o extensie a clasei TextArea.
* Furnizeaza modalitati pentru afisarea textului care descrie diapozitivele.
*/
class SlideText extends TextArea
Clasele pentru text nu contin o metoda paint( ). Metoda normala setText( ) primeste ca parametru un sir de caractere, pe care il afiseaza ca text al obiectului. Pentru a impiedica alte obiecte sa modifice textul afisat, redefiniti metoda setText( ) si implementati-o din nou, de data aceasta fara nici-un parametru, ca in exemplul urmator:
// Redefineste metoda setText, astfel incat textul sa
// nu fie sters accidental.
public void setText(String str)
Noua implementare a metodei setText( ) stabileste textul pe baza elementului curent al matricei. Prin urmare, nu aveti nevoie de nici-un parametru. Daca textul nu trebuie afisat, stabiliti un sir de caractere nul, folosind versiunea setText( ) din superclasa, deoarece metoda setText(String) a fost redefinita pentru clasa in care lucrati. Noua implementare a metodei setText( ) este:
public void setText()
Clasa SlideText trebuie sa furnizeze aceleasi metode de acces ca si clasa SlideCanvas. Remarcati ca si aceste metode efectueaza verificarea limitelor matricei:
public void ShowNextText()
}
public void ShowPrevText()
}
public void ShowFirstText()
public void ShowLastText()
Mascarea si afisarea textului se realizeaza prin furnizarea unor metode de acces la variabila de tip boolean corespunzatoare. In loc sa forteze redesenarea ecranului, aceste metode apeleaza direct metoda setText( ) :
public void NoText()
public void ShowText()
Metoda load( ) respecta acelasi algoritm ca si in clasa SlideCanvas ; insa, este implementata o noua metoda pentru citirea unui intreg fisier intr-un element al matricei de siruri de caractere. Aceasta metoda, numita getText( ), foloseste clasa RandomAccessFile in acelasi fel ca la citirea numelor de fisiere. Insa in loc sa citeasca o linie din fisier, cautand caracterul de marcare a sfarsitului de linie, citeste intreg fisierul intr-un sir de caractere. Iata cum arata noua metoda :
//Citeste textul dintr-un fisier intr-un element al matricei.
protected String getText(String LoadFile) catch (java.io.IOException e)
return (new String(b,o));
}
Metoda load( ) din clasa SlideText poate fi implementata astfel :
//Incarca matricea de siruri de caractere pe baza numelui
//de fisier din LoadFile.
public void LoadShow(String LoadFile)
ListFile.close();
} catch (java.io.IOException e)
NumTexts = i;
for (i=0; i<NumTexts; i++)
CurrentText = 0;
}
Adaugarea controalelor
Acum puteti afisa imagini si text, asa incat urmeaza sa va concentrati asupra procesului de creare a controalelor folosite pentru navigare in prezentarea cu diapozitive. Controalele constau in patru butoane. Acestea vor fi grupate intr-un singur obiect, care este o extensie a clasei Panel.
Controalele trebuie sa faca referire la un anumit obiect SlidePanel, in care determina schimbarea diapozitivelor. Ca urmare, constructorul controalelor primeste ca parametru o instanta a obiectului SlidePanel. Aceasta valoare este stocata ca variabila interna si va fi folosita de procedura de tratare a evenimentelor din cadrul clasei. Iata cum arata declaratia si constructorul controalelor :
/**
* Bara de controale pentru deplasare in prezentarea cu diapozitive
*/
class ShowControls extends Panel
Atunci cand utilizatorul interactioneaza cu controalele, se declanseaza un eveniment. Controalele trebuie sa reactioneze la acest eveniment si sa execute operatia respectiva. Metoda action( ) a controalelor este activata de mediul de executie al aplicatiei, atunci cand apare un eveniment de actionare in panoul de controale, de exemplu apasarea unui buton. Examinand destinatia evenimentului, metoda determina daca a fost apasat un buton. Daca destinatia evenimentului nu este un buton, va fi apelata metoda action( ) din superclasa, ceea ce permite mediului de executie sa reactioneze la alte actiuni:
public boolean action(Event evt,Object arg) else return super.action (evt,arg);
}
Atunci cand metoda action( ) afla ca destinatia actiunii este un buton, apeleaza metoda handleButton( ). Aceasta determina ce buton a fost apasat si apeleaza metoda corespunzatoare butonului respectiv din clasa SlidePanel :
//Determina butonul care a fost apasat si actioneaza corespunzator
//Actiunile se refera la panoul la care este atasata bara de control
public void handleButton(String bname) else if (bname.equals('<')) else if (bname.equals('<<')) else if (bname.equals('>>'))
}
Adaugarea casetelor de dialog
Casetele de dialog, in forma lor generala, au fost prezentate in capitolul 17. Aceasta sectiune se refera la modul de implementare a celor trei casete de dialog care sunt activate ca raspuns la selectarea optiunilor de meniu Load, Help Topics si About SlideShow.
Caseta de dialog File
Caseta de dialog File este o caseta de dialog aparte. Implementata in pachetul java.awt, aceasta permite utilizatorului sa selecteze un anumit fisier stocat in sistemul propriu. In mod prestabilit, caseta de dialog afiseaza continutul directorului din care a fost lansata aplicatia. Insa, directorul afisat de caseta de dialog poate fi modificat de catre aplicatie.
Caseta de dialog poate primi ca parametru un nume de fisier prestabilit, astfel incat sa afiseze numai fisierele care corespund numelui respectiv. Daca numele de fisier contine caractere de inlocuire, vor fi afisate toate fisierele care corespund expresiei respective. In acest fel, caseta de dialog File poate fi folosita pentru afisarea fisierelor de un anumit tip.
Caseta de dialog este astfel implementata incat aspectul ei depinde de sistemul de operare pe care este rulata aplicatia. Aceasta inseamna ca utilizatorul este deja familiarizat cu aspectul si comportarea casetei de dialog, dar aplicatia pastreaza toate avantajele independentei de platforma. Din fericire, diferentele legate de aspectul casetei de dialog nu trebuie introduse de programator.
Constructorul casetei de dialog File primeste trei parametri: cadrul curent, ca parinte al noii ferestre; un titlu pentru caseta de dialog, care in acest caz este Get New Slide Show; si un parametru care indica daca este vorba despre o caseta de dialog de tip Open sau de tip Save. In aplicatia SlideShow, caseta de dialog File este apelata astfel :
new FileDialog((Frame) this, 'Get New Slide Show', FileDialog.LOAD);
Clasa HelpBox
Caseta de dialog Help este proiectata ca o extensie a clasei Panel si are o organizatie de tip grila. Articolele de asistenta sunt adaugate ca etichete. Constructorul casetei de dialog asigura redimensionarea acesteia, dar nu se ocupa si de afisarea pe ecran. Metodele care creeaza caseta de dialog vor stabili momentul afisarii acesteia.
Butonul OK, specificat in faza de proiectare, este adaugat in partea de jos a casetei de dialog. El este plasat intr-un panou propriu, astfel incat sa aiba forma unui buton standard, in loc sa ocupe intreaga latime a grilei. Listingul 18.7 prezinta codul constructorului HelpBox.
Listingul 18.7. Crearea casetei de dialog Help.
/**
* Fereastra Help contine informatii de baza pentru explicarea
* controalelor folosite in prezentare.
*/
class HelpBox extends Dialog
}
Caseta de dialog trebuie sa contina o procedura de tratare a evenimentelor care sa raspunda actiunilor utilizatorului in caseta de dialog. Acesta poate executa clic pe butonul OK pentru a inchide caseta de dialog sau poate inchide fereastra care o contine. In ambele cazuri, aplicatia elimina de pe ecran caseta de dialog, indicand faptul ca resursa folosita de obiect nu mai este disponibila. Procedura de tratare a evenimentelor este prezentata in listingul 18.8.
Listingul 18.8. Procedura de tratare a evenimentelor din clasa HelpBox
//Procedura de tratare a evenimentelor inchide fereastra daca
//utilizatorul a apasat butonul OK sau butonul de inchidere a
//ferestrei
public boolean handleEvent(Event evt) else if('OK'.equals(evt.arg))
return false;
}
Clasa AboutBox
Caseta de dialog About este asemanatoare cu caseta de dialog Help Topics. Continutul fiind insa diferit, aceasta caseta de dialog este altfel organizata. In centrul panoului, dispunerea de tip grila permite afisarea informatiilor despre autor. Butonul OK este afisat intr-un panou propriu, in partea inferioara a ferestrei. Codul clasei About este prezentat in listingul 18.9.
Listingul 18.9. Crearea casetei de dialog About.
/**
* Creeaza caseta de dialog About pentru aplicatia SlideShow.
*/
class AboutBox extends Dialog
//Procedura de tratare a evenimentelor inchide
//ferestra daca utilizatorul a apasat butonul OK
//sau butonul de inchidere a ferestrei.
public boolean handleEvent(Event evt) else if('OK'.equals(evt.arg))
return false;
}
}
Proiectul complet
Pentru testarea aplicatiei, trebuie sa o puteti rula corect. Ea se lanseaza cu linia de comanda, astfel :
java SlideShow nume_fisier.txt
unde nume_fisier.txt este numele fisierului care contine lista diapozitivelor ce urmeaza sa fie afisate. Acest fisier poate fi creat cu ajutorul unui editor de text standard, tinand seama de faptul ca intre numele de fisiere trebuie sa fie inserat cate un caracter nul. Acelasi gen de editor de text poate fi folosit si la scrierea textelor atasate diapozitivelor.
De exemplu, puteti crea un fisier numit
Hawaii.txt, pentru o prezentare cu
diapozitive care sa contina o lista de imagini din ultima vacanta pe care ati
petrecut-o in
r Mountain1.gif
r Mountain2.gif
r Beach1.gif
r Beach2.gif
r Luau1.gif
r Luau2.gif
Textul din fisierul Hawaii.txt va arata astfel :
Mountain1Mountain2Beach1Beach2Luau1Luau2
unde simbolul reprezinta caracterul nul. Daca aveti probleme la includerea unui caracter nul intr-un editor de texte, puteti crea un program Java simplu, care sa citeasca numele de fisiere din linia de comanda si sa le adauge in fisier. Dupa fiecare nume de fisier, adaugati n, care reprezinta caracterul nul. Aceasta va permite sa folositi in program metoda readline( ), in loc sa adaugati codul pentru interpretarea fisierului.
Sugestie:Codul ASCII pentru caracterul nul este 010. In Microsoft Word, puteti genera caracterul nul asteptat de Java ca marcaj de sfarsit de linie, tinand apasata tasta Alt si apasand tastele 010. Din nefericire, cand salveaza fisierul, programul Word adauga la sfarsitul acestuia un caracyer CR (carriage return-retur de car). Desi aplicatia SlideShow va putea rula, ea va cauta la sfarsit inca un fisier si, negasindu-l, va genera o eroare. In capitolul 19, 'Modernizarea aplicatiilor', veti afla cum puteti rezolva aceasta problema pe termen lung, construind prezentarile cu diapozitive chiar in cadrul aplicatiei.
Pentru a continua
prezentarea de diapozitive cu imagini din vacanta petrecuta in
fisiere contin explicatii referitoare la imaginile prezentate. De exemplu, fisierul Mountain.txt ar putea contine textul :
Vedere spre sud de pe muntele
a insulei
dupa un urcus minunat care a durat toata ziua.
Fisierele de text trebuie sa contina informatii care sa va ajute sa va amintiti detalii destre fiecare imagine. Acestea se vor dovedi utile in cazul in care doriti sa pastrati imaginile o perioada mai lunga de timp.
Aplicatia completa este prezentata in listingul 18.10. Acest exemplu ilustreaza posibilitatile limbajului Java. De acum, ar trebui sa puteti folosi tehnicile prezentate in acest capitol pentru a construi programe Java originale.
Dupa ce studiati acest exemplu, incercati sa modificati aplicatia, pentru a dobandi mai multa experienta de programare in Java. De exemlu, puteti rescrie clasa AboutBox, astfel incat constructorul sa accepte doua argumente: numele autorului si titlul programului. Clasa AboutBox va sti cum sa afiseze aceste informatii si va putea fi folosita si in alte aplicatii.
Puteti folosi tehnici asemanatoare si pentru crearea unor casete de asistenta standard. Argumentul constructorului poate fi un sir de caractere sau o lista de siruri de caractere, continand informatiile care urmeaza sa fie afisate in fereastra de asistenta. Astfel de utilitare Java sunt in curs de dezvoltare.
Listingul 18.10. Aplicatia SlideShow completa.
import java.awt.*;
import java.applet.*;
import java.io.RandomAccessFile;
/**
* Creeaza o fereastra cu un panou pentru prezentarea de
* diapozitive,meniul si controalele aplicatiei.
*/
public class SlideShow extends Frame
//Creeaza meniurile si le ataseaza la bara de meniuri.
private void InitializeMenu()
//Procedura de tratare a evenimentelor care raspunde
//evenimentelor din fereastra si evenimentelor din meniu
public boolean handleEvent(Event evt) else if(evt.target instanceof CheckboxMenuItem) else if (evt.arg.equals('No Slides'))
} else if(evt.target instanceof MenuItem) else if (evt.arg.equals('Forward')) else if (evt.arg.equals('Back')) else if (evt.arg.equals('Beginning')) else if (evt.arg.equals('End')) else if (evt.arg.equals('Exit')) else if (evt.arg.equals('About SlideShow')) else if (evt.arg.equals('Help Topics'))
}
return super.handleEvent(evt); //Lasa clasa parinte
//sa trateze evenimentul.
}
//Metoda main() folosita pentru lansarea aplicatiei
public static void main(String arg[])
//Creeaza o instanta a acestui obiect.
SlideShow ss = new SlideShow(args[0]);
ss.setTitle('Slide Show'); //Stabileste titlul cadrului
ss.pack(); //Impacheteaza componentele
//Redimensioneaza cadrul la dimensiunea ferestrei
Dimension d;
d = Toolkit.getDefaultToolkit().getScreenSize();
ss.resize(d.width, d.height);
ss.show(); //Afiseaza cadrul
}
}
/**
* Clasa SlidePanel stocheaza obiectele care sunt folosite
* la prezentare.
* Obiectele stocate intr-o matrice sunt afisate pe rand
* pe ecranul utilizatorului.
*/
class SlidePanel extends Panel
public void NoText()
public void ShowText()
public void NoSlides()
public void ShowSlides()
public void LoadShow(String ShowName)
public void ShowNextSlide()
public void ShowPrevSlide()
public void ShowFirstSlide()
public void ShowLastSlide()
}
/**
* SlideCanvas este o extensie a clasei Canvas.
* Furnizeaza modalitati pentru afisarea diapozitivelor.
*/
class SlideCanvas extends Canvas
public void NoSlides()
public void ShowSlides()
public void paint(Graphics g)
}
public void ShowNextSlide()
}
public void ShowPrevSlide()
}
public void ShowFirstSlide()
public void ShowLastSlide()
public void LoadShow(String LoadFile)
//Inchide fisierul.
ListFile.close();
} catch (java.io.IOException e)
NumSlides = i;
for (i=0; i<NumSlides; i++)
CurrentSlide = 0;
}
}
/**
* SlideText este o extensie a clasei TextArea.
Furnizeaza modalitati pentru afisarea textului
* care descrie diapozitivele.
*/
class SlideText extends TextArea
public void NoText()
public void ShowText()
//Redefineste metoda setText(), astfel incat textul
//sa nu poata fi sters accidental.
public void setText(String str)
public void setText()
public void ShowNextText()
}
public void ShowPrevText()
}
public void ShowFirstText()
public void ShowLastText()
//Incarca matricea de siruri de caractere pe baza
//numelui de fisier din LoadFile.
public void LoadShow(String LoadFile)
ListFile.close();
} catch (java.io.IOException e)
NumTexts = i;
for (i=0; i<NumTexts; i++)
CurrentText = 0;
}
//Citeste textul unui element dintr-un fisier.
protected String getText(String LoadFile) catch (java.io.IOException e)
return (new String(b,0));
}
}
/**
* Bara de controale pentru deplasare in prezentarea de diapozitive
*/
class ShowControls extends Panel
//Determina butonul care a fost apasat si actioneaza
//corespunzator.
//Actiunile se refera la panoul la care este atasata
//bara de controale.
public void handleButton(String bname) else if (bname.equals('<')) else if (bname.equals('<<')) else if (bname.equals('>>'))
}
public boolean action(Event evt, Object arg) else return super.action(evt,arg);
}
}
/**
* Creeaza caseta de dialog About pentru SlideShow
*/
class AboutBox extends Dialog
//Procedura de tratare a evenimentelor inchide fereastra
//daca utilizatorul a apasat butonul OK sau butonul
//de inchidere a ferestrei.
public boolean handleEvent(Event evt) else if('OK'.equals(evt.arg))
return false;
}
}
/**
* Fereastra Help contine informatii pentru explicarea
* controalelor folosite in prezentare.
*/
class HelpBox extends Dialog
//Procedura de tratare a evenimentelor inchide fereastra
//daca utilizatorul a apasat butonul OK sau butonul
//de inchidere a ferestrei.
public boolean handleEvent(Event evt) else if('OK'.equals(evt.arg))
return false;
}
}
Testarea si depanarea aplicatiei
Desi pentru aplicatia simpla din capitolul 17 nu a fost creat un plan de testare, acesta este necesar in cazul aplicatiilor mai complexe. Planul de testare foloseste componentele stabilite in faza de proiectare. Intrebarea generala este:'Aplicatia se comporta conform asteptarilor?'
Urmatoarele intrebari se refera la cadrul principal al aplicatiei:
r Cadrul care contine aplicatia functioneaza corespunzator?
r Lansarea in executie a aplicatiei decurge corespunzator?
r Odata lansata in executie, aplicatia afiseaza un diapozitiv si un text?
r Executia aplicatiei se incheie atunci cand utilizatorul apasa butonul Close al
cadrului?
r Aplicatia isi modifica dimensiunile atunci cand utilizatorul apasa butonul
de redimensionare al cadrului?
In continuare, iata cateva intrebari legate de aspectul aplicatiei:
r Este afisat fiecare diapozitiv?
r Este afisat textul pentru fiecare diapozitiv?
r Controalele sunt vizibile?
r Este afisat meniul?
Urmatoarele intrebari se refera la meniu. Desi unele dintre articolele din meniu sunt asemanatoare, este important sa le testati pe fiecare in parte. Scopul urmarit este sa verificati modul in care aplicatia va aparea pe ecranul utilizatorului. Ca urmare, verificati urmatoarele elemente:
r Optiunea Exit din meniu determina iesirea din aplicatie?
r Functioneaza optiunea Load din meniu?
r Se deschide caseta de dialog File?
r La selectarea unei prezentari in caseta de dialog File, este aceasta afisata pe ecran?
r Daca utilizatorul anuleaza caseta de dialog File, este afisat in continuare acelasi diapozitiv?
r Este afisata caseta de dialog About in urma selectarii optiunii de meniu About?
r Este afisata caseta de dialog Help in urma selectarii optiunii de meniu Help Topics?
r Optiunea de meniu Forward determina deplasarea la urmatorul diapozitiv din prezentare?
r Optiunea de meniu Backward determina deplasarea la diapozitivul anterior din prezentare?
r Optiunea de meniu Beginning determina deplasarea la primul diapozitiv din prezentare?
r Optiunea de meniu End determina la ultimul diapozitiv din prezentare?
r La selectarea optiunii de meniu No Text, dispare textul de pe ecran?
r La selectarea optiunii de meniu No Text, apare un semn de validare in dreptul acesteia?
r Daca selectati din nou optiunea No Text, textul este reafisat?
r La a doua selectare a optiunii No Text, dispare semnul de validare din dreptul acesteia?
r La selectarea optiunii din meniu No Slides, dispare diapozitivul de pe ecran?
r La selectarea optiunii No Slides, apare un semn de validare in dreptul acesteia?
r Daca selectati din nou optiunea No Slides, diapozitivul este reafisat?
r La a doua selectare a optiunii No Slides, dispare semnul de validare din dreptul acesteia?
Pe langa faptul ca trebuie sa verificati daca meniul afiseaza ferestrele Help si About, puteti formula cateva intrebari referitoare la ferestrele propriu-zise:
r Este vizibil tot textul la afisarea ferestrei Help?
r Se inchide fereastra Help atunci cand utilizatorul apasa butonul OK?
r Se inchide fereastra Help atunci cand utilizatorul apasa butonul Close al cadrului ei?
r Este vizibil tot textul la afisarea ferestrei About?
r Se inchide fereastra About atunci cand utilizatorul apasa butonul OK?
r Se inchide fereastra About atunci cand utilizatorul apasa butonul Close al cadrului ei?
Controalele vor fi si ele supuse unor teste specifice. Acestea pot parea de prisos, din moment ce metodele au fost deja verificate pentru optiunile din meniu, dar in felul acesta, verificati daca fiecare control este conectat la metoda corespunzatoare. Iata cateva dintre testele care trebuie efectuate pentru aplicatia SlideShow:
r Controlul marcat cu semnul >> determina deplasarea la ultimul diapozitiv din prezentare?
r Controlul marcat cu semnul << determina deplasarea la primul diapozitiv din prezentare?
r Controlul marcat cu semnul > determina deplasarea la urmatorul diapozitiv din prezentare?
r Controlul marcat cu semnul < determina deplasarea la diapozitivul anterior din prezentare?
Acesta este un plan de cuprinzator de testare. El contine teste pentru fiecare element functional al aplicatiei. Desigur, exista si alte intrebari care pot fi puse in legatura cu functionarea corecta a aplicatiei, dar prezentate aici sunt suficiente pentru a verifica implementarea deciziilor luate in faza de proiectare si a alerta programatorii in cazul aparitiei unor probleme neprevazute.
Rezumat
Acest capitol a prezentat modul de dezvoltare a unor aplicatii Java complexe si utile. Au fost folosite numeroase concepte definite in capitolele precedente; ati aflat cateva tehnici pentru dezvoltarea unor aplicatii mai mari. Ideile prezentate aici va vor ajuta sa dezvoltati propriile dumneavoastra aplicatii Java.
De acum, ati patruns secretele limbajului Java, ceea ce va va permite sa urmariti aplicatiile avansate din partea a saptea a cartii. Asigurati-va ca ati inteles bine aplicatia dezvoltata in acest capitol, pentru a putea urmari modificarile ce-i vor fi aduse in capitolul 19.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1423
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved