|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Modele de programare | ||||||
|
||||||
x8r21rm Un nou limbaj de programare nu are sanse sa se impuna fara sa ofere, pe langa sintaxa propriu-zisa un set de biblioteci sau o ierarhie de clase coerenta si cat mai generala. Atunci cand limbajul C a fost prezentat pentru prima data, impreuna cu el a fost prezentata si biblioteca standard de intrare iesire. Primul program C pe care l-am invatat continea deja apelul: printf( "hello, world!" ); Limbajul Java nu numai ca nu face exceptie de la aceasta regula dar chiar o extinde cu ambitia de a oferi totul. Interfata Java pentru programarea aplicatiilor (API) ofera o ierarhie de clase care include functionalitate pentru lucrul cu mai multe fire de executie, lucrul in retea, crearea interfetelor utilizator complexe, grafica, etc. Acest capitol va prezenta o parte a acestei ierarhii impreuna cu cateva tehnici uzuale de scriere a aplicatiilor Java. Exista mai multe moduri de a aborda scrierea unui program. Unul dintre acestea este scrierea unui program care are initiativa pe toata perioada rularii. Acest tip de programe executa in permanenta o secventa de cod, fie si numai o bucla de asteptare a carei conditie depinde de elemente exterioare precum ar fi o apasare de tasta sau sosirea unui pachet de date din retea. Alternativa este aceea de a scrie programe care intra in executie doar atunci cand sunt generate anumite evenimente in sistem. In clipa in care apar aceste evenimente, programul le analizeaza si executa o secventa de cod specifica evenimentului respectiv. Dupa executia codului, programul se opreste din nou pana la aparitia unui nou eveniment. Aceste doua alternative diferite de a aborda scrierea unui program isi au radacinile in moduri diferite de lucru ale sistemelor de operare si in moduri diferite de a gandi interfata cu utilizatorul. Java implementeaza ambele stiluri de programe discutate mai sus. In primul caz, avem o clasa de pornire care contine o functie publica principala si care va fi lansata in executie la apelarea programului. In acest caz programul isi controleaza complet executia ulterioara. In termenii limbajului Java, aceasta este o aplicatie. Distinctia dintre cele doua moduri de organizare a codului este destul de vaga, din cauza ca cele doua moduri de lucru se pot amesteca in realitate, un obiect aplet putand fi in acelasi timp lansat ca aplicatie independenta si invers. Totul depinde de metodele care au fost definite in interiorul clasei de pornire a programului. 7.1 Aplicatii Java Cea mai simpla aplicatie Java este declaratia unei clase de pornire continand o singura metoda, main , ca in exemplul urmator: public class HelloWorld A public static void main( String argsai ) A System.out.println( "Hello, world!" ); S S Acest exemplu defineste o functie principala care afiseaza un simplu mesaj pe consola aplicatiei. Afisarea este lasata in sarcina clasei java.lang.System care contine in interior implementarea iesirii si intrarii standard precum si a iesirii standard de eroare sub forma unor referinte catre obiecte de tip InputStream pentru in (intrarea standard) respectiv PrintStream pentru out si err (iesirea standard si iesirea standard de eroare). Numele metodei main este obligatoriu, la fel si parametrul acesteia. Atunci cand lansam interpretorul Java impreuna cu numele unei clase care reprezinta clasa de pornire, interpretorul cauta in interiorul acestei clase definitia unei metode numite main . Aceasta metoda trebuie sa fie obligatoriu publica si statica. In acelasi timp, metoda main trebuie sa nu intoarca nici un rezultat si sa accepte un singur parametru de tip tablou de siruri de caractere. Daca interpretorul gaseste aceasta metoda in interiorul clasei apelate, el lanseaza in executie metoda main . Atentie, metoda main fiind de tip static, nu poate apela decat variabile statice. De obicei insa, metoda main nu face nimic altceva decat sa-si prelucreze parametrul dupa care sa creeze o serie de obiecte care vor controla executia ulterioara a aplicatiei. Singurul parametru al metodei main este un tablou care contine argumentele aflate pe linia de comanda in momentul apelului. Nu este necesara transmiterea numarului de argumente care au fost gasite pe linia de comanda pentru ca tablourile Java contin in interior informatii relative la numarul de elemente. Acest numar de elemente se poate obtine prin accesarea variabilei length din interiorul tabloului ca in exemplul urmator care listeaza parametrii de pe linia de comanda la lansarea unei clase: public class Arguments A public static void main( String argsai ) A for( int i = 0; i < args.length; i++ ) A System.out.println( argsaii ); S S S Iata un exemplu de rulare a acestei aplicatii: >java Arguments unu doi trei unu doi trei > ^ 7.2 Apleturi Java Apleturile Java ruleaza intr-un document HTML. In acest document, fiecare aplet are rezervata o fereastra dreptunghiulara prin care comunica cu utilizatorul. Dreptunghiul de incadrare al ferestrei este definit intr-un tag HTML numit APPLET. Aceasta fereastra este in exclusivitate la dispozitia apletului care este responsabil de desenarea ei si de tratarea eventualelor evenimente care se refera la ea. Noul tag HTML este recunoscut deocamdata doar de anumite navigatoare WWW precum HotJava si Netscape 2.0. Este foarte probabil ca in viitor majoritatea navigatoarelor sa ofere compatibilitate Java. Impreuna cu definirea interfetei dintre apleturi si navigator, Sun a definit si o sintaxa specifica noului tag HTML care permite pozitionarea si dimensionarea ferestrei apletului in document precum si specificarea unor parametri care sa poata altera modul de lucru al apletului. Iata un prim exemplu de aplet: import java.awt.Graphics; public class HelloWorldApplet extends java.applet.Applet A public void init() A resize( 150,25 ); S public void paint( Graphics g ) A g.drawString( "Hello world!", 50, 25 ); S S In mod minimal, apletul nostru nu defineste decat doua metode si anume una de initializare, necesara pentru organizarea mediului in care ruleaza apletul si una de desenare a spatiului destinat apletului in interiorul documentului HTML. Metoda de initializare nu face in acest caz decat sa redimensioneze spatiul alocat in mod corespunzator necesitatilor sale in timp ce metoda de desenare afiseaza in acest spatiu un mesaj de salut. Pentru a vedea rezultatele rularii acestui aplet trebuie sa construim un document minimal HTML, care poate sa arate in felul urmator: <HTML> <HEAD> <TITLE> Hello World Applet </TITLE> </HEAD> <BODY> Iata iesirea programului: <APPLET CODE="HelloWorldApplet.class" WIDTH=150 HEIGHT=25> </APPLET> </BODY> </HTML> Spre deosebire de o aplicatie normala Java, apleturile nu pot primi parametri pe linia de comanda pentru ca nu exista linie de comanda. Din acest motiv, trebuie sa introducem parametrii apletului in fisierul HTML. De exemplu am putea introduce, imediat dupa linia de declaratie a apletului o linie de forma: Si sa modificam codul apletului dupa cum urmeaza: import java.awt.Graphics; public class HelloWorldApplet extends java.applet.Applet A private String sir; public void init() A sir=getParameter( "mesaj" ); if( sir == null ) A sir = "Hello, World!"; S resize( 150,25 ); S public void paint( Graphics g ) A g.drawString( sir, 50, 25 ); S S In acest mod putem sa controlam la lansare initializarea apletului. In definitia clasei Applet exista si doua functii care permit navigatorului regasirea unui minim de informatii despre aplet. Aceste informatii reprezinta descrierea apletului si a parametrilor acestuia. Functiile care trebuiesc definite in noua clasa derivata din Applet sunt getAppletInfo si getParameterInfo . De exemplu, putem introduce in clasa HelloWorldApplet doua noi functii: public String getAppletInfo() A return "Applet scris de Eugen Rotariu"; S public String aiai getParameterInfo() A String infoaiai = A A "Parametru", "String", "Textul de afisat" S S; return info; S Executia unui aplet este marcata de cateva evenimente importante generate de catre navigator. Atunci cand navigatorul intalneste o eticheta APPLET, porneste in primul rand incarcarea codului necesar rularii apletului. Pana cand acest cod nu a ajuns pe calculatorul client, apletul nu poate fi pornit. Dupa incarcarea codului, apletul este apelat pentru initializare. Acesta este momentul in care apletul isi pregateste parametrii si obtine de la sistem resursele necesare rularii. Dupa ce initializarea a fost terminata, navigatorul trimite catre aplet o comanda de pornire. Aceasta este comanda care pune efectiv apletul in functiune deschizand interactiunea cu utilizatorul. Un aplet ruleaza atata timp cat navigatorul este activ. La schimbarea paginii curente, apleturile din vechea pagina nu sunt distruse, dar primesc o comanda de oprire temporara (pe care de altfel pot sa o ignore). La reincarcarea paginii, o alta comanda de pornire este lansata spre aplet si acest ciclu se poate relua. In sfarsit, la oprirea navigatorului, apletul primeste o comanda de oprire definitiva, caz in care el trebuie sa elibereze toate resursele pe care le blocheaza. Orice aplet Java reprezinta, din punctul de vedere al limbajului un nou tip de obiect, derivat din obiectul standard Applet . Atunci cand navigatorul lanseaza un nou aplet el nu face altceva decat sa instantieze un nou obiect din aceasta clasa. Subrutinele care trateaza evenimentele descrise anterior trebuiesc definite ca metode in interiorul acestui nou tip de obiecte. In continuare, intre doua evenimente de pornire si respectiv de oprire temporara a apletului navigatorul transmite catre aplet evenimente specifice oricarei interfete grafice cum ar fi evenimentul care provoaca redesenarea spatiului destinat apletului, evenimente legate de apasarea unor taste sau a unor butoane ale mausului, etc. Ca raspuns la aceste evenimente, apletul trebuie sa reactioneze schimband continutul ferestrei, lansand mesaje sonore, etc. Iata si un exemplu de aplet care ne arata fazele prin care trece un aplet in timpul existentei sale: import java.applet.Applet; import java.awt.*; public class EventTutor extends Applet A public void init() A // metoda de initializare // este apelata la constructia noii instante de aplet System.out.println("init"); S public void paint(Graphics g) A // metoda de desenare // este apelata ori de cate ori este necesara // redesenarea ferestrei apletului System.out.println("paint"); S public void start() A // metoda de lansare in executie // este apelata la pornire //sau la reintoarcerea in pagina apletului System.out.println("start"); S public void stop() A // metoda de oprire temporara a executiei System.out.println( "stop" ); S public void destroy() A // metoda de oprire definitiva System.out.println("destroy"); S public void update(Graphics g) A // metoda de actualizare a ferestrei apletului // este apelata atunci cand nu este necesara redesenarea // intregii ferestre. In mod implicit, // metoda apeleaza metoda paint. System.out.println("update"); S public boolean mouseUp(Event e, int x, int y) A // S-a ridicat butonul mausului in fereastra apletului. System.out.println("mouseUp"); return false; S public boolean mouseDown(Event e, int x, int y) A // S-a apasat butonul mausului in fereastra apletului System.out.println("mouseDown"); return false; // S-a miscat mausul in fereastra apletului // cu butonul apasat System.out.println("mouseDrag"); return false; S public boolean mouseMove(Event e, int x, int y) A // S-a miscat mausul in fereastra apletului System.out.println("mouseMove"); return false; S public boolean mouseEnter(Event e, int x, int y) A // Mausul a patruns in fereastra apletului System.out.println("mouseEnter"); return false; S public boolean mouseExit(Event e, int x, int y) A // mausul a iesit din fereastra apletului System.out.println("mouseExit"); return false; S public void gotFocus() A // Fereastra apletului a devenit fereastra activa System.out.println("gotFocus"); S public void lostFocus() A // Fereastra apletului nu mai este fereastra activa System.out.println("lostFocus"); S public boolean keyDown(Event e, int x) A // S-a apasat o tasta si aceasta // este destinata apletului System.out.println("keyDown"); return true; S S Puteti rula apletul de mai sus pentru a vedea care este ordinea in care sunt apelate aceste metode de catre navigator. Apletul de mai sus produce iesiri la consola (o fereastra text) si nu in fereastra apletului. Daca nu vedeti consola, incercati sa cautati prin meniurile navigatorului optiunea de afisare a consolei Java. Netscape de exemplu are o astfel de optiune in meniul Options-Show Java console. Din cele spuse pana acum se poate deduce ca apleturile Java nu au o viata proprie, ele fiind doar apelate din cand in cand de navigator. Ceea ce nu este intocmai adevarat pentru ca biblioteca standard de clase Java ofera suport pentru aplicatii care folosesc mai multe fire de executie. Apleturile pot astfel crea fire de executie care sa lucreze independent fata de navigator. 7.3 Tagul APPLET Iata descrierea DTD tagului pe care Sun l-a definit pentru introducerea unui aplet intr-un document HTML. <!ELEMENT APPLET - - (PARAM*, (%text;)*)> <!ATTLIST APPLET CODEBASE CDATA #IMPLIED-- code base - CODE CDATA #REQUIRED-- code file - NAME CDATA #IMPLIED-- applet name - WIDTH NUMBER #REQUIRED HEIGHT NUMBER #REQUIRED ALIGN (left|right|top|texttop|middle|absmiddle| baseline|bottom|absbottom) baseline VSPACE NUMBER #IMPLIED HSPACE NUMBER #IMPLIED > <!ELEMENT PARAM - 0 EMPTY> <!ATTLIST PARAM NAME NAME #REQUIRED-- The name of the parameter - VALUE CDATA #IMPLIED-- The value of the parameter - > Atributele obligatorii ale acestei definitii sunt numele fisierului in care este memorat codul si dimensiunea spatiului rezervat apletului. Minimal, tag APPLET arata in felul urmator: <APPLET CODE="HelloWorldApplet.class" WIDTH=200 HEIGHT=150> Text care apare daca navigatorul nu stie Java </APPLET> Atributele optionale ale tagului descriu locatia de baza a codului apletului, modul de aliniere in pagina, spatierea si eventualii parametrii care pot fi transmisi apletului din interiorul documentului HTML. Daca codul clasei este in acelasi director cu documentul HTML este suficient sa fie specificat atributul CODE cu numele fisierului unde este acesta memorat. Daca este nevoie de un director diferit, trebuie completat si atributul CODEBASE in care se mentioneaza directorul. De exemplu, daca fisierele .class sunt intr-un subdirector numit /clase al directorului care contine documentul HTML, atunci exemplul de mai sus devine: <APPLET CODE="HelloWorldApplet.class" CODEBASE="clase" WIDTH=200 HEIGHT=150> Text care apare daca navigatorul nu stie Java </APPLET> Atributul ALIGN specifica modul in care fereastra destinata apletului va fi aliniata in pagina. Valorile sale posibile sunt: LEFT, RIGHT, TOP, TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM si ABSBOTTOM. Valoarea implicita este BASELINE. • LEFT, RIGHT - alinierea va fi in stanga, respectiv dreapta, textului din linie. • TOP - alinierea se va face cu elementul cel mai inalt din linie, fie el un alt aplet, o imagine sau textul insusi. • TEXTTOP - alinierea se face cu cea mai inalta pozitie ocupata de textul liniei. • ABSMIDDLE - mijlocul apletului va fi aliniat cu mijlocul elementului cel mai mare din linie. • MIDDLE - mijlocul apletului se va alinia cu mijlocul liniei de baza a textului. • BASELINE, BOTTOM - baza apletului se va alinia cu linia de baza a textului. • ABSBOTTOM - baza apletului va fi aliniata cu elementul cel mai de jos din linie. Atributele VSPACE si HSPACE specifica, in pixeli, spatiul care desparte apletul de textul care il inconjoara. Pentru a transmite parametrii unui aplet, puteti folosi tagul PARAM asa cum am aratat mai sus. |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|