Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Curs Java aplicatii

java



+ Font mai mare | - Font mai mic



Curs Java aplicatii




Exemple simple de aplicatii cu interfata grafica
In cele ce urmeaza vom da exemple de aplicatii cu interfata grafica foarte simpla, desinate sa ilustreze utilizarea componentelor grafice si a programarii orientate pe evenimente. Desi sunt, la prima vedere, primitive, aceste exemple prezinta avantajul ca pot constitui 'prototipuri' ale unor aplicatii utile. In capitolele urmatoare, pornind de la aceste 'prototipuri' vom ilustra folosirea divesrelor tehnici de realizare a interfetelor grafice.
Exemplul 1: aplicatie cu fereastra principala vida

Orice aplicatie cu interfata grafica are ca fereastra principala un cadru derivat lib.csdin clasa Frame. In fisierul UnCadru.java este un exemplu de astfel de aplicatie, a carei fereastra principala este un cadru vid. Ea poate constitui un 'prototip' al oricarei aplicatii care foloseste pentru interfata grafica pachetul java.awt.
Intrucat se foloses clase din pachetele java.awt si java.awt.event, primele instructiuni din fisier sunt cele prin care se importa aceste pachete.
Fereastra principala a aplicatiei este declarata sub forma de clasa imbricata statica astfel:

static class FereastraPrincipala extends Frame
}

Sub aceasta forma, clasa contine numai un constructor, in care:
- se apeleaza constructorul superclasei Frame, transmitandu-i-se ca argument titlul ferestrei;
- se stabilesc dimensiunile ferestrei (baza, inaltime);
- se da comanda show() de afisare pe ecran a ferestrei (in mod implicit un Frame nu este vizibil).

Intrucat nu s-a introdus in cadru nici o componenta, acesta este vid. Totusi, cadrul (Frame) contine prin definitie:
- un chenar;
- o bara de titlu, la partea superioara, in care este scris titlul primit ca argument al constructorului;
- in coltul din stanga sus are un buton, la a carui actionare cu mouse-ul declanseaza deschiderea unui menu cu urmatoarele optiuni: Maximize, Iconify, Move, Resize,Close. Alegerea uneia din aceste optiuni are ca urmare, respectiv, efectuarea operatiei de maximizare a ferestrei (extinderea ei pe intregul ecran), iconificare a ferestrei (transformarea ei intr-o imagine de dimensiuni mici), mutarea sau redimensionarea ferestrei (prin tragerea cu mouse-ul a barei de titlu sau a coltului dreapta-jos). In coltul din dreapta sus exista, de asemenea, trei butoane, corespunzatoare (in ordine) optiunilor Iconify, Maximize si Close. Singura optiune care nu are efect este Close. Daca se selecteaza aceasta optiune (fie din meniul din coltul din stanga sus, fie apasand butonul marcat cu X din coltul din dreapta sus), cadrul genereaza un eveniment, care este interceptat de catre metoda windowClosing() a obiectului care prezinta interfata WindowListener si care a fost inregistrat ca 'ascultator' la fereastra noastra. S-a adoptat aceasta solutie intrucit, de regula, inainte de a se inchide fereastra aplicatiei este necesar sa se faca unele operatii de eliberare a resurselor (inchidere de fisiere, inchiderea legaturilor de retea) care sunt specifice fiecarei aplicatii si trebuie programate.

Intrucat un Frame este derivat din clasa Window, evenimentele generate de acesta pot fi interceptate de un obiect apartinand unei clase care implementeaza interfata WindowListener. Prototipul unei astfel de clase este WindowAdapter. Pentru ca la selectarea optiunii Close a ferestrei principale sa se incheie executarea aplicatiei, se redefineste metoda windowClosing() a acestui adaptor. In acest scop, s-a declarat o noua clasa imbricata, care a fost numita de noi IEFP (Interceptarea Evenimentelor Ferestrei Principale):

static class IEFP extends WindowAdapter
}

Metoda main() a aplicatiei este:

public static void main(String args[])

Asadar, s-au construit un obiect din clasa FereastraPrincipala cu titlul 'Un cadru vid' si un obiect din clasa IEFP, dupa care la primul din ele a fost 'inregistrat' cel de al doilea in calitate de 'ascultator' al evenimentelor generate de fereastra. In consecinta, orice eveniment generat de obiectul cu referinta fp este interceptat de obiectul cu refetinta t. In particular, daca se selecteaza in fereastra optiunea Close, se executa metoda windowClosing() a interceptorului. Aceasta contine invocarea System.exit(0), deci are loc incheierea normala a executarii aplicatiei.

La punerea in executie a acestei aplicatii, constatam ca pe ecran apare un cadru cu titlul 'Un cadru vid'. Putem acum sa selectionam cu mouse-ul diferite optiuni, provocand maximizarea, revenirea la dimensiunile initiale, iconificarea, deiconificarea, mutarea sau modificarea dimensiunilorcadrului. In cele din urma putem selecta optiunea Close (din menu sau apasand pe butonul corespunzator) si vom constata ca fereastra dispare de pe ecran si se incheie executarea aplicatiei.

Exemplul 2: aplicatie cu o interfata grafica formata din trei cadre autonome

In fisierul TreiCadre.java este prezentata o modificare a celei din exemplul precedent. In cazul de fata se creaza trei cadre distincte, toate fiind instantieri ale clasei imbricate statice Cadru, derivata din clasa Frame. Unul din aceste cadre este considerat fereastra principala a aplicatiei, iar celelalte sunt ferestre auxiliare. Deosebirea consta in modul in care se trateaza evenimentul de inchidere a ferestrei. La inchiderea ferestrei principale trebuie sa se elibereze toate resursele si sa se incheie executarea aplicatiei. In schimb, la inchiderea unei ferestre secundare trebuie sa se elibereze numai resursele legate de fereastra respectiva, fara a se opri executarea aplicatiei.

Pentru a face aceasta distinctie, din clasa WindowAdapter au fost derivate doua clase. Prima din ele, clasa IEFP este destinata inchiderii ferestrei principale si este aceeasi ca in exemplul precedent. A doua, clasa IEF, este destinata inchiderii unei ferestre secundare. In aceasta clasa, in metoda windowClosing() nu se mai face invocarea de metoda System.exit(0), ci invocarea f.dispose(), unde f este referinta la fereastra care trebuie eliminata. In metoda main(), la fereastra principala fp s-a inregistrat o instanta a clasei IEFP, in timp ce la ferestrele secundare f2 si f3 s-a inregistrat cate o instanta a clasei IEF.

Exemplul 3: aplicatie cu o zona de text in care se inregistreaza evenimentele

In fisierul UrmEvenim.java se prezinta o modificare a aplicatiei din exemplul precedent, in care la FereastraPrincipala se adauga o suprafata de afisare a textului (TextArea) in care se inregistreaza evenimentele de activare si dezactivare a ferestrei. Pentru aceasta, s-a procedat astfel:
- in metoda main() s-a introdus o referinta la o un obiect din clasa TextArea;
- s-a adaugat acest component la FereastraPrincipala prin invarea fp.add(txt);
- constructorul clasei EvFereastra ,care intercepteaza evenimentele generate de fereastra principala, a primit ca argument o referinta (txt) la aceasta suprafata de afisare a textului;
- in clasa EvFereastra, derivata din WindowAdapter, in afara de metoda windowClosing() s-au redefinit si metodele windowActivated() si windowDeactivated(), astfel incat acestea sa afiseze in zona de text evenimentele interceptate;
- s-a mai introdus o clasa consumatoare de evenimente, numita EvMouse si derivata din clasa MouseAdapter, in care s-au redefinit metodele mouseEntered() si mouseExited(); aceastei clase i se transmite, de asemenea, o referinta la zona de text, pentru a putea afisa in ea evenimentele interceptate;
- in metoda main(), clasele EvFereastra si EvMouse sunt inregistrate la obiectul fp (fereastra principala).

Efectul se poate urmari punand aplicatia in executie si efectuand activari si dezactivari succesive ale acesteia. Dezactivarea ferestrei se face fie prin iconificarea ei, fie trecand in prim-plan o alta fereastra. Activarea este readucerea ferestrei in prim-plan.


Rezumat
Interfata utilizator grafica (engl.: GUI - Graphical User Interface) permite utilizatorului sa comunice cu aplicatia, folosind in acest scop obiecte grafice de pe ecran: ferestre, butoane, casete de validare, meniuri etc. Actionarea asupra acestora se face folosind tastatura sau dispozitive de intrare speciale, dintre care cel mai raspandit este mouse-ul.
In JDK exista pachete de clase care permit realizarea de interfete grafice, unul dintre acestea fiind java.awt. Initialele AWT provin de la Abstract Window Toolkit - set de dezvoltare de ferestre abstracte. Acest set permite realizarea de interfete grafice care nu depind de platforma pe care ruleaza aplicatia. El ofera programatorului clase de componente organizate sub forma unei ierarhii care are ca radacina clasa Component.

Folosirea interfetelor grafice implica si o abordare speciala in programare, numita programare orientata pe evenimente (engl: Event Oriented Programming) sau programare ghidata de evenimente (engl.: Event Driven Programming). In aceasta conceptie, obiectele din program pot fi surse de evenimente sau consumatoare ('ascultatoare') de evenimente (eng.: Event Listeners). Evenimentele insesi sunt obiecte (instante ale unor clase de evenimente) generate de surse si interceptate de consumatori. Clasele consumatoare de evenimente sunt cele care contin metodele prin care aplicatia reactioneaza la evenimentele respective.

