CATEGORII DOCUMENTE |
Curs Java aplicatii |
|
Exemple simple de aplicatii cu interfata
grafica |
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 |
Vizualizari: 1116
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved