Sunteți pe pagina 1din 21

smaranda.belciug@inf.ucv.

ro Laborator 5 Applets, HTML i GUI Diferena dintre applet-uri i aplicaii Diferena dintre applet-urile i aplicaiile Java const n modul cum sunt rulate. Aplicaiile sunt rulate prin intermediul unui interpretor Java, care ncarc fiierul clas principal al aplicaiei. Pe de alt parte, applet-urile sunt rulate de orice browsere care suport Java. Pentru a rula un applet, acesta trebuie nglobat ntr-o pagina Web folosind etichete HTML. Atunci cnd un utilizator cu un browser compatibil Java ncarc o pagin Web care conine un applet, browser-ul transfer codul applet-ului de pe serverul Web i l execut pe sistemul Web al utilizatorului. Nu este nevoie de un interpretor Java separat el este coninut n browser. Restriciile de securitate ale applet-urilor Deoarece applet-urile Java sunt executate pe sistemul Web local al unui utilizator, exist cteva restricii serioase, referitoare la activitile de care este capabil un applet. Dac aceste restricii nu ar exista, un programator Java ru intenionat ar putea scrie cu uurin un program care s tearg toate fiierele, s colecteze informaii private sau s realizeze alte bree n securitatea sistemului. Unui applet i sunt interzise urmtoarele activiti: S citeasc sau s scrie fiiere pe sistemul local al utilizatorului S comunice cu un alt sit Internet dect cel de unde provine pagina Web care conine applet-ul S ruleze programe executabile n sistemul local al utilizatorului S ncarce programe din sistemul utilizatorului, cum ar fi programe executabile sau biblioteci partajate Crearea applet-urilor Applet-urile nu posed o metod main(), care s fie apelat automat la lansarea programului. Toate applet-urile sunt subclase ale clasei Applet, care aparine pachetului java.applet. Clasa Applet prezint dou tipuri de comportament, care trebuie s fie comune tuturor applet-urilor: Capacitatea de a opera ca parte a browserului i de a trata evenimente, cum ar fi rencrcarea paginii n browser Capacitatea de a prezenta o interfa grafic pentru utilizator i de a prelua date de intrare de la utilizator Clasa Applet este clasa principal care declaneaz execuia unui applet. Subclasele create trebuie s aib urmtoarea form: public class appletNou extends java.applet.Applet {

smaranda.belciug@inf.ucv.ro //codul applet-ului } Principalele activitti ale applet-urilor n locul metodei main(), applet-urile posed metode care sunt apelate la apariia anumitor evenimente pe parcursul rulrii applet-ului. Iniializarea Iniializarea apare o dat cu ncrcarea applet-ului. Iniializarea const n crearea obiectelor de care are nevoie applet-ul, setarea stri iniiale, ncrcarea unor imagini sau fonturi sau setarea unor parametri. Pentru a defini codul de iniializare al unui applet trebuie suprascris metoda init(). public void init(){ //codul de iniializare } Pornirea Un applet este pornit dup iniializare. Pornirea poate aprea i dac applet-ul a fost anterior oprit. Pornirea poate aprea de mai multe ori pe parcursul ciclului de via al unui applet, ns iniializarea se ntmpl numai o dat. Pentru a defini codul de pornire al unui applet, trebuie suprascris metoda start(). public void start(){ //codul de pornire } Oprirea Oprirea apare atunci cnd utilizatorul prsete pagina care conine applet-ul curent sau atunci cnd applet-ul se oprete singur apelnd metoda stop(). n mod prestabilit, orice fire de execuie (threads) pe care care applet-ul le-a lansat i vor continua execuia i dup ce utilizatorul prsete pagina. Prin suprascrierea metodei stop(), putei suspenda execuia acestor fire i le putei reporni dac appletul este vizualizat din nou. public void stop(){ //codul de oprire } Distrugerea Metoda destroy() permite applet-ului s-i fac curenie dup el, chiar nainte de a se elibera memoria alocat sau de a se prsi browser-ul. De obicei nu se

smaranda.belciug@inf.ucv.ro suprascrie metoda destroy() dect dac exist anumite resurse care trebuie eliberate, cum ar fi fire de execuie create de applet. public void destroy(){ //codul de distrugere } Desenarea Desenarea este modul prin care applet-ul afieaz ceva pe ecran: text, linii, un fundal colorat sau o imagine. Desenarea poate aprea de sute de ori pe parcursul de ciclului de via al unui applet. Pentru a afia ceva, metoda paint() din subclasa Applet trebuie suprascris. public void paint(Graphics g){ //cod de desenare } Un applet simplu
import java.awt.Graphics; import java.awt.Font; import java.awt.Color; public class Palindrom extends java.applet.Applet { Font f = new Font("TimesRoman",Font.BOLD,36); public void paint(Graphics ecran){ ecran.setFont(f); ecran.setColor(Color.red); ecran.drawString("Go hang a salami, I'm a lasagna hog", 5, 40); } }

Acest applet suprascrie metoda paint(). Deoarece applet-ul afieaz doar cteva cuvinte, nu este nevoie de de nicio iniializare. Astfel, nu este nevoie de metodele start(), stop() sau init(). Inserarea unui applet ntr-o pagin Web Eticheta <APPLET> <html> <head> <title> Pagina cu palindrom </title> <body> <p> Palindrom meu favorit despre carne este:</p> <br> <APPLET CODE="Palindrom.class" WIDTH = 600 HEIGHT =100> E secret, daca browser-ul dvs nu stie JAVA!! </APPLET>

smaranda.belciug@inf.ucv.ro </body> </head> </html> Mai multe despre eticheta <APPLET> ALIGN ALIGN = LEFT aliniaz applet-ul la stnga textului care urmeaz n pagin dup applet ALIGN = RIGHT aliniaz applet-ul la dreapta textului care urmeaz n pagin dup applet ALIGN = TEXTTOP aliniaz partea superioar a applet-ului cu partea superioar a celui mai nalt text de pe linie ALIGN = TOP aliniaz applet-ul cu cel mai de sus element prezent pe linie (care poate fi un alt applet, o imagine sau partea superioar a unui text) ALIGN = ABSMIDDLE aliniaz mijlocul applet-ului cu mijlocul celui mai mare element de pe linie ALIGN = MIDDLE aliniaz mijlocul applet-ului cu mijlocul liniei de baz a textului ALIGN = BASELINE aliniaz partea inferioar a applet-ului cu linia de baz a textului ALIGN = BOTTOM = BASELINE ALIGN = ABSBOTTOM aliniaz partea inferioar a applet-ului cu cel mai de jos element de pe linie

HSPACE, VSPACE sunt folosite pentru a determina spaiul, n numr de pixeli ntre applet i textul nconjurtor. Transferul de parametri ctre applet-uri Parametrii unui applet sunt compui din dou pri: nume i valoare. De exemplu, putei indica ntr-un applet culoarea unui text folosind un parametru cu numele culoare si valoarea rosu. Putei determina viteza de rulare a unei animaii folosind un parametru cu numele vitez i valoare 5. n fiierul HTML care conine applet-ul, fiecare parametru este indicat folosind eticheta <PARAM>, care conine dou atribute NAME i VALUE> . Parametrii sunt transmii applet-ului la ncrcarea acestuia. n metoda init() a appletului dvs putei obine aceti parametri folosind metoda getParameter(). Metoda getParameter() returneaz iruri; dac dorii ca parametrul s fie alt tip de obiect sau de dat trebuie s-l convertii.

smaranda.belciug@inf.ucv.ro Introducerea de imagini, animaie i sunet Crearea animaiilor n Java Controlul animaiei prin fire de execuie Firele de execuie (threads) sunt ideale pentru animaie; acestea reprezint mijlocul prin care Java trateaz n paralel mai multe activiti. Definiie 1. Un fir de execuie (thread) reprezint o parte a unui program care este configurat s ruleze n timp ce n restul programului se execut altceva. Aceast tehnic se mai numete i multitasking, deoarece programul se poate ocupa simultan de mai multe sarcini. Scrierea de applet-uri cu fire de execuie Pentru a folosi un fir de execuie ntr-un applet, n fiierul su clas trebuie aduse cinci modificri: Se schimb declararea clasei prin adugarea textului implements Runnable Se creeaz un obiect Thread n care se pstreaz firul de execuie Se suprascrie metoda start() pentru a crea i lansa thread-ul Se suprascrie metoda stop() pentru a seta firul aflat n execuie la valoarea null Se creeaz o metod run() care conine instruciunile ce fac applet-ul s ruleze continuu public class PapusaDansatoare extends java.awt.Applet implements Runnable(){ // } Runnable este un tip special de clas, numit Interfa. O interfa reprezint modalitatea prin care o clas poate s moteneasc metode pe care altfel nu le-ar fi motenit de la superclasele sale. Runnable() conine o definiie a metodei run(), care este apelat pentru a porni un fir de execuie. Thread executabil; Acest obiect poate fi creat n metoda start() a applet-ului. Variabila executabil are valoarea null pn cnd obiectul va fi creat. public void start(){ if (executabil == null){ executabil = new Thread(this); executabil.start(); } }

smaranda.belciug@inf.ucv.ro

Metoda run() reprezint inima applet-ului devenit fir de execuie. Aceasta trebuie folosit pentru controlul secvenelor animate, prin stabilirea tuturor operaiilor legate de desenare i de modificrile ntre cadre. Dup ce n metoda run() a fost definit comportamentul necesar firului de execuie, ultimul pas const n definirea metodei stop(), care folosete la oprirea applet-ului. Modalitatea de a opri un fir de execuie const n atribuirea valorii null obiectului respectiv. Crearea de animaie folosind imagini
import java.awt.Graphics; import java.awt.Image; import java.awt.Color; public class Neko extends java.applet.Applet implements Runnable{ Image imgNeko[] = new Image[9]; Image imgCrt; Thread executabil; int x; int y = 50; public void init(){ String nekoSrc[] = {"right1.gif","right2.gif","stop.gif","yawn.gif","scratch1.gif","scra tch2.gif","sleep1.gif","sleep2.gif", "awake.gif"}; for (int i = 0; i < imgNeko.length; i++){ imgNeko[i] = getImage(getCodeBase(), "./" + nekoSrc[i]); }//end for i }//end init public void start(){ if (executabil == null){ executabil = new Thread(this); executabil.start(); }//end if }//end start public void stop(){ executabil = null; }//end stop public void run(){ setBackground(Color.white); //alearga de la stanga ecranului pana la mijloc nekoRun(0, size().width/2); //se opreste si face pauza imgCrt = imgNeko[2]; repaint(); pause(1000); //casca imgCrt = imgNeko[3]; repaint(); pause(1000);

smaranda.belciug@inf.ucv.ro
//se scarpina de patru ori nekoScratch(4); //doarme cinci reprize nekoSleep(5); //se trezeste si alearga mai departe imgCrt = imgNeko[8]; repaint(); pause(500); nekoRun(x,size().width +10); }//end run void nekoRun(int inceput, int sfarsit){ for (int i = inceput; i < sfarsit; i += 10){ x = i; //schimba imaginile if (imgCrt == imgNeko[0]) imgCrt = imgNeko[1]; else imgCrt = imgNeko[0]; repaint(); pause(150); }//end for i }//end nekoRun void nekoScratch(int deCateOri){ for (int i = deCateOri; i > 0; i--){ imgCrt = imgNeko[4]; repaint(); pause(150); imgCrt = imgNeko[5]; repaint(); pause(150); }//end for i }//end nekoScratch void nekoSleep(int deCateori){ for (int i = deCateori; i > 0; i--){ imgCrt = imgNeko[6]; repaint(); pause(250); imgCrt = imgNeko[7]; repaint(); pause(250); }//end for i }//end nekoSleep void pause(int timp){ try { Thread.sleep(timp); }catch (InterruptedException e){ } }//end pause public void paint(Graphics ecran){ if (imgCrt != null) ecran.drawImage(imgCrt, x, y, this); }//end paint }//end class

Incarcarea i folosirea sunetelor


import java.awt.Graphics; import java.applet.AudioClip;

smaranda.belciug@inf.ucv.ro

public class CicluAudio extends java.applet.Applet implements Runnable{ AudioClip sunetFundal; AudioClip bip; Thread executabil; public void start(){ if (executabil == null){ executabil = new Thread(this); executabil.start(); } } public void stop(){ if (executabil != null){ if (sunetFundal != null) sunetFundal.stop(); executabil = null; } } public void init(){ sunetFundal = getAudioClip(getCodeBase(),"loop.au"); bip = getAudioClip(getCodeBase(),"beep.au"); } public void run(){ if (sunetFundal != null) sunetFundal.loop(); Thread firExecutie = Thread.currentThread(); while (executabil == firExecutie) try{ Thread.sleep(5000); }catch (InterruptedException e){} if (bip != null) bip.play(); } public void paint(Graphics ecran){ ecran.drawString("Redau sunete ...", 10, 10); } }

JApplet i Swing-ul Clasele care formeaz biblioteca Swing se gsesc n pachetul javax.swing. Swing include i clasa javax.swing.JApplet ca baz pentru scrierea applet-urilor. JApplet este de fapt o subclas a lui Applet, deci JApplet este de fapt un Applet. Totui, JAppleturile au o extra structur pe care Applet-urile nu o au. Desenarea n JApplet este mult mai complex. Deci, dac crem o subclas a lui JApplet, nu trebuie s scriem o metod paint() pentru ea. Pentru a desena ntr-un JApplet, trebuie s adugm o component n acel applet pentru acest scop. Totui, este posibil i necesar s se scrie o metod init() pentru o subclas a lui JApplet. Urmtorul exemplu este un simplu JApplet care folosete Swing. Acest applet demonstreaz ideea de baz a programrii GUI.

smaranda.belciug@inf.ucv.ro Programele GUI folosesc componente precum butoanele pentru a putea interaciona cu utilizatorul. Applet-ul urmtor conine un buton. Dac se apas butonul, o fereastr se va deschide cu un mesaj i cu un buton OK. Se apas butonul OK pentru a nchide fereastra. Butonul din acest applet este un obiect care aparine clasei JButton (javax.swing.JButton). Cnd un applet este creat, butonul trebuie creat i adugat applet-ului. Aceast parte a procesului de iniializare se face n metoda init().
JButton bttn = new JButton("Click Me!");

Butonul nu o s apar automat pe ecran. Trebuie adugat astfel:


getContentPane().add(bttn);

Cnd utilizatorul apas butonul genereaz un eveniment. Applet-ul poate fi programat s rspund la aceste eveniment. Tipul de eveniment generat de un buton este numit ActionEvent. Pentru ca applet-ul s rspund la acest tip de eveniment, trebuie definit o metod:
public void actionPerformed(ActionEvent evt) { . . . }

Mai mult, butonul trebuie anunat ca applet-ul va asculta dup orice fel de eveniment creat de buton. Acest lucru se face folosind metoda addActionListener(), n metoda init() a applet-ului.
import javax.swing.*; // clasele Swing GUI sunt definite aici import java.awt.event.*; // clasa care trateaza evenimentele public class HelloSwing extends JApplet implements ActionListener { public void init() { //Aceasta metoda este apelata de catre sistem inainte //ca applet-ul sa apara. Este folosita aici pentru a crea //un buton si pentru a-l adauga in "content pane-ul" //JApplet-ului //Applet-ul este inregistrat ca fiind un ActionListener pentru buton JButton bttn = new JButton("Click Me!"); bttn.addActionListener(this); getContentPane().add(bttn); } // end init() public void actionPerformed(ActionEvent evt) { /*Aceasta metoda este apelata cand un eveniment se produce Cand metoda este apelata, stim ca butonul a fost apasat. Raspunsul este dat prin aparitia unei ferestre. Fereastra are un buton "OK", care trebuie apasat pentru a inchide fereastra */ String title = "Salutari"; // titlul ferestrei String message = "Saluri din biblioteca GUI a Swing-ului!";

smaranda.belciug@inf.ucv.ro
JOptionPane.showMessageDialog(null, message, title, JOptionPane.INFORMATION_MESSAGE); } // end actionPerformed() } // end class HelloSwing

n codul surs, am setat applet-ul s urmreasc evenimentele produse de buton. Unele persoane nu consider acest lucru ca fiind corect. Ele prefer s creeze separa un obiect care s rspund la evenimente, astfel fiind mai orientat obiect.
import javax.swing.*; import java.awt.event.*; public class HelloSwing2 extends JApplet { public void init() { JButton bttn = new JButton("Click Me!"); bttn.addActionListener( new ActionListener() { /*"action listener-ul" pentru buton este definit * de o clasa interioara anonima * */ public void actionPerformed(ActionEvent evt) { String title = "Salutari"; String message = "Alt salut de la Swing!"; JOptionPane.showMessageDialog(null, message, title, JOptionPane.INFORMATION_MESSAGE); } // end actionPerformed() }); getContentPane().add(bttn); } // end init() } // end class HelloSwing2

smaranda.belciug@inf.ucv.ro Grafic i Desen Tot ce se vede pe ecranul unui computer a fost desenat, chiar i textul. API-ul Java include o serie de clase i metode care sunt dedicate desenatului. Un applet este un exemplu de component GUI. Termenul de component se refer la un element visual ntr-un GUI, care include butoane, meniuri, blocuri de text, bare de derulare (scroll bars), csue de alegeri (check boxes) etc. n Java, componentele GUI sunt reprezentate de obiecte care aparin subclaselor clasei java.awt.Component. Majoritatea componentelor din Swing GUI aparin subclaselor clasei javax.swing.JComponent. Cum am vzut mai sus, n momentul n care dorim s desenm ntr-un applet care nu este Swing, aceast aciune are loc n metoda paint(). Cnd folosim JApplets lucrurile se complic. Nu se poate desena direct n JApplet-uri. Trebuie s se creeze o component separat care va fi folosit ca suprafa de desenat, iar aceast component trebuie adugat n JApplet. O clas care reprezint suprafaa de desenare trebuie creat, deci, n programarea unui JApplet ntotdeauna vor fi realizate cel puin dou clase: o clas pentru applet i o clas pentru suprafaa de desen. De obicei, clasa pentru suprafaa de desen va fi o subclas a clasei javax.swing.Jpanel, care iniial reprezint o bucata goal de ecran. Un Jpanel, ca orice alt Jcomponent, i deseneaz coninutul cu metoda:
public void paintComponent(Graphics g)

Pentru a crea o suprafa de desenare trebuie definit o subclas a clasei Jpanel i scris metoda paintComponent(). De fiecare dat cnd o component trebuie desenat pe ecran, sistemul va apela paintComponent() pentru a realiza desenul. Metoda paintComponent() are un parametru de tip Graphics. Obiectul Graphics va fi folosit de sistem n momentul apelrii metodei. Este nevoie de obiectul Graphics pentru desenarea efectiv. Pentru desenarea n Java este nevoie de un context grafic (obiect al clasei java.awt.Graphics). Clasa Graphics este o clas abstract, ceea ce nseamn ca este imposibil s creezi un context grafic direct, cu un constructor. Exist dou metode de a crea acest context grafic. n primul rnd, cnd metoda paintComponent() este apelat de sistem, parametrul acelei metode este un context grafic pentru desenarea acelei componente. n al doilea rnd, fiecare component are o metod getGraphics(). n mod oficial nu trebuie folosit. Majoritatea componentelor se deseneaz n metoda paintComponent(). Dar ce se ntmpl, dac dorim n mijlocul unei alte metode s schimbm desenul? NU TREBUIE s apelm metoda paintComponent() n mod direct; aceast metod este apelat doar de sistem. Tot ce trebuie s facem este s informm sistemul c acea component trebuie redesenat i s-l lsm pe el s apeleze metoda paintComponent(). Acest lucru se realizeaz prin apelarea metodei repaint().
public void repaint();

smaranda.belciug@inf.ucv.ro Pentru a merge bine, metoda paintComponent() trebuie s fie suficient de deteapt s redeseneze componentele n orice moment. Pentru acest lucru, programul trebuie s stocheze date despre starea componentei i a variabilelor de instan. Aceste variabile trebuie s conin informaii necesare redesenrii componentei complet. Cnd programul vrea s schimbe coninutul componentei, nu trebuie s deseneze doar noua component, trebuie s schimbe valorile variabilelor relevante i s apeleze repaint(). Cnd sistemul apeleaz paintComponent(), aceast metod va folosi noile valori ale variabilelor i va desena componenta cu modificrile dorite. Coordonate n momentul scrierii unui applet, nu este cunoscut dimensiunea acestuia. Dimensiunea este precizat n eticheta <APPLET>. Nu este bine s se depind de mrimea applet-ului setat la o anumit valoare. Deci, este bine s verificm dimensiunea fiecrei componente nainte de a desena n ea. Folosim metoda getSize(). Metoda returneaz un obiect ce aparine clasei java.awt.Dimension. Obiectul are dou variabile de instan: width i height.
public void paintComponent(Graphics g) { int width = getSize().width; int height = getSize().height; }

Evident, comenzile de desenare trebuie s ia n considerare dimensiunea. Adic, ele vor folosi coordonatele (x,y) care sunt calculate depinznd de nlimea i limea applet-ului. Culori RGB red, green, blue
myColor = new Color(r,g,b); Color.white, Color.black, Color.red, Color.green, Color.blue etc.

HSB hue, saturation, brightness


myColor = Color.getHSBColor(h,s,b);

Fiecare component are o culoare de foreground i o culoare de background. Font Font-ul reprezint mrimea i stilul textului.
Font plainFont = new Font("Serif", Font.PLAIN, 12); Font bigBoldFont = new Font("SansSerif", Font.BOLD, 24);

Forme

smaranda.belciug@inf.ucv.ro

drawString(String str, int x, int y) drawString(String str, int x, int y) drawOval(int x, int y, int width, int height) draw3DRect(int x, int y, int width, int height, boolean raised) drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) fillRect(int x, int y, int width, int height) fillOval(int x, int y, int width, int height) fillRoundRect(int x, int y, int width, int height, int xdiam, int ydiam) fill3DRect(int x, int y, int width, int height, boolean raised) fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)

Suprafaa de desenare n urmtoarele exemplu este un JPanel. Vom defini aceast clas ca fiind o clas interioar, clasei Applet. Desenarea este realizat n metoda paintComponent(). Applet-ul urmtor conine mai multe copii ale unui mesaj pe un background negru. Fiecare copie este o culoare aleatoare. Sunt folosite 5 font-uri diferite, cu dimensiuni si stiluri tot diferite. Mesajul este: Java este cool!.
import import import import java.awt.Color; java.awt.Font; java.awt.Graphics; javax.swing.JPanel;

/** * Acest panel afiseaza 25 copii ale unui mesaj. Culoare si pozitia * fiecarui mesaj este selectat aleator. Fontul fiecarui mesaj este * selectat tot aleator din 5 fonturi posibile. Acest mesaj va fi * afisat pe un fundal negru. * <p> Nota: Acest panel va fi folosit ca un content pane intr-un applet * sau un frame * */ public class RandomStringsPanel extends JPanel { private String message; /* * Mesajul care va fi afisat. * */

private Font font1, font2, font3, font4, font5;

public RandomStringsPanel() { this(null); // Apeleaza celalalt constructor // cu parametrul null } /** * Constructorul creeaza un panel care afiseaza 25 de copii ale

smaranda.belciug@inf.ucv.ro
* mesajului specificat. * @param messageString - mesajul care trebuie afisat * Daca este null atunci mesajul default "Java este cool!" este afisat. */ public RandomStringsPanel(String messageString) { message = messageString; if (message == null) message = "Java este cool!"; font1 font2 font3 font4 font5 = = = = = new new new new new Font("Serif", Font.BOLD, 14); Font("SansSerif", Font.BOLD + Font.ITALIC, 24); Font("Monospaced", Font.PLAIN, 30); Font("Dialog", Font.PLAIN, 36); Font("Serif", Font.ITALIC, 48);

setBackground(Color.BLACK); } /** *Metoda paintComponent este responsabila cu desenatul continutului panelului. */ public void paintComponent(Graphics g) { super.paintComponent(g); //apeleaza metoda paintComponent din superclasa JPanel. //Acest lucru coloreaza background-ul cu negru int width = getWidth(); int height = getHeight(); for (int i = 0; i < 25; i++) {

int fontNum = (int)(5*Math.random()) + 1; switch (fontNum) { case 1: g.setFont(font1); break; case 2: g.setFont(font2); break; case 3: g.setFont(font3); break; case 4: g.setFont(font4); break; case 5: g.setFont(font5); break; } // end switch // seteaza culoarea float hue = (float)Math.random(); g.setColor( Color.getHSBColor(hue, 1.0F, 1.0F) );

smaranda.belciug@inf.ucv.ro

// selecteaza pozitia string-ului int x,y; x = -50 + (int)(Math.random()*(width+40)); y = (int)(Math.random()*(height+20)); // deseneaza mesajul g.drawString(message,x,y); } // end for } // end paintComponent()

// end class RandomStringsPanel

Clasa definete un panel, care nu poate s ruleze singur. Pentru a fi vazut pe ecran trebuie s fie folosit ntr-un applet sau un frame.
import javax.swing.JApplet; public class RandomStringsApplet extends JApplet { public void init() { String message = getParameter("message"); RandomStringsPanel content = new RandomStringsPanel(message); setContentPane(content); }//end init }//end RandomStringsApplet class

Mouse Events Un program GUI nu are o rutin main() care s ruleze pas cu pas de la nceput pn la sfritul programului. n schimb, programul trebuie s fie pregtit s rspund la tot

smaranda.belciug@inf.ucv.ro felul de evenimente care pot s se ntmple, la momente neprevzute. Evenimentele acestea sunt generate de mouse i tastatur. n Java, evenimentele sunt reprezentate prin obiecte. n momentul apariiei unui eveniment, sistemul strnge toate informaiile relevante pentru evenimentul respectiv i construiete un obiect care conine acele informaii. Tipuri diferite de evenimente sunt reprezentate de obiecte care aparin unor clase diferite. De exemplu, n momentul n care un utilizator apas un buton al mouse-ului, un obiect de tip MouseEvent este construit. Obiectul conine informaii precum surs evenimentului (componenta pe care utilizatorul a fcut clic), coordonatele (x,y) ale punctului din componenta unde s-a fcut clic, i care dintre butoanele mouse-ului a fost apsat. Cnd utilizatorul apas o tast din tastatur, un eveniment KeyEvent este creat. Dup ce obiectul eveniment a fost construit, este trimis ca parametru ctre o subrutin anumit. Scriind subrutina respectiv, programatorul spune ce ar trebui s se ntmple n momentul apariiei evenimentului. Tratarea evenimentelor Pentru ca un eveniment s aib efect, un program trebuie s detecteze acel eveniment i s reacioneze la el. Pentru ca un eveniment s fie detectat, un program trebuie s asculte dup acel eveniment. Aceast ascultare este realizat de un obiect numit event listener.
public void mousePressed(MouseEvent evt) { . . . }

Corpul metodei definete modul n care obiectul rspunde n momentul n care a fost anunat c un buton de mouse a fost apsat. Parametrul, evt, conine informaii despre eveniment. Metodele care sunt necesare ntr-un eveniment de tip mouse listener sunt specificate ntr-o interfa numit MouseListener. (Recapitulare: o interfa n Java este o list de metode. O clas poate implementa o interfa n dou moduri: class MyListener implements MouseListener sau class RandomStrings extends JApplet implements MouseListener. In al doilea rnd, clasa trebuie s includ o definiie pentru fiecare metod instaniat specificat n interfa. O interfa poate fi folosit ca tipul unei varibile. Metodele trebuie implementate!) Multe evenimente n Java sunt asociate cu componente GUI. nainte ca un obiect s aud evenimente asociate cu o anumit component, acel obiect trebuie s fie legat de acea component. Dac un obiect de tip MouseListener, mListener trebuie s asculte evenimente de mouse asociate cu un obiect Component, comp, trebuie apelat urmtoarea metod: comp.addMouseListener(mListener);. Toate clasele eveniment sunt definite n pachetul java.awt.event. Tehnic, pentru a trata evenimente trebuie: 1. S scriem specificaia import java.awt.event.*; la nceputul codului surs;

smaranda.belciug@inf.ucv.ro 2. S declarm faptul c o anumit clas implementeaz interfaa potriv (ex. MouseListener); 3. S definim subrutinele din interfa; 4. S facem legtura dintre obiectul care ascult i componenta care va genera evenimente, apelnd metoda addMouseListener() pentru acea componenta. Orice obiect poate s fie un event listener, dac implementeaz interfaa potrivit. O component poate ascult evenimente pe care le genereaz singur. Un panel poate ascult dup evenimente produse de componentele care sunt coninute n acel panel. O clas special poate fi creat pentru acest scop de a defini un obiect care ascult. Interfaa MouseListener are cinci metode diferite:
public public public public public void void void void void mousePressed(MouseEvent evt); mouseReleased(MouseEvent evt); mouseClicked(MouseEvent evt); mouseEntered(MouseEvent evt); mouseExited(MouseEvent evt);

Toate cele cinci metode trebuie definite. n cazul n care nu este necesar una dintre metode, nu se scrie nicio intruciune n interiorul corpului ei. mouseClicked utilizatorul apas butonul mouse-ului dup care i d drumul repede, fr a mica mouse-ul (se apeleaz n ordinea urmtoare metodele: mousePressed, mouseReleased, mouseClicked). mouseEntered, mouseExited se folosesc dac se dorete schimbarea imaginii unei componente. Exemplu.
import java.awt.Component; import java.awt.event.*; /** * Un obiect de tipul RepaintOnClick este un MouseListener * care va raspunde la un eveniment de tip mousePressed, prin apelarea * metodei repaint(). Deci, un obiect RepaintOnClick poate fi adaugat * ca un mouse listener la orice Componenta; cand utilizatorul * face click cu mouse-ul pe componenta, aceasta componenta va fi * desenata din nou. * */ public class RepaintOnClick implements MouseListener { public void mousePressed(MouseEvent evt) { Component source = (Component)evt.getSource(); source.repaint(); // apeleaza metoda repaint() pentru Componenta pe care //s-a facut click

smaranda.belciug@inf.ucv.ro
} public public public public } void void void void mouseClicked(MouseEvent evt) { } mouseReleased(MouseEvent evt) { } mouseEntered(MouseEvent evt) { } mouseExited(MouseEvent evt) { }

Mai trebuie fcut un singur lucru: adaugat un obiect event-handling ca i listener componentei care va genera evenimentele. n acest exemplu, evenimentele de mouse sunt generate de un obiect de tip RandomStringsPanel.
RepaintOnClick listener = new RepaintOnClick(); // Se creeaz un obiect MouseListener panel.addMouseListener(listener); // Se face legatura cu panel-ul

Dup cte se vede nu exista o legtur ntre cele dou clase. De fapt prima clas, RandomStringsPanel a fost creat cu mult timp inainte de RepaintOnClick. Fiecare obiect poate fi dezvoltat independent, fr a avea cunotine de operaiile interne ale celuilalt obiect. Aceasta este esena design-ului modular: construirea unui sistem complex de module care interacioneaz ntr-un mod foarte uor de neles. Fiecare modul reprezint o problema de design care poate fi rezolvat independent de celelalte. Programul ClickableRandomStrings are clasa RepaintOnClick ca i clasa interioara (nested), cu toate c putea fi considerat ca i clas separat. Ideea de baz este c acest program folosete aceeai clasa RandomStringPanel de la nceput. Tratarea evenimentelor produse de mouse se face fr modificri ale clasei respective.
import import import import java.awt.Component; java.awt.event.MouseEvent; java.awt.event.MouseListener; javax.swing.JFrame;

/** * Afiseaza o fereastra care arata 25 de copii ale string-ului "Java * este cool!" in culori aleatoare, font-uri si pozitii. Continutul * ferestrei este reprezentat de un obiect de tip RandomStringsPanel. * Cand utilizatorul face un click pe fereastra, continutul acesteia * va fi redesenat, cu ale string-uri asezate in alta pozitie, culoare, * font. */ public class ClickableRandomStringsApp { public static void main(String[] args) { JFrame window = new JFrame("Random Strings"); RandomStringsPanel content = new RandomStringsPanel(); content.addMouseListener( new RepaintOnClick() ); //inregistreaza un mouse listener window.setContentPane(content); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setLocation(100,75);

smaranda.belciug@inf.ucv.ro
window.setSize(300,240); window.setVisible(true); } private static class RepaintOnClick implements MouseListener { public void mousePressed(MouseEvent evt) { Component source = (Component)evt.getSource(); source.repaint(); } public public public public } } void void void void mouseClicked(MouseEvent evt) { } mouseReleased(MouseEvent evt) { } mouseEntered(MouseEvent evt) { } mouseExited(MouseEvent evt) { }

Aplicaia poate fi transformata n applet, astfel:


import java.awt.Component; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JApplet; public class ClickableRandomStringsApplet extends JApplet { public void init() { String message = getParameter("message"); RandomStringsPanel content = new RandomStringsPanel(message); content.addMouseListener( new RepaintOnClick() ); setContentPane(content); } private static class RepaintOnClick implements MouseListener { public void mousePressed(MouseEvent evt) { Component source = (Component)evt.getSource(); source.repaint(); } public public public public } } void void void void mouseClicked(MouseEvent evt) { } mouseReleased(MouseEvent evt) { } mouseEntered(MouseEvent evt) { } mouseExited(MouseEvent evt) { }

Coordonatele mouse-ului In momentul n care un eveniment are loc, dorim s cunoatem poziia cursorului mouse-ului. Dac evt este parametrul, atunci putem afla coordonatele mouse-ului apelng evt.getX() i evt.getY().

smaranda.belciug@inf.ucv.ro Utilizatorul poate s apese anumite modifier keys (taste) n momentul folosirii mouse-ului. Acestea sunt: Shift, Control, ALT (Option pentru Macintosh). Pentru acestea avem urmatoarele metode: evt.isShiftDown(), evt.isControlDown(), evt.isAltDown(). Exemplu. Avem un JPanel care acioneaz astfel: n momentul n care butonul stng al mouseului este apsat pe ecran apare un dreptunghi rosu; n momentul n care butonul drept este apasat se deseneaz un oval albastru. Dac apsm Shift n timp ce facem click cu mouse-ul se sterge panelul. Exist mai multe moduri n care poate fi scris acest exemplu. Se poate scrie o clas separat pentru tratarea evenimentelor de mouse, sau se poate lsa panelul s raspund la evenimentele mouse-ului. Clasa panelului va fi un mouse listener, deci toate obiectele din clas vor fi mouse listeneri.
import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * O demonstratie mica a tratarii evenimentelor produse cu mouse-ul * Figurile sunt desenate pe un background negru in momentul in care * utilizatorul face click pe panel. */ public class SimpleStamperPanel extends JPanel implements MouseListener { /** * Acest constructor seteaza culoarea background-ului ca fiind negru * si seteaza ca panel-ul sa asculte dupa evenimente produse de mouse * chiar pe el. */ public SimpleStamperPanel() { setBackground(Color.BLACK); addMouseListener(this); }

/** * Atat timp cat acest panel a fost setat sa asculte dupa evenimente * produse de mouse chiar pe el, aceasta metoda o sa fie apela cand * utilizatorul va face click pe panel. */ public void mousePressed(MouseEvent evt) { if ( evt.isShiftDown() ) { //utilizatorul tine apasat tasta Shift. Se redeseneaza panelul. //atat timp cat clasa nu defineste o metoda paintComponent(), este apelata

smaranda.belciug@inf.ucv.ro
//metoda din superclasa JPanel. Metoda din superclasa va desena panelul negru repaint(); return; } int x = evt.getX(); int y = evt.getY(); // coordonata x cand a apasat utilizatorul // coordonata y cand a apasat utilizatorul

Graphics g = getGraphics(); // se foloseste pentru desenarea directa if ( evt.isMetaDown() ) { //utilizatorul a facut click cu butonul drept in coordonatele //(x,y). Se deseneaza un oval albastru cu centrul in punctul (x,y). //Marginea ovalului este setata neagra, pentru a se vedea in cazul //suprapunerii obiectelor g.setColor(Color.BLUE); // g.fillOval( x - 30, y - 15, g.setColor(Color.BLACK); // g.drawOval( x - 30, y - 15, } else { // utilizatorul a apasa pe butonul stang // se deseneaza un dreptunghi centrat in (x,y). g.setColor(Color.RED); // interior rosu g.fillRect( x - 30, y - 15, 60, 30 ); g.setColor(Color.BLACK); // margine neagra. g.drawRect( x - 30, y - 15, 60, 30 ); } g.dispose(); //nu mai folosim grafica, deci renuntam la ea } // end mousePressed(); interior albastru. 60, 30 ); margine neagra. 60, 30 );

public public public public

void void void void

mouseEntered(MouseEvent evt) { } mouseExited(MouseEvent evt) { } mouseClicked(MouseEvent evt) { } mouseReleased(MouseEvent evt) { }

} // end class SimpleStamperPanel import javax.swing.JApplet;

public class SimpleStamperApplet extends JApplet { public void init() { SimpleStamperPanel content = new SimpleStamperPanel(); setContentPane(content); } }

S-ar putea să vă placă și