In JDK 1.1 si 1.2 se aplica modelul de evenimente bazat pe delegare (engl.: Delegation Event Model). Conform acestuia, clasele de evenimente sunt organizate intr-o ierarhie, fiind specializate pe diferite tipuri de evenimente. Se disting evenimente de nivel inferior (cele generate de diferite componente) si evenimente abstracte (care reprezinta diferite evenimente conceptuale, independente de componenta care le-a generat). Fiecarei clase de evenimente ii corespunde o interfata pe care trebuie sa o implementeze clasele concepute de programator, care interceptepteaza si trateaza evenimentele respective. Interfetele sunt, de asemenea organizate intr-o ierarhie, similara celei a claselor. Pentru unele interfete s-au realizat si clase-prototip care le implementeaza, numite adaptoare. Clasele de evenimente, interfetele si adaptoarele se gasesc in pachetul java.awt.event.

Conform cu modelul delegarii, fiecare instanta a unei clase consumatoare de evenimente trebuie inregistrata la obiectul care genereaza evenimentele respective (sursa de evenimente). Sursa transmite evenimentele numai consumatorilor ('ascultatorilor') inregistrati. La receptionarea unui eveniment, in instanta consumatoare este invocata metoda de tratare a evenimentului respectiv.




Clasa Button
Obiectele acestei clase sunt butoane etichetate (care contin o inscriptie numita eticheta), avand forma dreptunghiulara. Butonul poate fi 'apasat' punand pe el cursorul de mouse si apasand pe butonul din stanga al acestuia. La fel ca un buton de sonerie, obiectul Button revine la starea normala imediat ce este eliberat (de fapt, imediat ce este eliberat butonul mouse-ului). Cand este apasat, butonul genereaza un eveniment din clasa ActionEvent, fiind un obiect de control, deoarece este folosit de operatorul uman pentru a transmite anumite comenzi prin intermediul interfetei grafice.
Constructori:

public Button() - construieste un buton fara eticheta;
public Button(String label) - construieste un buton avand eticheta primita ca argument; eticheta apare in interiorul dreptunghiului butonului;

Metode:

Clasa Button mosteneste toate metodele clasei Component, avand si metode specifice. Principalele metode specifice clasei button sunt:

public void addActionListener(ActionListener a) - adauga la buton un consumator de evenimente de tip ActionEvent;
public void removeActionListener(ActionListener a) - elimina un ActionListener inregistrat anterior;
public String getActionCommand() - intoarce numele evenimentului de actiune generat de catre buton;
public String getLabel() - intoarce eticheta butonului;
public void setLabel(String label) - pune butonului o eticheta (inlocuind-o pe cea anterioara);
public void setActionCommand(String command) - seteaza numele de comanda pentru evenimentul generat de acest buton (numele pe care il intoarce apoi metoda getActionCommand()).

Exemplul 1:

In fisierul TestButton.java este data ca exemplu o aplicatie in care se testeaza clasa Button. Exista doua butoane: primul indeplineste rolul de contorizare a apasarilor, iar al doilea il pune pe primul la valoarea 0.

Butonul principal este definit prin clasa (imbricata statica) ContorApasari, care extinde clasa Button. Instantele acestei clase sunt butoane care contorizeaza de cate ori au fost apasate. In acest scop sunt prevazute cu un camp de tip int numit numarApasari care este initializat la valoarea 0 si este incrementat la fiecare apasare a butonului respectiv. Acest 'contor de apasari' isi 'asculta' atat propriile actiuni, cat si pe cele generate de al doilea buton. Pentru a se face distinctie intre evenimentele de actiune generate de cele doua butoane, cele ale primului buton au fost denumite 'Numarare', iar ale celui de al doilea - 'Resetare'. In acest scop s-a folosit metoda setActionCommand(String).

La interceptarea unor evenimente de actiune (prin metoda actionPerformed(ActionEvent)), butonul contor de apasari determina numele acestora prin metoda getActionCommand() dupa care , daca numele actiunii este 'Numarare' isi incrementeaza contorul, iar daca numele este 'Resetare' il pune la zero. In ambele cazuri, dupa modificarea valorii contorului se afiseaza aceasta valoare prim metoda setLabel(String).

Fereastra principala este o instanta a clasei Frame, la care s-au adaugat ('in partea de nord si, respectiv in cea de sud) cele doua butoane. Pentru incheierea executarii aplicatiei s-a creat clasa EvFereastra, care intercepteaza evenimentele generate de aceasta si actioneaza la evenimentul WindowClosing

Exemplul 2:

In fisierul TestButtonAp.java este dat un exemplu de applet similar cu aplicatia de mai sus. Clasa TestButtonAp este derivata din clasa Applet, iar construirea butoanelor si adaugarea lor la applet (care se faceau in exemplul precedent in metoda main()) se fac acum in metoda init(). A disparut clasa EvFereastra, deoarece acum nu mai exista o fereastra principala si nu mai este necesara inchiderea aplicatiei. In rest, definirea clasei ContorApasari si utilizarea acesteia se fac la fel ca in exemplul precedent. Pentru vizualizarea appletului se foloseste fisierul TestButtonAp.html.

Indiferent de aspectul grafic, o instanta a clasei Checkbox poate fi deci considerata conceptual drept o componenta cu doua stari, care trece dintr-o stare in alta cand se face click de mouse pe suprafata ei, ramanand in noua stare pana la urmatorul click de mouse. Ea are si o eticheta (un text explicativ) care insa nu apare in interior, ca la Button, ci alaturi.

Indiferent de aspectul grafic, o instanta a clasei Checkbox poate fi deci considerata conceptual drept o componenta cu doua stari, care trece dintr-o stare in alta cand se face click de mouse pe suprafata ei, ramanand in noua stare pana la urmatorul click de mouse. Ea are si o eticheta (un text explicativ) care insa nu apare in interior, ca la Button, ci alaturi.




Clasele Checkbox si CheckboxGroup
O instanta a clasei Checkbox poate fi considerata conceptual drept o componenta grafica cu doua stari, care trece dintr-o stare in alta cand se face click de mouse pe suprafata ei, ramanand in noua stare pana la urmatorul click de mouse. Ea are si o eticheta (un text explicativ) care insa nu apare in interior, ca la Button, ci alaturi. Cand isi schimba starea, componenta din clasa Checkbox genereaza un ItemEvent.
Instantele clasei Checkbox pot fi reprezentate fie ca niste 'casete de validare', fie ca niste 'comutatoare'. Forma grafica depinde de platforma pe care ruleaza aplicatia.

In primul caz, pe ecran apare un dreptunghi in care, prin click de mouse pe suprafata lui, se schimba starea de la 'nevalidat' ('nebifat') la 'validat' ('bifat') sau invers. Validarea se exprima prin aparitia unui X sau unui simbol de bifare pe suprafata casetei.

In al doilea caz, pe ecran apare un buton cu doua stari: apasat sau eliberat. La fiecare click de mouse pe butonul respectiv, el trece dintr-o stare in alta. Este deci imaginea unui comutator din aparatura electrica. Spre deosebire de butonul simplu (din clasa Button), acesta nu revine la starea initiala imediat ce s-a eliberat butonul mouse-ului. La primul click de mouse comutatorul ramane apasat ('inchis'), iar la urmatorul se elibereaza (trece in starea 'deschis').

Obiectele clasei Checkbox pot fi grupate folosind in acest scop o instanta a clasei CheckboxGroup. In acest caz, numai unul din butoanele grupului poate fi apasat (o singura caseta este marcata), adica se gaseste in starea true, in timp ce toate celelalte sun eliberate, adica se gasesc in starea false. Cand se 'apasa' unul din butoanele grupului acesta ramane in starea 'cuplat' ('apasat'), dar se elibereaza automat cel care a fost apasat anterior. Astfel de butoane grupate se mai numesc si butoane radio. Clasa CheckboxGroup nu este o componenta (nu este descendenta a clasei Component). Ea face parte din pachetul java.awt, dar este derivata direct din clasa Object.

Constructori:

public Checkbox() - creaza o instanta Checkbox fara eticheta;
public Checkbox(String label) - creaza o instanta Checkbox cu eticheta primita ca argument;
public Checkbox(String label, boolean state) - creaza o instanta Checkbox avand eticheta si starea date ca argumente;
public Checkbox(String label, boolean state, CheckboxGroup group) - creaza o instanta Checkbox pentru care s-au specificat eticheta, starea si grupul caruia ii apartine.

Metode:
Principalele metode ale clasei Checkbox sunt urmatoarele:

public void addItemListener(ItemListener it) - inregistreaza un interceptor de evenimente din clasa ItemListener;
public void removeItemListener(ItemListener it) - elimina inregistrarea interceptorului de evenimente it;
public boolean getState() - intoarce starea;
public void setState(boolean state) - seteaza starea;
public String getLabel() - intoarce eticheta;
public void setLabel(String label) - pune o noua eticheta (in locul celei anterioare);
public CheckboxGroup getCheckboxGroup() - intoarce o referinta la grupul de care apartine;
public void setCheckboxGroup(CheckboxGroup group) - seteaza apartenenta la un grup;

Exemplul 1:

In fisierul TestChecbox.java este data o aplicatie de testare a unei instante a clasei Checkbox. In fereastra aplicatiei apar doua obiecte: o instanta a clasei Checbox (cu eticheta 'decide-te!') si o instanta a clasei Label in care se afiseaza starea curenta a celei dintai. Pentru urmarirea si tratarea schimbarilor de stare a fost creata clasa EvCheckbox, care implementeaza interfata ItemListener si al carei constructor primeste ca argumente referintele cb si lab catre cele doua obiecte grafice implicate: cb este sursa de evenimente (Checkbox), iar lab este eticheta (Label) unde se va afisa starea. In programul principal, instanta ecb a clasei EvCheckbox este inregistrata drept ItemListener al obiectului cb.



Clasa CheckboxGroup
Aceasta clasa nu este considerata componenta grafica, desi face parte din pachetul java.awt. Clasa Checbox group este descendenta directa a clasei Object. Instantele ei sunt grupuri de instante ale clasei Checkbox.
Constructor:
public CheckboxGroup() - construieste un grup vid;

Metode:
public Checkbox getSelectedCheckbox() - intoarce o referinta la caseta selectata;
public void setSelectedCheckbox(Checkbox box) - seteaza caseta selectata.


Exemplul 2:

In fisierul TestCheckboxGroup.java este prezentata o aplicatie de testare a unui grup de casete ('butoane radio'). In fereastra aplicatiei apare o instanta a clasei Label, in care se afiseaza eticheta casetei selectate la un moment dat, si un grup de trei casete avand etichetele CB1, CB2 si CB3. Pentru interceptarea evenimentelor de la cele trei casete s-a creat clasa EvCheckboxGroup, care implementeaza interfata ItemListener si al carei constructor primeste ca argumente referintele cbgr la ChecboxGroup si lab la Label. De cate ori se intercepteaza un ItemEvent, in metoda itemStateChanged(ItemEvent) se determina care din cele trei casete a fost selectata, aplicand metoda getSelectetCheckbox() a clasei CheckboxGroup. Se determina apoi eticheta acestei casete si se afiseaza.

Remarcam ca, in metoda main(), s-a adaugat separat fiecare din cele trei casete prin metoda add(), indicandu-se si 'zona geografica' in care sa se faca adaugarea. In schimb nu s-a adaugat grupul in sine (instanta clasei CheckboxGroup la care au fost atasate aceste casete), intrucat CheckBoxGroup nu este o componenta grafica.


Containere si pozitionarea componentelor
Containerele sunt componente grafice care contin alte componente. In AWT clasele de containere formeaza o ierarhie avand ca radacina clasa Container. Intrucat clasa Container este descendenta a clasei Component, orice container poate contine alte containere. Ierarhia claselor de containere este cea din figura de mai jos.




Clasa Container
Clasa Container modeleaza conceptul de container, definit ca o componenta care contine alte componente. In consecinta, ea extinde clasa Component si contine metode prin care pot fi adaugate sau eliminate alte componente (inclusiv alte containere). Componentele adaugate la container sunt stocate intr-o lista. Daca, la adaugarea unei noi componente, nu se precizeaza indicele, aceasta este pusa in coada listei. Cand se adauga sau se elimina o componenta, containerul genereaza un eveniment din clasa ContainerEvent, care poate fi interceptat de o instanta a unei clase cu interfata ContainerListener, sau care extinde clasa ContainerAdapter.
Constructor:
public Container() - creaza un nou container.

Metode:
Principalele metode sunt urmatoarele:

public Component add(Component comp) - componenta comp este adaugata in coada listei de componente; intoarce o referinta la componenta comp;
public Component add(Component comp, int index) - componenta comp este adaugata (mai bine zis inserata) in lista pe poxitia index; intoarce o referinta la componenta inserata;
public void add(Component comp, Object constraints) - se adauga componenta comp in coada listei, indicandu-se totodata gestionarului de pozitionare ca aceasta componenta foloseste obiectul de restrictii constraints;
public void add(Component comp, Object constraints, int index) - la fel ca metoda precedenta, dar inserarea se face pe pozitia index;
public void remove(int index) - se elimina componenta de pe pozitia index;
public void remove(Component comp) - se elimina componenta comp;
public void removeAll() - elimina toate componentele continute in container;
public LayoutManager getLayout() - intoarce o referinta la gestionarul de pozitionare al containerului;
public void setLayout(LayoutManager mgr) - seteaza gestionarul de pozitionare al containerului;
public void doLayout() - se face pozitionarea componentelor din container;
public void setFont(Font f) - seteaza fontul containerului;
public void paint(Graphics g) - picteaza containerul, folosind contextul grafic g primit ca parametru;
public void paintComponents(Graphics g) - picteaza toate componentele containerului;
public void addContainerListener(ContainerListener cl) - adauga interceptorul de evenimente cl din clasa ContainerEvent;
public void removeContainerListener(ContainerListener cl) - elimina interceptorul de evenimente cl;
public Dimension getPreferredSize() - intoarce dimensiunile preferate ale containerului;
public Dimension getMinimumSize() - intoarce dimensiunile minime ale containerului;
public Dimension getMaximumSize() - intoarce dimensiunile maxime ale containerului;
public Component getComponentAt(int x, int y) - intoarce componenta care se gaseste in punctul de coordonate (x,y);
public boolean isAncestorOf(Component c) - intoarce true daca componenta c exista in ierarhia de componente a containerului.


Interfata LayoutManager
Una din modalitatile de gestionare a pozitionarii componentelor pe suprafata unui container este folosirea unor gestionari de pozitionare (engleza: Layout Managers) care implementeaza interfata LayoutManager. Avantajul acestora este ca pozitionarea componentelor se face in mod automat, chiar daca se modifica dimensiunile containerului. Dezavantajul este ca programatorul este constrans la acele configuratii de amplasare a componentelor pentru care exista in AWT gestionari de pozitionare, sau trebuie sa-si faca propriul sau gestionar de pozitionare.
In pachetul java.awt aceasta interfata este implementata de doua clase: FlowLayout si GridLayout.

Metodele interfetei:

public void addLayoutComponent(String name, Component comp) - adauga la gestionarul de pozitionare componenta comp cu numele name;
public void removeLayoutComponent(Component comp) - elimina din gestionar componenta comp;
public Dimension preferredLayoutSize(Container parent) - calculeaza dimensiunile preferate ale containerului parent, tinand seama de componentele continute de acesta;
public Dimension minimumLayoutSize(Container parent) - calculeaza dimensiunile minime ale containerului parent primit ca argument, tinand seama de componentele pe care acesta le contine;
public void layoutContainer(Container parent) - aseaza containerul in panoul specificat.



Clase de containere
In acest subcapitol vom studia clasele de containere folosite in realizarea aplicatiilor si miniaplicatiilor. Dintre acestea, doua clase prezinta o importanta deosebita: clasa Frame, care serveste pentru realizarea ferestrei principale a oricarei aplicatii si clasa Applet, care serveste pentru realizarea de miniaplicatii (appleturi). Celelalte clase au rol auxiliar, putand fi folosite atat in aplicatii, cat si in miniaplicatii. Avand in vedere importanta si caracterul specific al clasei Applet, aceasta clasa v-a fi tratata intr-un capitol separat. Celelalte clase de containere din pachetul java.awt vor fi tratate in acest capitol.
Clasa Panel
Panoul (Panel) este cel mai simplu dintre containere. El este o simpla suprafata dreptunghiulara pe care se pot aseza diferite componente. Panourile se folosesc in special pentru a crea intr-un alt container (Frame, Applet) diferite grupari de componente.
Constructori:

public Panel() - creaza un nou panou, folosind gestionarul de pozitionare implicit (FlowLayout);
public Panel(LayoutManager layout) - creaza un nou panou, avand gestionarul de pozitionare specificat prin argument.

Metode:
Metodele sunt cele mostenite de la clasa Container.

Exemplu:
In aplicatia din fisierul TestGrid.java, data ca exemplu intr-o sectiune anterioara, s-a constatat ca folosirea butoanelor de comanda era incomoda, deoarece pozitia lor se schimba la modificarea numarului de componente din container. Se poate remedia aceasta, utilizand doua panouri: unul care contine numai cele doua butoane 'Pune' si 'Elimina', iar altul care contine grila de componente care se adauga si se elimina conform comenzilor date prin actionarea asupra celor doua butoane. O astfel de aplicatie este data in fisierul TestGrid1.java.


Clasa Window
Clasa Window se foloseste destul de rar in practica, in schimb din ea sunt derivate clasele Frame si Dialog, care se utilizeaza foarte mult. Instantele clasei Window sunt ferestre fara chenar si fara bara de titlu, deci se prezinta ca niste simple suprafete diagonale. Au, deci, acelasi aspect cu instantele clasei Frame, cu deosebirea ca ele sunt ferestre 'de cel mai inalt nivel' (engleza: top level window), deci nu pot fi adaugate la alte containere (nu pot fi argumente ale metodei add()).
Pozitionarea pe ecran a ferestrei (Window) se face in coordonate absolute, iar fereastra nu poate fi deplasata sau redimensionata cu mouse-ul. La crearea ferestrei, este necesar sa se indice o alta fereastra parinte, facand parte din una din clasele Window sau Frame.

La deschiderea sau inchiderea ferestrei (Window) se genereaza evenimente din clasa WindowEvent, care pot fi interceptate de o clasa care implementeaza interfata WindowListener sau extinde clasa WindowAdapter.

Gestionarul de pozitionare implicit pentru clasa Window este BorderLayout.

Constructori:

public Window(Frame owner) - construieste o noua fereastra invizibila, avand un 'parinte' sau 'proprietar' (owner) din clasa Frame; de regula, parinte este fereastra principala a aplicatiei;
public Window(Window owner) - construieste o noua fereastra invizibila, avand ca parinte o alta instanta a clasei Window.

Metode:
Principalele metode sunt:

public void pack() - face ca fereastra sa fie dimensionata astfel, incat sa corespunda cu dimensiunile preferate ale componentelor sale. Daca fereastra si/sau parintele ei nu sunt afisabile, ambele vor fi facute afisabile inainte de a se calcula dimensiunile preferate;
public void show() - face fereastra vizibila; daca aceasta este deja vizibila, o aduce in prim-plan;
public void hide() - ascunde (face invizibile) fereastra si componentele sale, ca si toate ferestrele 'fiice';
public void dispose() - elibereaza toate resursele folosite de fereastra, componentele ei si ferestrele 'fii';
public void toFront() - aduce fereastra in prim-plan;
public void toBack() - plaseaza fereastra ultima in stiva de ferestre (o pune in spatele celorlalte);
public Window getOwner() - intoarce parintele (proprietarul) ferestrei;
public Window[] getOwnedWindows() - intoarce tabelul ferestrelor 'fiice';
public void addWindowListener(WindowListener w) - adauga un 'ascultator' (interceptor) de evenimente generate de fereastra;
public void removeWindowlistener(WindowListener w) - elimina interceptorul de evenimente;
public boolean isShowing() - intoarce true daca fereastra este vizibila.

Exemplu:

In fisierul TestWindow.java este dat un exemplu de aplicatie, in care este creata o fereastra (instanta a clasei Window), avand ca parinte fereastra principala a aplicatiei. Ea contine un buton (adaugat de noi), a carui apasare produce schimbarea culorii ferestrei. Putem observa ca instanta clasei Window (avand initial culoarea cyan), nu se gaseste in cadrul ferestrei principale, ci in afara acesteia, conform cu coordonatele si dimensiunile impuse prin invocarea metodei
public void setBounds(int x, int y, int width, int height)
mostenita de la clasa Component.
Inchiderea ferestrei Window se face odata cu inchiderea ferestrei principale, a carei 'fiica' este.


Clasa Frame
Clasa Frame este derivata din clasa Window, fiind o fereastra care are chenar si bara de titlu. Este situata pe cel mai inalt nivel (engleza: top level window), deci nu poate fi continuta in alta fereastra. Este folosita ca fereastra principala a aplicatiei. O aplicatie poate avea, insa, si ferestre secundare din aceeasi clasa.
Cadrele (instantele clasei Frame) genereaza evenimente din clasa WindowEvent, care pot fi interceptate de o clasa care implementeaza interfata WindowListener sau extinde clasa WindowAdapter.

Bara de titlu este situata la partea superioara a cadrului si contine:
- in partea stanga un menu ascuns, care are comenzile de maximizare, revenire la dimensiunile normale, iconificare si inchidere a ferestrei;
- la centru, titlul ferestrei;
- in partea dreapta, trei butoane care comanda, respectiv, iconificarea, maximizarea/revenirea si inchiderea ferestrei.
Comenzile de maximizare/revenire si de iconificare produc efect direct (nu genereaza evenimente care trebuie captate); in schimb, comenzile de inchidere (atat cea dim meniul din stanga, cat si cea data prin apasarea pe butonul X din dreapta) genereaza un eveniment de fereastra (WindowEvent) care se capteaza prin metoda windowClosing() a interfetei WindowListener, deci aceasta comanda trebuie tratata prin program.

Gestionarul de pozitionare implicit pentru clasa Frame este BorderLayout. Instantele clasei Frame pot avea, de asemenea, o bara de meniu din clasa MenuBar.

Constructori:

public Frame() - construieste un cadru invizibil si fara titlu;
public Frame(String titlu) - construieste un cadru invizibil, cu titlul specificat prin argument.

Metode:
Mosteneste metodele claselor Container si Window, la care se adauga si metode specifice acestei clase, cel mai frecvent utilizate fiind urmatoarele:

public String getTitle() - intoarce titlul cadrului;
public void setTitle(String title) - pune cadrului un nou titlu;
public Image getIconImage() - intoarce imaginea pictogramei cadrului (aplicatiei);
public void setIconImage(Image image) - pune pictograma cadrului;
public MenuBar getMenuBar() - intoarce bara de menu continuta in cadru;
public void setMenuBar(MenuBar menu) - pune cadrului o bara de menu;
public boolean isResizable() - intoarce true daca acest cadru poate fi redimensionat cu mouse-ul;
public void setResizable(boolean resizable) - seteaza daca acest cadru poate sau nu sa fie redimensionat cu mouse-ul.

Exemple:
Toate aplicatiile cu interfata grafica date in exemplele din capitolele anterioare si din acest capitol au avut ferestre principale din clasa Frame. Mentionam aici numai pe unele dintre ele: UnCadru.java , TreiCadre.java, TestButton.java, TestCheckbox.java, TestFlow.java, TestGrid.java, TestBorder.java, TestCard.java, TestGridBag4.java, PozitAbs.java, TestGrid1.java. Toate aplicatiile din exemplele ulterioare vor avea, desigur, ferestre principale tot din clasa Frame sau derivate din aceasta.


Clasa Dialog
Clasa Dialog este derivata din clasa Window si are ca instante ferestre de nivelul cel mai inalt (engleza: top level window), care au chenar si titlu si sunt folosite, in general, pentru a purta un dialog cu utilizatorul, adica pentru a-i transmite un mesaj si a primi un raspuns de la acesta.
Gestionarul de pozitionare implicit pentru clasa Dialog este BorderLayout.

Fereastra de dialog poate fi modala sau nemodala. Daca este modala, ea blocheaza orice alta intrare catre alte ferestre de nivelul cel mai inalt, cu exceptia celor al caror parinte este ea insasi. Implicit, fereastra de dialog este nemodala. In momentul crearii fereastra este invizibila.

Constructori:

public Dialog(Dialog owner) - se creaza o noua fereastra de dialog fara titlu si cu parintele specificat;
public Dialog(Dialog owner, String title) - se creaza o noua fereastra de dialog, avand parintele si titlul specificate;
public Dialog(Dialog owner, String title, boolean modal) - se creaza o noua fereastra de dialog, specificandu-se parintele, titlul si daca este sau nu modala;
public Dialog(Frame owner) - se creaza o noua fereastra de dialog fara titlu, avand ca parinte un cadru;
public Dialog(Frame owner, boolean modal) - se creaza o noua fereastra de dialog fara titlu, specificandu-se cadrul parinte si daca este sau nu modala;
public Dialog(Frame owner, String title) - se creaza o noua fereastra de dialog, specificandu-se cadrul parinte si titlul;
public Dialog(Frame owner, String title, boolean modal) - se creaza o noua fereastra de dialog, specificandu-se parintele, titlul si daca este sau nu modala.

Metode:

Clasa Dialog mosteneste metodele claselor Container si Window, avand si metode specifice, dintre care mentionam:

public boolean isModal() - intoarce true daca fereastra este modala;
public void setModal(boolean b) - seteaza daca fereastra este sau nu modala;
public String getTitle() - intoarce titlul ferestrei;
public void setTitle(String title) - pune ferestrei un (nou) titlu;
public boolean isResizable() - intoarce true daca fereastra poate fi redimensionata cu mouse-ul;
public void setResizable(boolean resizable) - seteaza daca fereastra poate sau nu sa fie redimensionata.

Exemplu:

In fisierul TestDialog.java este data o aplicatie in care se folosesc o fereastra principala din clasa Frame si o fereastra auxiliara din clasa Dialog. Daca se apasa pe butonul X (close) din coltul dreapta-sus al ferestrei principale, se incheie executia aplicatiei, deci se inchid ambele ferestre, deoarece evenimentul respectiv este interceptat de clasa EvFP, in care metoda windowClosing() contine instructiunea System.exit(0). In schimb, daca se apasa pe butonul corespunzator al ferestrei de dialog, dispare numai aceasta fereastra, fara a se incheia executia aplicatiei, intrucat acest eveniment este interceptat de clasa Executie, in care metoda windowClosing() contine instructiunea w.dispose(). Se poate usor constata ca fereastra de dialog este nemodala, deoarece poate fi deplasata si redimensionata cu mouse-ul.
Rezumat
Componentele de text sunt acele componente, in care pot fi introduse si editate texte. In pachetul java.awtexista superclasa TextComponent si clasele TextField si TextArea derivate din aceasta.
Clasa TextComponent este superclasa tuturor componentelor care opereaza cu texte. Ea contine metode de adaugare si eliminare a unui 'ascultator' de text (TextListener), de introducere a unui text, de obtinere a textului existent in componenta sau a subtextului selectat, de obtinere sau setare a pozitiei de la care incepe subtextul selectat sau la care se termina acesta.

Clasa TextField este derivata din clasa TextComponent. Instantele acestei clase contin un singur camp de text, adica un text sub forma unui sir de caractere pe o singura linie. Textul poate fi editat de la tastatura. Daca acest camp de text este activ si se apasa pe tasta , el genereaza un evenimant din clasa ActionEvent, care poate fi interceptat de un ActionListener. Este posibil sa se specifice un 'caracter de ecou' prin care pot fi inlocuite la afisare caracterele efective ale textului, astfel incat acesta sa fie mentinut secret.

Clasa TextArea este, de asemenea, derivata din clasa TextComponent. Instantele acestei clase sunt zone (suprafete) de afisare a unor texte formate din mai multe linii. Pe marginile din dreapta si/sau de jos pot fi puse si bare de defilare. Clasa ofera metode de adaugare a unui text in coada celui deja existent, de inserare a unui test in cel deja existent, de aflare sau de stabilire a dimensiunilor zonei. Textul poate fi editat de la tastatura.

Listele de optiuni sunt acele componente, care contin mai multe articole, care pot fi selectate cu ajutorul mouse-lui. In cazul clasei List, sunt vizibile simultan mai multe articole, situate unul sub altul. Articolul selectat este marcat printr-o banda colorata altfel decat restul listei. Daca totusi, inaltimea dreptunghiului listei este prea mica, astfel ca nu incap pe inaltime toate componentele, pe marginea acesteia apare o bara de derulare, care permite deplasarea listei, astfel incat sa se parcurga toate articolele existente. Clasa List poate fi setata astfel, incat sa ofere selectie simpla sau selectie multipla. Clasa ofera metode prin care se poate obtine continutul sau indicele articolului selectat sau tabelul articolelor selectate. Exista, de asemenea, metode prin care se pot adauga sau elimina articole si se pot selecta sau deselecta articole. La selectarea sau deselectarea unui articol se genereaza un ItemEvent, iar daca se face dublu click de mouse pe un articol se genereaza un ActionEvent.

In cazul clasei Choice, din lista de optiuni este vizibil la un moment dat numai articolul selectat. Exista intotdeauna un articol selectat (cel vizibil) si numai unul. Daca se pune cursorul mouse-lui pe articolul vizibil si se apasa butonul mouse-lui, intreaga lista devine vizibila. In aceasta situatie, tragand mouse-ul se poate selecta oricare din articole. La eliberarea butonului mouse-ului, articolul astfel selectat ramane vizibile, iar celelalte devin 'ascunse'. La schimbarea articolului selectat se genereaza un ItemEvent. Exista metode de adaugare si eliminare a articolelor si de aflare a continutului sau indicelui articolului selectat si de modificare a selectiei curente.


Clasa TextArea
Un obiect din clasa TextArea este o zona dreptunghiulara care poate contine un text scris pe mai multe linii. Daca textul este mai mare dacat suprafata acestei zone de text, in partea dreapta si/sau la partea inferioara apar automat bare de defilare, cu ajutorul carora textul poate fi deplasat vertical sau orizontal. Asupra textului se pot face operatii simple de editare: se poate selecta o anumita zona, se poate adauga text, se pot sterge sau insera portiuni de text.
Constructori:

public TextArea() - construieste o zona de text vida;
public TextArea(String text) - construieste o zona de text, care contine textul primit ca argument;
public TextArea(int rows, int columns) - construieste o zona de text vida, cu dimensiunile specificate;
public TextArea(String text, int rows, int columns) - construieste o zona de text, fiind specificate textul continut si dimensiunile zonei;
public TextArea(String text, int rows, int columns, int scrollbars) - se construieste o zona de text, avand specificate textul, dimensiunile zonei si barele de defilare. Parametrul scrollbars poate avea una din urmatoarele valori predefinite sub forma de variabile statice finale ale clasei TextArea: SCROLLBARS_BOTH, SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_NONE. Orice alta valoare este interpretata drept SCROLLBARS_BOTH.

Metode:

Clasa TextArea mosteneste toate metodele claselor TextComponent si Component. Dintre metodele specifice clasei TextArea, le mentionam aici pe urmatoarele:

public void append(String str) - adauga sirul str la sfarsitul textului existent deja in zona;
public void insert(String str, int pos) - insereaza sirul str in textul existent in zona, incepand de la pozitia pos;
public void replaceRange(String str, int start, int end) - inlocuieste prin sirul str subtextul din zona situat intre pozitiile start si end;
public int getRows() - intoarce inaltimea zonei, exprimata in numar de linii;
public void setRows(int rows) - seteaza inaltimea zonei de text, exprimata in numar de linii;
public int getColumns() - intoarce latimea zonei de text, exprimata in numar de coloane;
public void setColumns(int columns) - seteaza latimea zonei de text, exprimata in numar de coloane;
public Dimension getPreferredSize() - intoarce dimensiunile preferate ale unei zone de text;
public Dimension getPreferredSize(int rows, int columns) - intoarce dimensiunea preferata a zonei de text cu numarul de linii si de coloane specificat prin argumente;
public Dimension getMinimumSize() - intoarce dimensiunile minime ale zonei de text;
public Dimension getMinimumSize(int rows, int columns) - intoarce dimensiunile minime ale unei zone de text avand numarul de linii si de coloane specificate ca argumente.

Exemplu:

In fisierul OpAritm1.java se da o modificare a aplicatiei din fisierul OpAritm.java.In aceasta noua varianta, pentru afisarea rezultatelor operatiilor s-a introdus in zona centrala a ferestrei principale o zona de text (o instanta a clasei TextArea). Toate mesajele se adauga la textul existent deja in aceasta zona, invocandu-se in acest scop metoda append(). La panoul cu butoane s-a mai adaugat un buton, cu eticheta 'Stergere', a carui apasare produce stergerea textului din zona de text.
Dupa ce s-au facut mai multe operatii, se poate verifica ca:
- daca se selecteaza cu mouse-ul un subtext din zona si se apasa tasta del, subtextul selectat este eliminat;
- este posibil sa editam textul din fereastra folosind tastatura;
- daca numarul de linii de text adaugate este mare, putem folosi bara de defilare verticala pentru a vizualiza tot textul;
- daca introducem de la tastatura o linie de text mai lunga decat latimea zonei de text, putem folosi bara de defilare orizontala pentru a vizualiza intreaga linie.


Desenarea
In principiu, desenarea se poate face pe suprafata oricarei componente, folosind metodele
public void paint(Graphics g);
public void repaint();
existente in clasa Component. Clasa Graphics furnizeaza contextul grafic, iar metoda paint() foloseste aceasta clasa pentru trasarea desenului. Metoda repaint() apeleaza metoda paint(), furnizandu-i acesteia ca argument contextul grafic.
In general, pentru realizarea desenelor cu pachetul java.awt se folosesc clasele Canvas, pentru realizarea suprafetei de desenare, si Graphics - pentru trasarea desenului propriu-zis.

Clasa Canvas
Desi, in principiu, desenarea s-ar putea face pe suprafata oricarei componente, in pachetul java.awt exista o clasa folosita special pentru desenare. Aceasta este clasa Canvas. In limba engleza, canvas este panza pe care deseneaza pictorul. In limbajul Java, Canvas este este o clasa derivata din clasa Component, ale carei instante sunt suprafete de desenare. Daca dorim sa realizam un obiect care reprezinta un desen, trebuie sa creem in acest scop o clasa derivata din clasa Canvas.
Desenarea propriuzisa, fie ea pe o suprafata de desenare din clasa Canvas sau pe o alta componenta, se face folosind metodele clasei Graphics, care exista, de asemenea, in pachetul java.awt.

Constructori:

public Canvas() - construieste o noua suprafata de desenare;
public Canvas(GraphicsConfiguration config) - construieste o noua suprafata de desenare, transmitandu-i ca parametru obiectul config din clasa GraphicsConfiguration;

Metode:
Clasa Canvas mosteneste toate metodele clasei Component. Dintre metodele specifice clasei Canvas mentionam aici:

public void paint(Graphics g) - redefineste metoda paint() din clasa Component si serveste pentru trasarea desenului pe suprafata de desenare. In subclasele clasei Canvas aceasta metoda se redefineste, astfel incat sa se realizeze desenul dorit, folosind metodele clasei Graphics.


Clasa Graphics
In pachetul java.awt este definita clasa abstracta Graphics, care este clasa de baza a tuturor contextelor grafice care permit trasarea de desene pe suprafata componentelor grafice realizate pe diverse dispozitive fizice.
Un obiect din clasa Graphics incapsuleaza informatia de stare a contextului grafic la care se refera si anume:
- obiectul din clasa Component (sau dintr-o subclasa a acesteia) pe care se deseneaza;
- o translatie a originii sistemului de coordonate; toate coordonatele din desen sunt raportate la aceasta origine;
- decupajul curent (dreptunghiul in interiorul caruia se traseaza desenul);
- culoarea curenta;
- fontul curent;
- operatia logica pe pixeli curenta (XOR sau paint);
- alternarea curenta de culori pentru operatia pe pixeli XOR.

Originea sistemului de axe (punctul de coordonate 0,0) se gaseste in coltul din stanga-sus al dreptunghiului de desenare. Axa 0x este indreptata spre dreapta, iar axa 0y - in jos.

Practic, clasa abstracta Canvas contine acele metode care trebuie sa existe in orice context grafic. Continutul concret al acestor metode, deci modul efectiv in care se realizeaza functiile respective, depinde de contextul grafic, deci de dispozitivul fizic pe care se face desenarea si de sistemul de operare folosit. Pe programatorul de aplicatii sau miniaplicatii in Java nu il intereseaza insa acest lucru, deoarece el foloseste in programele sale metodele clasei abstracte Graphics, fara sa se preocupe de modul in care acestea vor fi executate.

Metode:
Principalele metode ale clasei Graphics sunt urmatoarele:

public abstract Graphics create() - creaza si intoarce un nou obiect din clasa Graphics, care este o copie a obiectului pentru care se aplica aceasta metoda;
public abstract Graphics create(int x, int y, int width, int height) - creaza si intoarce o copie a obiectului din clasa Graphics caruia i se aplica, insa cu o noua translatie a originii (x,y) si cu valori noi ale latimii si inaltimii dreptungiului de desenare (suprafetei de decupare);
public abstract void translate(int x, int y) - translateaza originea sistemului de coordonate in punctul (x,y) al sistemului de coordonate curent;
public abstract Color getColor() - intoarce culoarea de desenare curenta;
public abstract void setColor(Color c) - seteaza culoarea de desenare curenta;
public abstract Font getFont() - intoarce fontul curent;
public abstract void setFont(Font f) - seteaza fontul curent;
public abstract FontMetrics getFontMetrics() - intoarce metrica fontului curent;
public abstract void setFontMetrics(FontMetrics fm) - seteaza metrica fontului curent;
public abstract Rectangle getClipBounds() - intoarce dreptunghiul de decupare curent;
public abstract void setClip(int x, int y, int width, int height) - seteaza dreptunghiul de decupare curent;
public abstract void copyArea(int x, int y, int width, int height, int dx, int dy) - copiaza suprafata dreptunghiulara cu originea (x,y), latimea width si inaltimea height intr-o noua zona de aceleasi dimensiuni, avand originea (x+dx, y+dy)..
public abstract void setPaintMode() - seteaza operatia logica pe pixeli curenta la modul paint, adica desenarea se face peste fondul existent, folosinduse culoarea de desenare curenta, fara a lua in consideratie culoarea fondului.
public abstract void setXORMode(color c1) - seteaza operatiile pe pixeli la modul XOR, adica se alterneaza pixelii de culoare curenta cu cei din culoarea c1; aceasta inseamna ca daca un pixel nou plasat are aceeasi culoare curenta cu cea existenta anterior in acelasi loc, ea va fi inlocuita cu c1; invers, daca pixelul existent anterior avea culoarea c1, ea va fi inlocuita cu culoarea curenta.
public abstract void drawLine(int x1, int y1, int x2, int y2) - se traseaza o linie dreapta din punctul de coordonate (x1,y1) pana in punctul (x2,y2);
public abstract void drawRect(int x, int y, int width, int height) - se traseaza un dreptunghi cu coltul din stanga sus in punctul (x,y), avand latimea width si inaltimea height;
public abstract void fillRect(int x, int y, int width, int height) - umple cu culoarea curenta interiorul dreptunghiului cu coltul din dreapta sus in punctul (x,y) si cu dimensiunile (width, height);
public abstract void clearRect(int x, int y, int width, int height) - sterge continutul dreptunghiului de coordonate si dimensiuni specificate, umplandu-l cu culoarea de fond;
public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) - traseaza un dreptunghi cu colturile rotunjite, unde arcWidth si arcHeight sunt respectiv diametrul orizontal si diametrul vertical al arcelor de rotunjire;
public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) - umple cu culoarea curenta interiorul unui dreptunghi cu colturile rotunjite;
public abstract void draw3DRect(int x, int y, int width, int height, boolean raised) - deseneaza un dreptunghi astfel luminat, incat el apare ca iese din suprafata de baza, daca raised=true, sau este scufundat in aceasta suprafata, daca raised=false;
public abstract void fill3dRect(int x, int y, int width, int height, boolean raised) - umple cu culoarea curenta interiorul unui dreptunghi tridimensional, luind in consideratie si iluminarea;
public abstract void drawOval(int x, int y, int width, int height) - se deseneaza ovalul inscris in dreptunghiul cu coltul din stanga sus in punctul (x,y) si cu dimensiunile (width, height);
public abstract void fillOval(int x, int y, int width, int height) - se umple cu culoarea curenta continutul ovalului inscris in dreptunghiul cu coltul stanga sus in punctul (x,y) si de dimensiuni (width, height);
public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) - se deseneaza un arc circular sau eliptic, care acopera dreptunghiul specificat. Putem sa ne imaginam ca din elipsa inscrisa in acest dreptunghi si avand centrul in centrul dreptunghiului, se traseaza efectiv numai arcul care incepe de la unghiul startAngle si se extinde pe un unghi egal cu arcAngle. Unghiurile sunt masurate in grade. Unghiul 0 este corespunzator pozitiei de la ora 3 a acului de ceasornic, iar sensul pozitiv al unghiurilor este cel contra acelor de ceasornic;
public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) - umple cu culoarea curenta sectorul marginit de arcul specificat prin parametri si de razele de la capete;
public abstract void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) - traseaza o linie franta, care trece prin punctele ale caror coordonate (x,y) sunt date in tabelele xPoints si yPoints; numarul de puncte este nPoints;
public abstract void drawPoligon(int[] xPoints, int[] yPoints, int nPoints) - traseaza un poligon cu nPoints varfuri, situate in punctele ale caror coordonate (x,y) sunt date in tabelele xPoints si yPoints;
public abstract void drawPoligon(Poligon p) - traseaza poligonul specificat ca argument;
public abstract void fillPoligon(int[] xPoints, int[] yPoints, int nPoints) - umple cu culoarea curenta un poligon cu nPoints varfuri, situate in punctele ale caror coordonate (x,y) sunt date in tabelele xPoints si yPoints;
public abstract void fillPoligon(Poligon p) - umple cu culoarea curenta poligonul specificat ca argument;
public abstract void drawString(String str, int x, int y) - traseaza sirul de caractere str, folosind fontul si culoarea curente; baza primului caracter al sirului este in punctul de coordonate (x,y);
public abstract void drawString(AttributedCharacterIterator iterator, int x, int y) - traseaza un sir de caractere continute in obiectul iterator, care specifica nu numai caracterele propriuzise ci si fontul fiecarui caracter; baza primului caracter este in punctul de coordonate (x,y);
public abstract void drawChars( char[] data, int offset, int length, int x, int y) - traseaza length caractere din tabloul data, incepand cu caracterul cu indicele offset; baza primului caracter se gaseste in punctul de coordonate (x,y); fontul si culoarea sunt cele curente;

Exista, de asemenea, mai multe metode de trasare a unor imagini externe, care vor fi prezentate intr-un subcapitol separat.

Exemplul 1:

In fisierul Desen.java este dat un exemplu de aplicatie simpla, in care se testeaza diferite metode ale clasei Graphics. In acest scop, s-a creat clasa SuprDesenare ca o extensie a clasei Canvas. In aceasta clasa, a fost redefinita metoda paint(), astfel incat sa se traseze diferite desene: un dreptunghi gol, un dreptunghi plin, un dreptunghi gol cu colturile rotunjite, un dreptunghi plin cu colturile rotunjite, un oval gol, un oval plin, o linie franta si un poligon. S-au testat in acest fel metodele clasei Graphics. In fereastra aplicatiei s-a introdus o instanta a clasei SuprDesenare.

Exemplul 2:

In fisierul GraficeFunctii.java este dat un exemplu de aplicatie pentru trasarea graficelor unor functii. In fereastra aplicatiei s-au pus:
- panoul fct care contine o lista de selectie a functiei de reprezentat si trei campuri de text, in care se introduc de la tastatura marginile inferioara si superioara a intervalului in care se traseaza functia (sub forma de numere reale) si numarul de subintervale in care se imparte acesta;
- suprafata de afisare gr pe care se traseaza graficul;
- eticheta mesaj in care se introduc eventualele mesaje de eroare.
Pentru panoul fct a fost creata clasa Functii, derivata din clasa Panel si s-a folosit gestionarul de pozitionare GridLayout.
Pentru suprafata de afisare s-a creat clasa Grafic, derivata din clasa Canvas.
Clasa Actiuni intercepteaza evenimentele generate de fereastra principala, campurile de text si lista de selectie a functiilor. In acest scop, ea este derivata din clasa WindowAdapter si implementeaza interfetele ActionListener si ItemListener.
Trasarea graficului se face sub forma unei linii frante, folosind metoda drawPoliline(int x[],int y[],int nrPuncte), in care vectorii x si y contin coordonatele punctelor prin care trece curba. Scarile de reprezentare pe cele doua axe se aleg automat, astfel incat graficul sa ocupe intreaga suprafata de desenare. In acest scop, se calculeaza mai intai valorile reale ale functiei de reprezentat, completandu-se cu ele vectorul real valy. Se determina apoi ymax si ymin, iar dimensiunile suprafetei de desenare se determina prin metodele getWidth() si getHeight(), iar xmin si xmax sunt date. Folosind aceste date se calculeaza scarile pe x si y, dupa care se calculeaza coordonatele pe desen ale punctelor, completandu-se astfel vectorii x si y. Aceste calcule se fac in metoda calcul() din clasa Actiuni, iar trasarea graficului se face in metoda paint() din clasa Grafic.


Rezumat
In principiu, desenarea se poate face pe suprafata oricarei componente, folosind metodele
public void paint(Graphics g);
public void repaint();
existente in clasa Component. Clasa Graphics furnizeaza contextul grafic, iar metoda paint() foloseste aceasta clasa pentru trasarea desenului. Metoda repaint() apeleaza metoda paint(), furnizandu-i acesteia ca argument contextul grafic.
De cele mai multe ori, pentru trasarea desenelor sunt folosite ca suport componente de desenare care sunt obtinute ca extensii ale clasei Canvas. In aceasta clasa este necesar sa se redefineasca metoda paint() pentru a trasa desenul, folosind metodele contextului grafic din clasa Graphics.

Clasa Graphics este o clasa abstracta din pachetul java.awt, prin care este specificat un context grafic abstract. La trasarea desenelor se folosesc, de fapt, extensii (concretizari) ale acestei clase, care depind de platforma pe care se lucreaza. Programatorul foloseste, insa, in programele sale metodele clasei abstracte Graphics, astfel incat aceste programe sa fie independente de platforma.

Clasa Graphics ofera atat metode de obtinere si de setare a proprietatilor contextului grafic (dimensiuni, culoare, font) cat si metode de trasare a segmentelor de dreapta, liniilor poligonale deschise, arcelor si de trasare a unor figuri plane ca dreptunghi, dreptunghi cu colturile rotunjite, dreptunghi tridimensional, oval si poligon. In cazul figurilor, se poate trasa fie numai conturul, fie figura plina.

Culorile sunt reprezentate in java.awt prin instante ale clasei Color, aplicandu-se sistemul RGB (Red,Green,Blue), in care orice culoare este obtinuta prin combinarea a trei culori fundamentale: rosu, verde si albastru. Intensitatea fiecarei componente este exprimata prin numere intregi in intervalul [0 .. 255]. O a patra componenta, alpha indica opacitatea culorii (alpha=0 - culoare total transparenta, iar alpha=255 indica o culoare complet opaca). Clasa Color permite, de asemenea, utilizarea standardului sRGB, in care exprimarea componentelor de culoare se face prin numere reale (de tip float) in intervalul [0.0, , 1.0].

Clasa Color contine, de asemenea, metode prin care se poate genera o culoare RGB (sau sRGB) pornind de la parametrii culorii exprimati in sistemul HSB (Hue, Saturation, Brightness - culoare, saturatie, stralucire).

Scrierea se face folosind fonturi, care sunt instante ale clasei Font, care incorporeaza informatii despre forma, stilul si marimea unui font.


Meniuri
In aplicatiile cu interfata grafica, selectarea optiunilor se face adesea prin meniuri. In acest scop, in pachetul java.awt exista componente de meniu, cu ajutorul carora se pot crea meniuri. Ierarhia componentelor de meniu este data in figura 1.


- Figura 1 -

Componentele de meniu nu sunt derivate din clasa Component, ca celelalte componente ale interfetei grafice, ci din clasa MeniuComponent care descinde direct din clasa Object.

Meniurile sunt puse, de obicei, intr-o bara de meniu care contine numele unor meniuri derulante. Bara de meniu este instanta a clasei MenuBar (sau a unei subclase a acesteia) si se adauga la partea superioara a unui cadru (instanta a clasei Frame) invocand metoda setMenuBar(). Meniurile derulante sunt instante ale clasei Menu. Fiecare menu contine unul sau mai multe articole de menu din clasa MenuItem sau CheckboxMenuItem.

Exista, de asemenea, posibilitatea sa se utilizeze meniuri care nu sunt cuprinse intr-o bara de meniu, ci pot sa apara intr-un punct oarecare al unei componente grafice. Acestea fac parte din clasa PopupMenu si se numesc meniuri de context deoarece depind de componenta grafica la care se ataseaza.

Activarea meniurilor din bara de meniu se face in special cu ajutorul mouse-lui. Exista insa si posibilitatea de a atasa oricarui articol de meniu o comanda rapida (engleza: short-cut) care se face prin apasarea unei combinatii de taste. Pentru crearea acestor comenzi rapide se folosesc instante ale clasei MenuShortcut.

In cele ce urmeaza, vom prezenta aceste clase si utilizarea lor la alcatuirea meniurilor.


Clasa MenuComponent
Clasa MenuComponent, este o clasa abstracta, derivata din clasa Object. Ea este superclasa tuturor claselor care servesc la alcatuirea meniurilor in AWT.
Metode:
Dintre metodele clasei MenuComponent mentionam:

public String getName() - intoarce numele componentei de meniu;
public void setName(String name) - pune numele componentei de meniu;
public Font getFont() - intoarce fontul componentei de meniu;
public void setFont(Font f) - pune fontul care va fi folosit in componenta de meniu;


Clasa MenuBar
Bara de meniu se pune la partea superioara a unui cadru (Frame) si contine unul sau mai multe meniuri (din clasa Menu). Pentru a pune in cadru bara de meniu se foloseste metoda
public void setMenuBar(MenuBar mb)
din clasa Frame.
Constructor:

public MenuBar() - creaza o bara de meniu vida;

Metode:
Dintre metodele clasei MenuBar mentionam aici:

public Menu add(Menu m) - adauga la bara un nou meniu si intoarce o referinta la acesta;
public void remove(int index) - elimina din bara meniul cu indicele index;
public void remove(MenuComponent m) - elimina componenta de meniu m;
public Menu getHelpMenu() - intoarce meniul de informatii ajutatoare (help) existent in bara de meniu;
public void setHelpMenu(Menu m) - pune in bara meniul de informatii ajutatoare (help);
public int getMenuCount() - intoarce numarul de meniuri din bara de meniu;
public Enumeration shortcuts() - intoarce o enumeratie a comenzilor rapide existente in bara de meniu;
public MenuItem getShortcutMenuItem(MenuShortcut s) - intoarce articolul de meniu corespunzator comenzii rapide s;
public void deleteShortcut(MenuShortcut s) - elimina comanda rapida s.


Clasa MenuItem
Orice meniu este alcatuit din unul sau mai multe articole de meniu, care sunt instante ale clasei MenuItem. Acestea sunt optiuni sau comenzi date de utilitator. Atunci cand se face click de mouse pe un articol de meniu, are loc generarea unui eveniment din clasa ActionEvent. Acelasi eveniment este generat daca se actioneaza combinatia de taste corespunzatoare articolului de meniu respectiv.
Intrucat clasa Meniu este o subclasa a clasei MeniuItem, inseamna ca un meniu poate sa contina drept articole alte meniuri. Se pot astfel realiza meniuri 'in cascada'. Facem totusi observatia ca, daca se face click de mouse pe un meniu, nu are loc generarea unui eveniment din clasa ActionEvent, acestea fiind generate numai de instantele clasei MenuItem.

Un articol de menu poate sa fie activ (engleza: enabled) sau inactiv. Daca este inactiv, articolul nu genereaza evenimente de actiune (ActionEvent). La crearea lui, articolul de meniu este implicit activ.

Constructori:

public MenuItem() - creaza un articol de meniu fara eticheta si fara comanda rapida;
public MenuItem(String label) - creaza un articol de meniu cu eticheta label, fara comanda rapida;
public MenuItem(String label, MenuShortcut s) - creaza un articol de meniu cu eticheta label si comanda rapida s;

Metode:
Dam aici cele mai folosite metode ale clasei MenuItem:

public String getLabel() - intoarce eticheta articolului de meniu;
public void setLabel(String label) - pune in articolul de meniu eticheta label;
public boolean isEnabled() - intoarce true daca articolul de meniu este activ;
public void setEnabled(boolean b) - seteaza daca articolul de meniu este sau nu activ;
public MenuShortcut getShortcut() - intoarce comanda rapida asociata articolului de meniu;
public void setShortcut(MenuShortcut s) - seteaza comanda rapida asociata articolului de meniu;
public void deleteShortcut() - elimina comanda rapida asociata articolului de meniu;
public String getActionCommand() - intoarce numele evenimentului de actiune generat de acest articol de meniu;
public void setActionCommand(String command) - modifica numele evenimentului de actiune generat de catre acest articol de meniu (implicit numele evenimentuluide actiune este identic cu eticheta articolului);
public void addActionListener(ActionListener a) - adauga la articol un receptor de evenimente de actiune;
public void removeActionListener(ActionListener a) - elimina receptorul de evenimente de actiune;


Clasa Menu
Instantele clasei Menu sunt meniuri derulante. Aceste meniuri se desfasoara pe ecran sub forma unei liste verticale de articole. Articolele pot fi instante ale claselor MenuItem, CheckboxMenuItem sau Menu. Faptul ca un articol de meniu poate fi el insusi un meniu permite crearea de meniuri in cascada. Intre articolele de meniu pot fi introdusi separatori sub forma unor linii orizontale.
Optional, meniurile pot fi tractabile (engleza: tear-off menu). Astfel de meniuri pot fi trase cu mouse-ul si deplasate in alta parte a ecranului. Daca platforma pe care ruleaza programul nu ofera posibilitatea tractarii, aceasta optiune este ignorata.

Constructori:

public Menu() - construieste un meniu fara eticheta;
public Menu(String label) - construieste un meniu cu eticheta label;
public Menu(String label, boolean tearOff) - construieste un meniu cu eticheta label, iar al doilea parametru indica daca este sau nu tractabil;

Metode:
Dam aici principalele metode ale clasei Menu:

public int getItemCount() - intoarce numarul de articole de meniu continute;
public boolean isTearOff() - intoarce true daca meniul este tractabil;
public MenuItem getItem(int index) - intoarce articolul de meniu de pe pozitia index;
public MenuItem add(MenuItem mi) - adauga la meniu articolul mi;
public void add(String label) - adauga la meniu un articol cu eticheta label;
public void insert(MenuItem mi, int index) - insereaza articolul mi pe pozitia index;
public void insert(String label, int index) - insereaza pe pozitia index un articol cu eticheta label;
public void addSeparator() - se adauga la meniu un separator;
public void insertSeparator(int index) - se insereaza un separator pe pozitia index;
public void remove(int index) - se elimina articolul de pe pozitia index;
public void remove(MenuItem mi) - se elimina articolul mi;
public void removeAll() - se elimina din meniu toate articolele continute.

Exemplu:

In fisierul TestMenu.java este dat un exemplu de aplicatie in care se foloseste o bara de meniu, care contine doua meniuri, avand respectiv etichetele 'Menu A' si 'Menu B'. Meniul 'Menu A' contine cinci articole si doi separatori. Unul din articole este un submeniu, cu eticheta 'Submenu SA1', care contine, la randul lui, doua articole. Meniul 'Menu B' contine numai doua articole simple.
In fereastra aplicatiei, in afara de bara de meniu, exista o instanta a clasei Label care serveste pentru afisarea de mesaje. Atunci cand se face click de mouse pe un articol de meniu, se afiseaza textul 'Ati selectat: '. Daca se selecteaza articolul 'Exit' din meniul 'Menu A', se incheie executarea aplicatiei.
Interfata grafica a aplicatiei este realizata prin clasa GUI, iar tratarea evenimentelor prin clasa TratEven. Pentru tratarea evenimentelor generate de articolele de meniu, la clasa TratEven s-a adaugat interfata ActionListener, care contine metoda actionPerformed(ActionEvent e). Numele articolului de meniu care a generat evenimentul e se obtine prin metoda e.getActionCommand(). Aplicatia afiseaza ultimul articol selectat.


Rezumat
Meniurile sunt alcatuite din articole de meniu care servesc pentru selectarea de catre utilizator a unor optiuni. Meniul poate fi el insusi folosit ca articol al unui alt meniu, realizandu-se astfel meniuri in cascada.
Exista doua categorii de meniuri: meniuri cu bara si meniuri de context.

Meniurile cu bara sunt formate dintr-o bara de meniu (instanta a clasei MenuBar), care contine una sau mai multe instante ale clasei Menu. Barele de meniu pot fi utilizate numai la partea superioara a unui cadru (instanta a clasei Frame). Fiecare meniu contine unul sau mai multe articole, care sunt instante ale claselor Menu, MenuItem sau CheckboxMenuItem. La selectarea cu mouse-ul a unui articol de meniu din clasa MenuItem se genereaza un eveniment de actiune, din clasa ActionEvent, deci un astfel de articol se comporta asemenator unui buton. La selectarea unui articol din clasa CheckboxMenuItem se schimba starea articolului respectiv (din true in false sau invers) si se genereaza un eveniment din clasa ItemEvent, deci se comporta asemanator unei casete de validare.

Pentru a selecta anumite articole de meniu direct de la tastatura, acestor articole li se pot atasa comenzi rapide din clasa MenuShortcut.

Meniurile de context sunt instante ale clasei PopupMenu. Ele se pot atasa oricarei componente a interfetei grafice si pot fi afisate in orice punct al acesteia. In rest, ele se comporta ca si celelalte meniuri.


Clasa MenuShortcut si adaugarea de comenzi rapide
Instantele clasei MenuShortcut servesc pentru a adauga la articolele de menu posibilitatea de a fi selectate direct de la tastatura, prin formarea unei combinatii de taste. Clasa MenuShortcut este derivata direct din clasa Object.
Pentru a detecta combinatia de taste formata, clasa MenuShortcut capteaza evenimentele de tastatura din clasa KeyEvent.In aceasta clasa exista constante (variabile finale) de tip int prin care sunt codificate toate tastele. Iata cateva dintre acestea:

VK_0, VK_1, , VK_9 - codurile cifrelor 0, , 9;
VK_A, VK_B, , VK_Z - codurile literelor;
VK_F1, VK_F2, , VK_F24 - codurile tastelor functionale de la F1 la F24;
VK_ENTER - codul tastei ;
VK_SPACE - codul barei de spatiu.

Pentru a da o 'comanda rapida' se actioneaza simultan tasta sau tastele + si tasta specifica comenzii rapide respective, data ca parametru in constructorul clasei MenuShortcut.

Constructori:

public MenuShortcut(int key) - creaza o comanda rapida, care consta din actionarea simultana a tastei si a tastei cu codul key;
public MenuShortcut(int key, boolean useShiftModifier) - creaza o comanda rapida avand tasta specifica cu codul key; daca al doilea argument este true, comanda se da actionand simultan ++, iar daca este false, actionand +, unde este tasta cu codul key.

Metode:
Principalele metode ale clasei MenuShortcut sunt:

public int getKey() - intoarce codul tastei;
public boolean usesShiftModifier() - arata daca trebuie sau nu actionata tasta .

Exemplu:

In fisierul ComenziRapide.java este dat un exemplu de aplicatie in care se folosesc aceleasi meniuri cu cele din fisierul TestMenu.java, dar la care la articolele de meniu s-au adaugat si comenzi rapide (din clasa MenuShortcut), astfel incat comenzile respective pot fi date si de la tastatura. Astfel, in loc de a selecta cu mouseul optiunea Alpha din meniul 'Menu A' se poate da de la tastatura comanda Ctrl+A, adica se actioneaza simultan cele doua taste. Pentru a selecta optiunea Exit din acelasi meniu se da de la tastatura comanda Ctrl+Shift+X, deci se ctioneaza simultan cele trei taste. Toate comenzile rapide apar afisate in articolele de meniu in dreptul optiunilor respective.


Clasa CheckboxMenuItem
Instantele clasei CheckboxMenuItem sunt optiuni selectabile, care au aceeasi functionalitate ca si cele ale clasei Checkbox, dar sunt folosite ca articole de meniu. Pe ecran, in caseta articolului de menu respectiv, apar simbolul casetei de validare (comutatorului) si eticheta corespunzatoare. Daca se face click de mouse pe un astfel de articol de menu, se schimba starea acestuia din true (activat) in false (dezactivat) sau invers. Starea articolului de menu poate fi aflata prim metoda getState().Cand articolul de menu din clasa CheckboxItem este selectat, se genereaza un eveniment din clasa ItemEvent.
Constructori:

public CheckboxMenuItem() - creaza un articol de meniu validabil fara eticheta;
public CheckboxMenuItem(String label) - creaza un articol de meniu validabil cu eticheta label si cu starea initiala false (dezactivat);
public CheckboxMenuItem(String label, boolean state) - creaza un articol de meniu validabil cu eticheta si starea initiala date ca argumente.

Metode:
Dam aici principalele metode.

public void addItemListener(ItemListener il) - se adauga receptorul de evenimente il;
public void removeItemListener(ItemListener il) - se elimina receptorul de evenimente il;
public boolean getState() - intoarce starea articolului validabil;
public void setState(boolean state) - seteaza starea articolului validabil.

Exemplu:

In fisierul Validari.java este dat un exemplu de aplicatie cu meniuri care contin articole validabile, din clasa CheckboxMenuItem. Pentru tratarea articolelor generate de aceste articole, la clasa TratEven s-a adaugat interfata ItemListener, care contine metoda itemStateChanged(). In aceasta metoda, eticheta articolului validabil care a generat evenimentul e se obtine prin metoda e.getItem(), iar articolul insusi se obtine prin metoda e.getItemSelectable(). Cunoscand articolul, starea lui se obtine prin metoda getState(). La fiecare schimbare de stare a unui articol validabil, aplicatia afiseaza numele si noua stare a articolului respectiv.


Clasa PopupMenu si realizarea meniurilor de context
Instantele clasei PopupMenu sunt meniuri de context, care pot fi afisate dinamic intr-o pozitie specificata a oricarei componente, fara a fi cuprinse intr-o bara de meniu. Ele pot fi utilizate, totusi, intr-o bara de meniu, dar in acest caz ele se comporta la fel ca instantele clasei Menu.
Meniurile de context prezinta avantajul ca pot fi diferite pentru fiecare din componentele interfetei grafice, prezentand utilizatorului numai acele optiuni, care se refera la componenta respectiva. Particularitatea meniului de context este ca se poate atasa oricarei componente grafice (subclasa a clasei Component) prin metoda add().

Constructori:

public PopupMenu() - creaza un nou meniu de context fara nume;
public PopupMenu(String label) - creaza un nou meniu de context cu numele specificat.

Metode:
Fiind derivata din clasa Menu, clasa PopupMenu mosteneste metodele acesteia. In plus, ea contine metoda

public void show(Component origin, int x, int y) - se afiseaza meniul de context in punctul de coordonate (x,h) al componentei origin.

Exemplul 1:

In fisierul TestPopup.java este dat un exemplu de aplicatie in care se testeaza un meniu popup care se activeaza daca se face click de mouse pe fereastra principala. Interfata grafica a aplicatiei este realizata prin clasa GUI, care contine si fereastra principala fp din clasa Frame. Meniul popup contine trei articole, dintre care doua din clasa MenuItem si unul din clasa CheckboxMenuItem. Pentru captarea si tratarea evenimentelor de tipurile WindowEvent, ActionEvent si ItemEvent se foloseste o instanta a clasei TratEven, iar pentru captarea evenimentelor de tip MouseEvent si afisarea meniului popup se foloseste clasa AfisareMenu.

Exemplul 2:

In fisierul TestPopup1.java este dat un exemplu de aplicatie in care in fereastra principala fp apar doua desene (pe componente din clase derivate din Canvas), cv1 si cv2. Se folosesc trei meniuri de context p1, p2 si p3 (din clasa PopupMenu), care sunt asociate respectiv cu componentele cv1, cv2 si cv3. In clasa AfisareMenu, care trateaza evenimentele de mouse (din clasa MouseEvent) s-a redefinit metoda mousePressed(). In aceasta metoda se detecteaza componenta pe care s-a produs apasarea butonului de mouse (folosind metoda e.getSource()) si se afiseaza meniul de context corespunzator componentei care a generat acest eveniment.In clasa TratEven, care implementeaza interfetele ActionListener si ItemListener, se trateaza evenimentele generate la actionarea diferitelor articole ale meniurilor.




Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1130
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved