Sunteți pe pagina 1din 41

AWT

Introducere, concepte ......................................................................................................................... 2


Componente.................................................................................................................................... 2
Evenimente ......................................................................................................................................... 7
Modelul vechi de evenimente Java .................................................................................................. 7
Identificarea intei ........................................................................................................................... 7
Tratarea evenimentelor ................................................................................................................... 8
Clasa Event .......................................................................................................................................... 8
Variabilele ....................................................................................................................................... 8
Constante ........................................................................................................................................ 9
Evenimente de fereastr................................................................................................................ 10
Evenimente de scroll...................................................................................................................... 11
Evenimente de focus ..................................................................................................................... 11
Metodele clasei Event.................................................................................................................... 12
Modelul nou de evenimente.............................................................................................................. 12
Clasa AWTEvent................................................................................................................................. 14
Variabile ........................................................................................................................................ 14
Constante ...................................................................................................................................... 14
Constructori ................................................................................................................................... 15
Metode.......................................................................................................................................... 15
Clasa AWTEventMulticaster ........................................................................................................... 16
Componente ..................................................................................................................................... 19
Clasa Component........................................................................................................................... 19
Evenimentele unei Component...................................................................................................... 24
Etichete ............................................................................................................................................. 25
Constante ...................................................................................................................................... 25
Metode.......................................................................................................................................... 26
Butoane............................................................................................................................................. 26
Metode.......................................................................................................................................... 26
Clasa Canvas ...................................................................................................................................... 28
Clasa Cursor....................................................................................................................................... 29
TextComponent................................................................................................................................. 30
Clasa Container.................................................................................................................................. 33
Container....................................................................................................................................... 33
Panel ................................................................................................................................................. 38
Window............................................................................................................................................. 40

Introducere, concepte
Librria AWT (Abstract Window Toolkit) ofer o interfa grafic pentru programele Java.
Aceast librrie ofer unelte folosite pentru comunicarea program utilizator.
Problema acestei librrii este c Java 1.0.2 a fost nlocuit de versiuni ca 1.1 i 1.2, versiuni ce au
introdus alte caracteristici. De foarte muli ani, programatorii au trecut prin mari bti de cap n
ncercrile de a porta un program scris pentru sisteme Unix, Linux pe sistem Windows sau Macintosh. n
1995, Sun anuna o posibil soluie: Java. Pentru sisteme de operare bazate pe ferestre, portabilitatea
era o problem. Cnd transferm un program scris pentru Windows pe sisteme Macintosh, codul care
trateaz lucrul cu interfaa grafic trebuie rescris complet. n Java ns, acest neajuns cauzat de
portabilitate, este rezolvat parial prin AWT. Prin aceast librrie, programele se pot rula n aceeai
manier n orice sistem de operare, ele vor arata la fel. De exemplu dac aplicaia folosete liste de tip
Combobox, acestea vor arta ca o list de tip Windows, dac aplicaia ruleaz sub Windows, sau ca o
lista de Unix dac aplicaia ruleaz sub Unix.
n construcia acestei librarii exist cteva concepte de baz pe care le vom detalia n acest prim
capitol i anume: componente, membrii, aspect, recipient. n continuare vom vorbi mai pe larg despre
fiecare.
Componente
Interfeele cu utilizatorul sunt construite n jurul ideii de componente: dispozitive care
implementeaz o parte din interfee. ncepnd cu anii 80 aceste dispozitive au fost extinse, cele mai
cunoscute fiind: butoane, meniuri, ferestre, checkbox-uri, bare de scroll, etc. AWT conine un set de
astfel de componente, i n plus, o mainrie de creat componente personalizate. n continuare vom
prezenta componentele principale ale AWT fr a intra n detalii.
Text static
Clasa Label ofer un mod de a afia o linie de text pe ecran. Se poate controla fontul folosit
pentru text i culoarea. Mai jos este un exemplu de etichete desenate pe ecran:

Figura 10.1 instane de Label

Componente pentru introducere date


Java ofer cteva moduri de a permite utilizatorului de a introduce date ntr-o aplicaie.
Utilizatorul poate tipri informaia, sau o poate selecta dintr-o list de opiuni prestabilit.
Clasele TextField i TextArea
Exist dou componente pentru a putea introduce date de la tastatur: TextField pentru o singur linie i
TextArea pentru linii multiple. Aceast ofer i mijloace pentru diferite validri a textului introdus de
utilizator. n figura de mai jos sunt cteva exemple pentru aceste componente:

Figura 10.2 Elementele de text

Clasele CheckBox i CheckboxGroup


Componentele menionate ofer mecanisme pentru a permite utilizatorului s selecteze dintr-o
list de opiuni, una singur sau mai multe. Primul mecanism se numete Checkbox, i permite bifarea
unei opiuni. n partea stng a ferestrei se afl un astfel de element numit Dialog. Un clic pe aceast
csua marcheaz opiunea ca fiind true si se bifeaz. Un clic ulterior, deselecteaz opiunea marcnd-o
ca false.
Clasa CheckboxGroup nu este o component, ci ofer un mod de a grupa csuele de bifare ntro mulime n care opiunile se exclud mutual. Denumirea lor este de butoane radio.

Figura 10.3 Csue de opiuni

Clasa de listare de opiuni


Problema cu clasele Checkbox i CheckboxGroup este c atunci cnd listele sunt prea mari, si
opiunile sunt multe, nu exist loc pentru a plasa aceste butoane radio. n acest caz se folosesc
componentele Choice, care reprezint o list de mai multe elemente, din care se poate selecta doar unul
singur. n figura de mai jos este reprezentat un astfel de element.

Figura 10.4 Clasa Choice


Clasa List
Totui dac dorim sa afim integral elementele unei liste, i s oferim posibilitatea de a selecta
multiple elemente, avem la dispoziie clasa List. n figura de mai jos avem o astfel de component.

Figura 10.5 Clasa List


Meniuri
Interfeele moderne folosesc aceste elemente, ns n Java n aceast librrie, meniurile pot
apare doar ntr-un Frame. O clas Menu, este complex i comport multe pri: bare de meniu,
elemente de meniu, etc.
Clasa PopupMenu
Meniurile Pop-up sunt folosite n funcie de context, mai ales cnd mouse-ul se afl ntr-o
regiune a ferestrei. Mai jos sunt prezentate ambele tipuri de meniuri:

a)
b)
Figura 10.6 a) Meniuri b)Meniuri Pop-up

Declanatoare de evenimente
Java ofer dou componente a cror scop este de a declana aciuni pe ecran: Button i
Scrollbar. Ele permit utilizatorului s specifice momentul realizrii unei aciuni.
Clasa Scrollbar
ntr-un program gen Word sau ntr-un browser Web, atunci cnd o imagine sau text este prea
mare pentru a fi afiat n pagin, acest element permite deplasarea utilizatorului n diverse pri ale
ecranului. Atunci cnd se efectueaz click pe Scrollbar efectul este exact deplasare ntr-o anumit
direcie pentru a viziona coninutul paginii. n figura 10.7 este reprezentat acest element.

Figura 10.7 Scrollbar vertical i orizontal


Unele componente ca TextArea sau List conin deja aceste Scrollbar-uri pentru a diminua efortul
programatorului. Pentru alte elemente ca Panel sau Frame va trebui implementat de la zero
funcionalitatea pentru ScrollBar-uri.
Clasa Buton
Butonul este cel mai cunoscut element pentru declanarea unor evenimente i cel mai intuitiv.
Java permite si butoane cu imagini: ImageButton.
Clasa Canvas
Aceast clas reprezint o suprafa goal: nu are nici o vizualizare predefinit. Se pot folosi
Canvas pentru desenarea imaginilor, construirea componentelor personalizate, sau a supercomponentelor ce conin alte componente predefinite.

n continuare vom descrie n detaliu elementele amintite mai sus pentru a oferi o perspectiv
asupra librriei AWT.

Evenimente
Am descris n cursul anterior cteva evenimente, precum i conceptul din spatele acestui
mecanism. n cele ce urmeaz vom aprofunda aceste concepte.
Modelul vechi de evenimente Java
Modelul este destul de simplu: atunci cnd se recepioneaz un eveniment iniiat de utilizator,
sistemul genereaz o instan de tip Event i o transmite programului. Programul identific inta (de
exemplu componenta n care a avut loc evenimentul) i permite acelei componente s trateze
evenimentul. Dac inta nu poate trata evenimentul, se ncearc gsirea unei componente care va
putea.
Identificarea intei
Evenimentele au loc ntr-o clas Component. Programul decide care component va primi
evenimentul, pornind de la nivelul cel mai nalt. n exemplul ales, aciunea de a efectua click pe frame-ul
de mai jos, mai exact pe butonul Blood, va declana metoda deliverEvent() din cadrul acestei clase.
Procesul va continua pn cnd inta gsit este butonul Blood, buton ce nu mai conine alte
componente, aa c se va executa evenimentul aferent lui.

Figura 10.8 identificarea intei

Mai jos este prezentat ierarhia de apeluri a metodei deliverEvent, pn cnd evenimentul este livrat
intei.

Figura 10.9 Livrarea evenimentului

Tratarea evenimentelor
Odat ce metoda deliverEvent() identific inta, se va apela metoda handleEvent() a intei. Dac
inta nu are suprascris aceast metod, se apeleaz implementarea implicit motenit de la obiectul
Component motenit, i nu se ntmpl nimic. n continuare vom descrie ierarhia claselor ce se ocup de
evenimente.

Clasa Event
Atunci cnd apare sau este declanat un eveniment, este de responsabilitatea programatorului
s capteze acel eveniment. Se poate decide netratarea lui, aa c evenimentul va trece ca i cnd nu ar fi
avut loc. Atunci cnd se dorete transmiterea unui eveniment mai departe, sau tratarea lui, trebuie s
nelegem cum se comport un obiect de acest tip. nainte de a ncepe prezentarea acestei clase, trebuie
spus c ea a fost nlocuit de AWTEvent pe care o vom descrie imediat dup. Motivul pentru care o
descriem aici este mai mult informativ i pentru a putea face legtura cronologic i conceptual ntre
aceste dou moduri de a soluiona problema legat de evenimente.
Variabilele
Clasa Event conine multe variabile ce ofer informaie despre evenimentul ce are loc. Vom discuta
despre cteva.
public int clickCount

Acest membru al clasei Event, permite verificarea evenimentului de double-click. Cmpul este relevant
doar pentru evenimente de tip MOUSE_DOWN.
8

public Event evt

Acest cmp este folosit pentru a transmite evenimente, dup cum am vzut mai sus. Programul
poate trata evenimentul transmis, sau evenimentul poate fi trimis unui handler personalizat:
public boolean mouseDown (Event e, int x, int y)
{
System.out.println ("Coordinates: " + x + "-" + y);
if (e.evt != null)
postEvent (e.evt);
return true;
}
public int id

Acest cmp conine identificatorul evenimentului. Evenimentele generate de sistem au


constantele predefinite, i cteva dintre ele sunt:
WINDOW_DESTROY
MOUSE_ENTER
WINDOW_EXPOSE
MOUSE_EXIT
WINDOW_ICONIFY
MOUSE_DRAG
WINDOW_DEICONIFY SCROLL_LINE_UP
KEY_PRESS
SCROLL_LINE_DOWN
KEY_RELEASE
SCROLL_PAGE_UP
KEY_ACTION
SCROLL_PAGE_DOWN
KEY_ACTION_RELEASE
SCROLL_ABSOLUTE
MOUSE_DOWN
LIST_SELECT
MOUSE_UP
LIST_DESELECT
MOUSE_MOVE
ACTION_EVENT

public Object target

Cmpul target conine referina ctre un obiect care produce acest eveniment. De exemplu,
dac utilizatorul selecteaz un buton, butonul este inta evenimentului. Dac utilizatorul mic mouse-ul
pe un obiect Frame, atunci Frame este inta. Target va indica locul unde a avut loc evenimentul, i nu
neaprat componenta care trateaz evenimentul.
public long when

Aceast variabil conine durata unui eveniment exprimat n milisecunde. Codul transform o
valoare long a acestei variabile n tipul Date pentru a examina ulterior durata:
Date d = new Date (e.when);

Constante
9

Clasa Event conine nenumrate constante, unele pentru a desemna ce eveniment a avut loc,
altele pentru a ajuta la determinarea tastei apsate.
Constantele ce se refer la taste se mpart n dou, dup tipul de eveniment ce este generat:
KEY_ACTION - i se numesc taste pentru aciune
KEY_PRESS se desemneaz alfanumericele.
n tabelul de mai jos sunt prezentate cteva constante i tipul de eveniment care folosete aceste
constante:
Constanta Tip eveniment
Constanta Tip eveniment
HOME KEY_ACTION
END KEY_ACTION
PGUP KEY_ACTION
PGDN KEY_ACTION
UP KEY_ACTION
DOWN KEY_ACTION
LEFT KEY_ACTION
RIGHT KEY_ACTION
F1 KEY_ACTION
F2 KEY_ACTION
F3 KEY_ACTION
F4 KEY_ACTION
F5 KEY_ACTION
F6 KEY_ACTION
F7 KEY_ACTION

F9 KEY_ACTION
F10 KEY_ACTION
F11 KEY_ACTION
F12 KEY_ACTION
PRINT_SCREEN KEY_ACTION
SCROLL_LOCK KEY_ACTION
CAPS_LOCK KEY_ACTION
NUM_LOCK KEY_ACTION
PAUSE KEY_ACTION
INSERT KEY_ACTION
ENTER (\n) KEY_PRESS
BACK_SPACE (\b) KEY_PRESS
TAB (\t) KEY_PRESS
ESCAPE KEY_PRESS
DELETE KEY_PRESS

Exist i modificatori pentru tastele Shift, Alt, Control. Atunci cnd utilizatorul apas o tast sau
genereaz alt tip de eveniment, se poate verifica dac a fost apsat simultan i una din tastele mai sus
menionate. Pentru aceasta avem la dispoziie modificatorii:
public static final int ALT_MASK
public static final int CTRL_MASK
public static final int SHIFT_MASK

Atunci cnd raporteaz un eveniment, sistemul seteaz cmpul modifiers ce poate fi verificat ulterior.
Evenimente de fereastr
Aceste evenimente au loc pentru componentele ce aparin unui Window. Cteva din aceste
evenimente sunt valabile doar pentru anumite platforme OS.
public static final int WINDOW_DESTROY

Acest eveniment este produs cnd sistemul spune unei ferestre s se autodistrug. Aceasta
intervine de obicei cnd utilizatorul selecteaz Close sau Quit. Implicit, instanele Frame nu trateaz
acest eveniment.

10

public static final int WINDOW_EXPOSE

Acest eveniment este transmis atunci cnd o parte a ferestrei devine vizibil. Pentru a afla ce
parte a ferestrei a fost descoperit, se poate folosi getClipRect(), metod ce aparine instana clasei
Graphics.
Evenimente de scroll
Aceste evenimente sunt declanate de aciunea utilizatorului pe o component de tip Scrollbar.
Obiectele ce au un Scrollbar construit implicit (List, TextArea) nu genereaz aceste evenimente.
Evenimentele pot fi tratate n metoda handleEvent() din cadrul Container-ului sau a unei subclase
Scrollbar.
public static final int SCROLL_LINE_UP

Aceast constant este transmis unui eveniment care are loc atunci cnd utilizatorul apas
sgeata de sus a unui scrollbar vertical sau pe sgeata din stnga a unui scrollbar orizontal.
public static final int SCROLL_LINE_DOWN

Aceast constant este setat unui eveniment care are loc atunci cnd utilizatorul apas sgeata
de jos a unui scrollbar vertical sau pe sgeata din dreapta a unui scrollbar orizontal.
public static final int SCROLL_PAGE_UP

Aceast constant este setat unui eveniment care are loc atunci cnd utilizatorul apas lng
sgeata de sus a unui scrollbar vertical sau lng sgeata din stnga a unui scrollbar orizontal, cauznd
deplasarea unei pagini ntregi n acea direcie.
public static final int SCROLL_PAGE_DOWN

Aceast constant este setat unui eveniment care are loc atunci cnd utilizatorul apas lng
sgeata de jos a unui scrollbar vertical sau lng sgeata din dreapta a unui scrollbar orizontal, cauznd
deplasarea unei pagini ntregi n acea direcie.
Evenimente de focus
public static final int GOT_FOCUS

Acest eveniment apare cnd o anumit component este selectat. Metoda


FocusListener.focusGained() poate fi folosit pentru tratarea acestui eveniment.
public static final int LOST_FOCUS

11

Acest eveniment apare cnd o anumit component este selectat. Metoda


FocusListener.focusLost() poate fi folosit pentru tratarea acestui eveniment.
Metodele clasei Event
De obicei evenimentele vor fi declanate de contextul exterior (apsarea unui buton, a unei
taste, etc). totui dac ne crem propriile componente, sau dorim s comunicm ntre thread-uri, atunci
va trebui s ne crem propriile noastre evenimente. Clasa Event are o serie de constructori i anume:
public Event (Object target, long when, int id, int x, int y, int key,
int modifiers, Object arg)

Primul constructor este i cel mai complet, i iniializeaz toate cmpurile obiectului cu
parametrii specificai. Ceilali doi constructori vor omite cteva iniializri dupa cum urmeaz:
public Event (Object target, long when, int id, int x, int y, int key, int
modifiers)
public Event (Object target, int id, Object arg)

Metode specifice modificatorilor


Aceste metode servesc la verificarea valorilor mtilor modificatorilor.
public boolean shiftDown ()

Metoda shiftDown() returneaz true dac tasta Shift a fost apsat sau false n caz contrar.
Metode asemntoare exist i pentru celelalte taste i anume Ctrl sau Alt.

Modelul nou de evenimente


Dei pare mai complex (modelul este format din mai multe pri) este mai simplu i mai eficient.
Acest model solicit obiectelor s se aboneze pentru a primi evenimente. Acest model se numete
delegare i implementeaz modelul Observer-Observable descris n cursul anterior. Relund, fiecare
component este o surs de evenimente ce poate genera diverse tipuri de evenimente, care sunt de
fapt, subclase a clasei AWTEvent. Obiectele interesate de un eveniment se numesc asculttori. Fiecare
tip de eveniment corespunde unei interfee de ascultare ce specific metodele care sunt apelate atunci
cnd un eveniment are loc.
Ierarhia de evenimente i clasele cu rol de asculttori pentru acestea, este reprezentat n figura
de mai jos:

12

Figura 10.10 Modelul AWTEvent

13

Unele interfee de asculttori sunt construite astfel nct s trateze mai multe evenimente. De
exemplu, interfaa MouseInterface declar cinci metode pentru a trata diverse evenimente de mouse.
Aceasta nseamn c un obiect interesat de evenimente de mouse trebuie s implementeze interfaa
MouseListener i va trebui s implementeze toate cele cinci metode.
Ce se ntmpl dac dorim s tratm doar un eveniment de mouse? Suntem obligai s scriem
cod de patru ori in plus? Din fericire pachetul java.awt.event include clase adapter, ce sunt scurtturi ce
permit scrierea facil a acestor handler-e de evenimente. Clasa adapter ofer implementri nule a
tuturor metodelor interfeei. De exemplu MouseAdapter ofer implementri implicite alea metodelor
mouseEntered(), mouseExisted(), etc. Putem astfel s ne concentrm pe metoda care ne intereseaz la
un moment dat i anume mouseClicked().

Clasa AWTEvent
Variabile
protected int id

Cmpul id al clasei AWTEvent este accesibil prin intermediul getID(). Este identificatorul tipului
de eveniment, ca de exemplu ACTION_PERFORMED al evenimentului ActionEvent sau MOUSE_MOVE.
Constante
Constantele clasei AWTEvent sunt folosite pentru a determina ce tip de tratare de eveniment va
fi folosit i ce eveniment este procesat. Mai jos este o list cu acestea:
public final static long ACTION_EVENT_MASK
public final static long ADJUSTMENT_EVENT_MASK
public final static long COMPONENT_EVENT_MASK
public final static long CONTAINER_EVENT_MASK
public final static long FOCUS_EVENT_MASK
public final static long ITEM_EVENT_MASK
public final static long KEY_EVENT_MASK
public final static long MOUSE_EVENT_MASK
public final static long MOUSE_MOTION_EVENT_MASK
public final static long TEXT_EVENT_MASK
public final static long WINDOW_EVENT_MASK
Aceste constante sunt folosite n corelaie cu metoda Component.eventEnabled().

14

Constructori
Clasa AWTEvent este abstract, constructorii nu pot fi folosii imediat. Ei sunt apelai la instanierea unei
clase copil.
public AWTEvent(Event event)
public AWTEvent(Object source, int id)

Primul constructor creeaz un eveniment de tip AWTEvent folosindu-se de unul din versiunea veche
Java. Al doilea creeaz un AWTEvent folosind o surs dat. Parametrul id folosete ca identificator al
tipului de eveniment.
Metode
protected void consume()

Metoda consume()este apelat pentru a meniona faptul c un eveniment a fost tratat. Un


eveniment care a fost marcat astfel, este livrat mai departe celorlali asculttori daca este cazul. Doar
evenimentele de tastatur i mouse pot fi marcate ca i consumate. Un scenariu de folosire a acestei
faciliti este atunci cnd dorim s refuzm introducerea anumitor caractere, practic acele caractere nu
sunt afiate.
protected boolean isConsumed()

Metoda returneaz faptul c un eveniment a fost sau nu consumat.


Exist o serie de alte clase de tratare a evenimentelor, iar acestea sunt specifice tipului de
control GUI la care se refer evenimentul. Iat o list a acestor clase:
Clasa
Descriere
ComponentEvent
Reprezint evenimentul ce are loc n cadrul unui Component
ContainerEvent
Include evenimentele ce rezult din operaii dintr-un Container
FocusEvent
Conine evenimentele ce sunt generate la primirea/pierderea focusului
WindowEvent
Se ocup de evenimentele specifice unei ferestre
PaintEvent
ncapsuleaz evenimentele specifice aciunii de desenare. Aici este un caz
special deoarece nu exist clasa PaintListener. Se vor folosi totui metodele
paint() i update() pentru a procesa evenimentele.
InputEvent
Este clasa abstract de baz, pentru tratarea evenimentelor de tastatur i
mouse
KeyEvent
Se ocup de evenimentele de tastatur
MouseEvent
Se ocup de evenimentele de mouse
ActionEvent
Este prima clas din ierarhia acestor clase. ncapsuleaz evenimentele care
semnaleaz faptul c utilizatorul realizeaz o aciune asupra unei componente.
AdjustmentEvent
Este alt clas din ierarhia claselor de evenimente. ncapsuleaz evenimente
care reprezint micrile unui scrollbar.
15

ItemEvent
TextEvent

Este clasa ce permite tratarea evenimentelor ce au loc atunci cnd utilizatorul


Selecteaz un checkbox sau un buton radio etc.
ncapsuleaz evenimentele ce au loc atunci cnd coninutul unui
TextComponent s-a schimbat.

Pentru toate aceste elemente descrise exist interfee de asculttori i clase adaptori.
De exemplu pentru clasa ActionEvent exist interfaa ActionListener ce conine metode pentru tratarea
evenimentelor de acest tip.
Pentru clasa ComponentEvent exist interfaa ComponentListener ce conine patru metode
pentru mutarea i redimensionarea componentei. Clasa ComponentAdapter este adaptorul
corespunztor, folosit mai ales cnd se dorete ascultarea unui eveniment specific.
Clasa AWTEventMulticaster
Aceasta este folosit de AWT pentru a trata cozile de asculttori pentru diverse evenimente, i
pentru a trimite evenimente tuturor asculttorilor interesai (multicasting). Iat cum se folosete
aceast clas:
public static ActionListener add(ActionListener first, ActionListener
second)

Metoda de mai sus are doi parametrii de tip ActionListener i returneaz tot un
ActionListener. Acest obiect returnat este un multicaster ce conine doi asculttori. De asemenea

se poate construi un adevrat lan de asculttori astfel:

actionListenerChain=AWTEventMulticaster.add(actionListenerChain,
newActionListener);

Pentru a transmite un eveniment lanului de asculttori astfel format avem metoda


actionPerformed():
actionListenerChain.actionPerformed(new ActionEvent(...));

Evident exist metode pentru toate tipurile de evenimente, i acestea sunt:


public
public
public
public
public
public
public
public
public
public
public
public

void
void
void
void
void
void
void
void
void
void
void
void

actionPerformed(ActionEvent e)
adjustmentValueChanged(AdjustmentEvent e)
componentAdded(ContainerEvent e)
componentHidden(ComponentEvent e)
componentMoved(ComponentEvent e)
componentRemoved(ContainerEvent e)
componentResized(ComponentEvent e)
componentShown(ComponentEvent e)
focusGained(FocusEvent e)
focusLost(FocusEvent e)
itemStateChanged(ItemEvent e)
keyPressed(KeyEvent e)

16

public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public

void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void

keyReleased(KeyEvent e)
keyTyped(KeyEvent e)
mouseClicked(MouseEvent e)
mouseDragged(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
mouseMoved(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
textValueChanged(TextEvent e)
windowActivated(WindowEvent e)
windowClosed(WindowEvent e)
windowClosing(WindowEvent e)
windowDeactivated(WindowEvent e)
windowDeiconified(WindowEvent e)
windowIconified(WindowEvent e)
windowOpened(WindowEvent e)

Mai jos avem un exemplu de folosire a unui obiect de multicasting.


import java.awt.*;
import java.awt.event.*;
class ItemEventComponent extends Component implements ItemSelectable
{
boolean selected;
int i = 0;
ItemListener itemListener = null;
ItemEventComponent ()
{
enableEvents (AWTEvent.MOUSE_EVENT_MASK);
}
public Object[] getSelectedObjects()
{
Object o[] = new Object[1];
o[0] = new Integer (i);
return o;
}
public void addItemListener (ItemListener l)
{
itemListener = AWTEventMulticaster.add (itemListener, l);
}
public void removeItemListener (ItemListener l)
{
itemListener = AWTEventMulticaster.remove (itemListener, l);
}
public void processEvent (AWTEvent e)
{

17

if (e.getID() == MouseEvent.MOUSE_PRESSED)
{
if (itemListener != null)
{
selected = !selected;
i++;
itemListener.itemStateChanged (
new ItemEvent (this, ItemEvent.ITEM_STATE_CHANGED,
getSelectedObjects(),
(selected?ItemEvent.SELECTED:ItemEvent.DESELECTED)));
}
}
}
}
public class Multicasting extends Frame implements ItemListener
{
Multicasting ()
{
super ("Listening In");
ItemEventComponent c = new ItemEventComponent ();
add (c, "Center");
c.addItemListener (this);
c.setBackground (SystemColor.control);
setSize (200, 200);
}
public void itemStateChanged (ItemEvent e)
{
Object[] o = e.getItemSelectable().getSelectedObjects();
Integer i = (Integer)o[0];
System.out.println (i);
}
public static void main (String args[])
{
Multicasting f = new Multicasting();
f.show();
}
}

n acest exemplu se prezint modul de a folosi AWTEventMulticaster pentru a crea


componente ce genereaz evenimente de tip ItemEvent. Clasa AWTEventMulticaster este folosit
pentru a crea un obiect multicast prin metoda AWTEventMulticaster.add(). Metoda
itemStateChanged() notific pe oricine este interesat. Evenimentul de tip item este generat la
apsarea butonului de mouse. Din moment ce nu avem asculttori pentru mouse, trebuie s apelm
metoda enableEvents pentru mouse.

18

Componente
n continuare vom prezenta clasa Component, mpreun cu unele componente specifice cum ar fi Label,
Button i Canvas. De asemenea vom arunca o privire i asupra clasei Cursor.
Clasa Component
Fiecare aplicaie cu interfa grafic const dintr-un set de obiecte. Aceste obiecte sunt de tip
Component, iar cele mai frecvent derivate din aceast clas, sunt butoanele, cmpurile de text i
container-ele.
Constante
Acestea sunt folosite pentru a specifica cum ar trebui aliniat componenta curent:
public
public
public
public
public

static
static
static
static
static

final
final
final
final
final

float
float
float
float
float

BOTTOM_ALIGNMENT
CENTER_ALIGNMENT
LEFT_ALIGNMENT
RIGHT_ALIGNMENT
TOP_ALIGNMENT

Metode
protected Component()

Constructorul este declarat protected deoarece clasa Component este abstract.


Constructorul permite crearea unei componente fr un tip anume (buton, text etc).
public Toolkit getToolkit ()

Metoda returneaz Toolkit-ul actual al componentei. Prin acest Toolkit avem acces la
detaliile platformei curente (ca rezoluia, mrimea ecranului, sau fonturi disponibile).
public Color getForeground ()

Metoda returneaz culoarea de prim plan. Dac nu exist o culoare setat, se va lua culoarea
printelui componentei actuale. Dac nici printele nu are culoare de prim plan se returneaz null.
public void setForeground (Color c)

Metoda modific culoarea de prim plan prin parametrul de tip Color c.


public Color getBackground ()

19

public void setBackground (Color c)

Aceste dou metode realizeaz acelai lucru ca cele de mai sus, dar se refer la culoarea
fundalului.
public Font getFont ()
public synchronized void setFont (Font f)

Sunt metodele pentru preluarea/setarea fontului care va fi valabil pentru componenta curent.
public Graphics getGraphics ()

Metoda getGraphics preia contextul grafic al componentei. Cele mai multe componente nu
specific, corect acest context i vor arunca excepia InternalError la apelul acestei metode.
public Locale getLocale ()
public void setLocale (Locale l)

Aceste metode modific sau ajut la preluarea setrii Locale a componentei curente. Localizarea
este o parte dintr-un subiect al internaionalizrii programelor Java i nu l vom aborda acum.
public Cursor getCursor ()
public synchronized void setCursor (Cursor c)

Aceste dou metode preiau/modific informaiile legate de forma i dimensiunea mouse-ului.


public Point getLocation ()
public Point location ()

Aceste metode returneaz poziia curent a Component-ei, poziie relativ la printele acestei
structuri. Punctul returnat prin Point este colul stnga sus ce delimiteaz dreptunghiul componentei.
public void setLocation (int x, int y)
public void move (int x, int y)

Metodele au ca efect mutarea Component-ei n noua poziie (x,y). Coordonatele se refer la


colul stnga sus al dreptunghiului ce delimiteaz componenta i sunt relative la printele acesteia.
public
public
public
public

Dimension getSize ()
Dimension size ()
void setSize (int width, int height)
void resize (int width, int height)

Primele dou metode ajut la preluarea dimensiunii componentei, n timp ce urmtoarele dou,
seteaz noua dimensiune a componentei.
20

public float getAlignmentX ()


public float getAlignmentY ()

Aceste dou metode returneaz aliniamentul componentei referitor la axa X respectiv Y. acest
aliniament poate fi folosit ulterior de managerul de aspect pentru a poziiona componente relativ la
altele. Valoarea returnat este ntre 0 i 1, unde o valoare apropiat de 0 indic o apropiere de stnga n
timp ce o valoare apropiat de 1 indic o deplasare ctre dreapta.
public void doLayout ()
public void layout ()

Metodele cauzeaz validarea componentei curente.


public boolean contains (int x, int y)
public boolean inside (int x, int y)

Aceste dou metode verific dac, punctul de coordonate x i y se afl n cadrul dreptunghiului
ce delimiteaz componenta. Dac aceast component nu este rectangular, metoda acioneaz ca i
cnd ar fi delimitat de un dreptunghi.
public Component getComponentAt (int x, int y)
public Component locate (int x, int y)

Metodele folosesc contains pentru a verific dac x i y se afl n cadrul componentei. Dac
dac, metoda returneaz instana componentei. Dac nu, returneaz null.
public void paint (Graphics g)

Metoda permite afiarea diverselor lucruri n cadrul componentei. Se poate suprascrie,


asemenea cum am prezentat n cursul anterior pentru applet-uri.
public void repaint ()

Exist o serie de funcii de redesenare, care n principiu realizeaz acelai lucru: redesenarea
componentei ct mai repede cu putin.
public void print (Graphics g)

Apelul implicit al acestei metode este ctre paint. Dar se poate imprima coninutul unei
componente, dac parametrul Graphics implementeaz PrintGraphics.

21

Metode de vizualizare
Pachetul AWT conine de asemenea clasa abstract Image, care se ocup cu tratarea imaginilor,
provenite din diverse surse, cele mai ntlnite fiind fiierele de imagini.
Un mic exemplu pentru folosirea acestei clase, pentru ncrcarea unei imagini i afiarea ei se afl mai
jos:
import java.awt.*;
public class Imaging extends Frame
{
Image im;
Imaging ()
{
im = Toolkit.getDefaultToolkit().getImage ("c:\\1.jpg");
}
public void paint (Graphics g)
{
g.drawImage (im, 0, 0, 175, 225, this);
}
public boolean mouseDown (Event e, int x, int y)
{
im.flush();
repaint();
return true;
}
public static void main (String [] args)
{
Frame f = new Imaging();
f.setVisible(true);
}
}

Revenind la clasa Component, aceasta suport lucrul cu imagini prin intermediul clasei Image i
a ctorva funcii ce vor fi descrise n cele ce urmeaz.
public boolean imageUpdate (Image image, int infoflags, int x, int y, int
width, int height)

Aceast metod provine din interfaa java.awt.image.ImageObserver implementat de clasa


Component. Permite actualizarea asincron a interfeei pentru a primi notificri despre imaginea dat
de parametrul image. Aceast metod este necesar pentru c ncrcarea imaginii se face pe un thread
separat. Parametrii x,y specific poziia imaginii ncrcate, iar width i height specific dimensiunea
imaginii. Parametrul infoflags este o masc pe bii ce permite setarea diferitelor opiuni de update.
public Image createImage (int width, int height)

22

Metoda creeaz o imagine goal de mrime width i height. Imaginea returnat este o imagine
stocat n memorie. Dac nu poate fi creat, atunci apelul metodei returneaz null.
public boolean prepareImage (Image image, ImageObserver observer)

Metoda foreaz ncrcarea unei imagini, asincron, n alt thread. Obiectul observer este
componenta care va fi afiat de imaginea image la ncrcarea imaginii. Dac image a fost deja
ncrcat atunci funcia returneaz true. n caz contrar se returneaz false. Din moment de image este
ncrcat asincron, prepareImage returneaz imediat ce este apelat.
public int checkImage (Image image, ImageObserver observer)

Metoda returneaz statusul construciei unei reprezentri a imaginii, status raportat de


observer. Dac imaginea nu s-a ncrcat, atunci apelul metodei nu va produce acest lucru. Valoarea
returnat este dat de flag-urile obiectului observer n SAU logic valabile pentru datele disponibile.
Acestea sunt: WIDTH, HEIGHT, PROPERTIES, SOMEBITS, FRAMEBITS, ALLBITS, ERROR, i ABORT.
public void addNotify ()

Metoda este suprascris de fiecare component n parte. Atunci cnd este apelat componenta
este invalidat. Metoda este apelat de sistem la crearea componentei, sau atunci cnd componenta
este adugat la un Container i acesta era deja afiat.
public synchronized void removeNotify ()

Metoda distruge coninutul componentei i o va terge de pe ecran. Informaia despre statusul


componentei este reinut ntr-un subtip specific.
public void setVisible(boolean condition)
public void show (boolean condition)

Cele dou metode, din care ultima este invechit, afieaz pe ecran componenta (n cazul
metodei setVisible doar dac variabila boolean este setat pe true). Printele Container, trece n
starea invalid, deoarece cel puin un copil a modificat aspectul.
public void hide ()

Metoda ascunde componenta i are acelai efect ca i metoda setVisible apelat cu


parametru false.
public synchronized void enable ()
public synchronized void disable ()
public void setEnabled (boolean condition)

Metodele stabilesc dac utilizatorul poate accesa/interaciona cu aceste componente sau nu.
23

public void requestFocus ()

Aceast metod permite iniializarea unei cereri ca i componenta s recepioneze focus.


public boolean isFocusTraversable()

Aceast metod verific dac acea component este capabil de a recepiona focus sau nu.
public void nextFocus ()

Metoda permite transferarea focus-ului ctre urmtoarea component.


Evenimentele unei Component
O clas Component suport metodele nvechite de control al evenimentelor, discutate mai sus:
deliverEvent, postEvent i handleEvent, dar i metode noi de a posta noi evenimente ca:
public final void dispatchEvent(AWTEvent e)

Pe lng acestea exist o serie de funcii ce sunt nvechite cum ar fi keyUp, sau mouseDown ce pot fi
folosite pentru captarea evenimentelor de buton sau taste. Pentru tratarea evenimentelor aprute n
cadrul unui Component exist modelul delegat i o serie de funcii pentru nregistrarea sau
denregistrarea asculttorilor:
public
public
public
public
public
public
public
public
public
public

void
void
void
void
void
void
void
void
void
void

addComponentListener(ComponentListener listener)
removeComponentListener(ComponentListener listener)
addFocusListener(FocusListener listener)
removeFocusListener(FocusListener listener)
addKeyListener(KeyListener listener)
removeKeyListener(KeyListener listener)
addMouseListener(MouseListener listener)
removeMouseListener(MouseListener listener)
addMouseMotionListener(MouseMotionListener listener)
removeMouseMotionListener(MouseMotionListener listener)

Pentru a putea trata evenimentele (asta dac nu dorim neaprat nregistrarea la un anumit
eveniment) trebuie s permitem captarea acestora. Aceasta se realizeaz prin funcia:
protected final void enableEvents(long eventsToEnable)

Clasa AWTEvent permite definirea unor constant ce permit verificarea tipului de eveniment ce a
avut loc. Tipul evenimentului este dat de variabila eventsToEnable.
protected final void disableEvents(long eventsToDisable)

24

Aceast metod permite oprirea recepionrii unor evenimente pentru componenta curent.
protected void processEvent(AWTEvent e)

Metoda primete toate evenimentele AWTEvent ce au ca int componenta curent. Aceste


evenimente vor fi transmise celorlalte metode specifice, pentru o procesare ulterioar. Atunci cnd se
suprascrie metoda processEvent, este posibil procesarea evenimentelor fr a nregistra asculttori.
protected void processComponentEvent(ComponentEvent e)

Aceast metod primete un eveniment de tipul ComponentEvent ce are drept int


componenta actual. Dac sunt abonai asculttori, acetia sunt notificai. Suprascrierea metodei
processComponentEvent este echivalent cu redimensionarea componentei.
protected void processFocusEvent(FocusEvent e)

Metoda este apelat atunci cnd componenta primete focus. Suprascrierea acestei metode
este echivalent cu suprascrierea metodelor gotFocus() sau lostFocus().
protected void processKeyEvent(KeyEvent e)

Metoda primete un eveniment de tastatur, ce are ca int componenta curent. n caz de


suprascriere, dac dorim ca procesarea s decurg normal trebuie apelat i metoda
super.processKeyEvent(e),altfel evenimentele nu vor ajunge la asculttorii nregistrai.
Suprascrierea metodei este similar metodelor keyDown() sau keyUp() din modelul vechi.

protected void processMouseEvent(MouseEvent e)

Aceast metod este similar cu cea anterioar cu specificaia c se ocup cu evenimente de


mouse.

Etichete
O etichet, este reprezentat de clasa Label, ce deriv din Component i afieaz o linie de text. Este
folosit mai ales la stabilirea unor titluri sau a ataa text altei componente.
Constante
public final static int LEFT
public final static int CENTER
public final static int RIGHT

25

Acestea ofer aliniamentul textului din etichet.


Metode
public Label ()
public Label (String label)
public Label (String label, int alignment)

Acetia sunt constructorii acestei clase, prin care se permite instanierea unei etichete, i
specificarea textului afiat label sau a aliniamentului.
public String getText ()
public void setText (String label)

Aceste metode permit preluarea textului etichetei respectiv setarea acestuia.


public int getAlignment ()
public void setAlignment (int alignment)

Aceste dou metode permit preluarea/specificarea aliniamentului unei etichete. Dac


aliniamentul nu este valid, metoda de setare va arunca o excepie de tip IllegalArgumentException.
Clasa Label poate reaciona la evenimentele pe care le recepioneaz, dei nu este scopul ei.

Butoane
Clasa Button deriv de asemenea din Component i se folosete pentru declanarea unor aciuni.
Metode
public Button ()
public Button (String label)

Acetia sunt constructorii, ultimul permind crearea unui buton a crui text este label.
public String getLabel ()
public synchronized void setLabel (String label)

Aceste dou metode permit preluarea/specificarea textului afiat pe un buton.


public String getActionCommand ()
public void setActionCommand (String command)

26

Fiecare buton poate avea dou nume. Unul este ceea ce vede utilizatorul i cellalt este folosit
de programator i se numete comanda butonului. Aceasta a fost introdus pentru internaionalizarea
programelor. De exemplu daca eticheta butonului conine Yes ns programul ruleaz pe sistem francez
sau german, eticheta va afia Oui sau Ja. Oricare ar fi sistemul pe care ruleaz comanda butonului poate
rmne Yes.
public synchronized void addNotify ()

Metoda permite adugarea butonului ca i component, permind-ui acestuia s i schimbe


aspectul pstrnd funcionalitatea.
Evenimentele unui buton sunt cele de mouse, de focus de tastatur practic cele prezentate mai
sus n clasa Component.
Pentru a nelege mai bine evenimentele i diferena ntre numele comenzii i numele afiat
avem urmtorul cod:
import java.applet.*;
import java.awt.event.*;
import java.awt.*;
public class Buton extends Applet implements ActionListener
{
Button b;
public void init ()
{
add (b = new Button ("One"));
b.addActionListener (this);
add (b = new Button ("Two"));
b.addActionListener (this);
add (b = new Button ());
b.setLabel("Drei");
b.setActionCommand("Three");
b.addActionListener (this);
add (b = new Button ());
b.setLabel("Quatre");
b.setActionCommand("Four");
b.addActionListener (this);
}
public void actionPerformed (ActionEvent e)
{
String s = e.getActionCommand();
if ("One".equals(s))
{
System.out.println ("Pressed One");
}else if ("Two".equals(s)) {
System.out.println ("Pressed Two");
} else if ("Three".equals(s))
{

27

System.out.println ("Pressed Three");


} else if ("Four".equals(s))
{
System.out.println ("Pressed Four");
}
}
}

Dei etichetele ultimelor butoane sunt altfel dect Four sau Three mesajul va fi afiat pentru c
se compar numele aciunii butonului.

Clasa Canvas
Aceasta este o clas pe servete ca suport pentru noi componente ce pot fi create pe lng cele
deja oferite de librria AWT. Canvas poate fi folosit i ca loc de a desena componente adiionale pe
ecran, sau folosind Graphics se pot desena pe un Canvas diverse figuri.
Cel mai bine este ca un obiect Canvas s stea n interiorul unui Container n cazul aplicaiilor mai
complexe. Mai jos este un exemplu de folosirea a aceste clase.
import java.awt.Canvas;
import java.awt.Graphics;
import java.applet.Applet;
public class CanvasTest extends Applet
{
public void init()
{
DrawingRegion region = new DrawingRegion();
add(region);
}
}
class DrawingRegion extends Canvas
{
public DrawingRegion()
{
setSize(100, 50);
}
public void paint(Graphics g)
{
g.drawRect(0, 0, 99, 49); // draw border
g.drawString("A Canvas", 20,20);
}
}

n cadrul acestui exemplu clasa DrawingRegion ce motenete Canvas este folosit n cadrul unui
Applet, mai exact adugat n cadrul ferestrei principale.
28

Clasa Cursor
Aceasta ofer diferite forme i dimensiuni pentru a reprezenta pointer-ul mouse-ului. Iat mai jos
constantele ce reprezint acele forme
public
public
public
public
public
public
public
public
public
public
public
public
public
public

final
final
final
final
final
final
final
final
final
final
final
final
final
final

static
static
static
static
static
static
static
static
static
static
static
static
static
static

int
int
int
int
int
int
int
int
int
int
int
int
int
int

DEFAULT_CURSOR
CROSSHAIR_CURSOR
TEXT_CURSOR
WAIT_CURSOR
HAND_CURSOR
MOVE_CURSOR
N_RESIZE_CURSOR
S_RESIZE_CURSOR
E_RESIZE_CURSOR
W_RESIZE_CURSOR
NE_RESIZE_CURSOR
NW_RESIZE_CURSOR
SE_RESIZE_CURSOR
SW_RESIZE_CURSOR

Metode

public int getType()

Metoda returneaz tipul cursorului i este egal ca valoare cu una din constantele clasei.
static public Cursor getPredefinedCursor(int type)

Metoda returneaz un cursor predefinit. Dac tipul nu este egal cu una din constante, metoda
arunc excepia IllegalArgumentException. Metoda verific dac obiectul de tip Cursor exist deja
i dac da returneaz referina la obiectul existent.
Iat un exemplu pentru utilizarea acestei componente:
import java.awt.*;
import java.awt.event.*;
public class CursorTest
{
public static void main(String[] args)
{
Frame f = new Frame("Change cursor");
Panel panel = new Panel();

29

Button comp1 = new Button("Ok");


Button comp2 = new Button("Cancel");
panel.add(comp1);
panel.add(comp2);
f.add(panel,BorderLayout.CENTER);
f.setSize(200,200);
f.setVisible(true);
Cursor cur = comp1.getCursor();
Cursor cur1 = comp2.getCursor();
comp1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
comp2.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
}

TextComponent
Exist dou moduri de a introduce date: de la tastatur sau prin micrile mouse-ului. Pentru
introducerea de caractere exist dou clase TextField i TextArea. Acestea fac parte din clasa printe
TextComponent.
public String getText ()
public void setText (String text)

Metodele ajut la preluarea/modificarea textului din cadrul acestei componente. Dac este
vorba de o component de tip TextArea, atunci sunt permise i caracterele \n astfel c textul va apare
pe mai multe linii.
Utilizatorii pot selecta textul din cadrul acestei componente folosind mouse-ul sau tastatura.
Pentru a lucra cu textul selectat avem urmtoarele funcii:
public int getSelectionStart ()

Metoda returneaz poziia iniial a textului selectat. Poziia poate fi considerat numrul de
caractere ce preced primul caracter selectat. Dac nu este selectat text, se returneaz poziia
cursorului. Valoarea de start de la nceputul textului este 0.
public int getSelectionEnd ()

30

Aceast metod returneaz poziia cursorului ce indic sfritul seleciei curente. Dac nu este
selectat nimic atunci se va returna poziia curent a cursorului.
public String getSelectedText ()

Aceast metod returneaz textul selectat sub forma unui String, sau null dac nu este nimic
selectat.
public void setSelectionStart (int position)
public void setSelectionEnd (int position)

Aceste dou metode modific selecia actuala a textului dup parametrul position.
public void setEditable (boolean state)
public boolean isEditable ()

Aceste metode sunt pentru a activa sau dezactiva un TextComponent. Mai jos este un exemplu
pentru a demonstra folosirea acestor clase:
import java.awt.*;
import java.applet.*;
public class TestText extends Applet
{
TextArea area;
Label label;
public void init () {
setLayout (new BorderLayout (10, 10));
add ("South", new Button ("toggleState"));
add ("Center", area = new TextArea ("Area to write", 5, 10));
add ("North", label = new Label ("Editable", Label.CENTER));
}
public boolean action (Event e, Object o)
{
if (e.target instanceof Button)
{
if ("toggleState".equals(o))
{
area.setEditable (!area.isEditable ());
label.setText ((area.isEditable () ? "Editable" : "Readonly"));
return true;
}
}
return false;
}
}

31

Pe lng evenimentele cunoscute se poate trata modificarea textului componentei folosind urmtoarea
funcie:
public synchronized void addTextListener(TextListener listener)

Aceast metod permite nregistrarea obiectului listener pentru a primi notificri atunci cnd
are loc un eveniment de tip TextEvent. Metoda listener.textValueChanged() este apelat atunci cnd
aceste evenimente au loc. Mai jos este un exemplu pentru folosirea acestora:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class TextFieldSetter implements ActionListener
{
TextField tf;
TextFieldSetter (TextField tf)
{
this.tf = tf;
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals ("Set"))
{
tf.setText ("You Just Say Hello");
}
}
}
public class TextEvent1 extends Applet implements TextListener
{
TextField tf;
int i=0;
public void init ()
{
Button b;
tf = new TextField ("Hello", 20);
add (tf);
tf.addTextListener (this);
add (b = new Button ("Set"));
b.addActionListener (new TextFieldSetter (tf));
}
public void textValueChanged(TextEvent e)
{
System.out.println (++i + ": " + e);
}
}

32

Celelalte tipuri de componente, precum listele, checkbox-urile sau combobox-urile vor fi


abordate n cursul urmtor, urmnd ca acum s studiem cum se pot grupa aceste componente.

Clasa Container
Clasa Container este o subclas a Component, ce conine alte componente, inclusiv alte
recipiente. Container permite crearea de grupuri de obiecte ce apar pe ecran. n continuare vor fi atinse
cteva din aceste clase. Fiecare obiect Container are un o schi, o reprezentare ce permite organizarea
componentelor din acel recipient. Toate aceste aspecte vor fi detaliate mai trziu cnd vom vorbi despre
Layout.
Container
Container este o clas abstract ce ofer suport pentru alte obiecte de tip Component. Aceast
clas conine metode pentru a grupa elementele de tip Component i a trata evenimentele care apar n
cadrul ei. Deoarece este o clas abstract, nu poate fi instaniat un obiect de acest tip, de aceea ea
trebuie derivat i apoi utilizat.
Constructori
Constructorul clasei ce motenete Container permite instanierea unui obiect i asocierea unui
Layout i anume folosind un manager pentru aspect. Urmtorul cod exemplific acest lucru:
import java.awt.*;
public class LightweightPanel extends Container
{
LightweightPanel () {}
LightweightPanel (LayoutManager lm)
{
setLayout(lm);
}
}

Gruparea elementelor
Aceste metode descriu modul de lucru cu obiectele coninute de Container:
public int getComponentCount()
public int countComponents()

Metoda getComponentCount() returneaz numrul de componente din cadrul unui Container iar
countComponents() este o veche metod dintr-o versiune Java 1.0.
Pentru a prelua elementele dintr-un Container avem la dispoziie metodele:
33

public Component getComponent (int position)


public Component[] getComponents()

Prima metod returneaz o component cu un anumit index. Dac poziia este incorect va fi aruncat
urmtoarea excepie: ArrayIndexOutOfBoundsException.
A doua metod returneaz un ir ce conine toate componentele din Container-ul curent. Orice
modificare a oricrui element din acest ir va apare imediat pe ecran.
Adugarea elementelor
public Component add (Component component, int position)

Metoda add() adaug o component n Container, la o anumit poziie. Dac position este -1
inserarea va avea loc la sfrit. Dac position este incorect, metoda va arunca excepia
IllegalArgumentException. Dac se ncearc adugarea Container-ului curent la sine nsui metoda va
arunca aceeai excepie. Dac totul merge perfect, componenta este adugat n recipient, i metoda
returneaz obiectul Component adugat.
public Component add (Component component)

Aceast metod adaug un component ca ultim obiect al Container-ului . Aceasta se face prin apelul
metodei anterioare cu position egal cu -1.
public void add (Component component, Object constraints)

Aceast metod este necesar pentru situaiile n care avem componente Layout ce solicit
informaii n plus pentru a dispune componentele pe ecran. Informaia adiional este specificat prin
parametrul constraints. Parametrul constraints depinde de managerul de interfa:
LayoutManager. Poate fi folosit pentru a denumi Container-e din cadrul unui CardLayout, sau specifica
suprafaa unui BorderLayout, etc.
public Component add (String name, Component component)

Aceast metod permite folosirea metodei anterioare, n care String-ul folosit definete o
anumit constrngere. Apelarea aceste metode va genera un ContainerEvent cu id-ul
COMPONENT_ADDED. Acestea sunt cteva din metodele de adugare, ns mai sunt i altele care pot fi
folosite.
tergerea elementelor
public void remove (int index)

Metoda remove terge componenta de la poziia indicat de index. Metoda va apela


removeLayoutComponent() pentru a terge componenta din LayoutManager.
34

public void removeAll ()

Metoda va terge toate componentele din container. Atunci cnd este apelat, va genera un
ContainerEvent cu id-ul COMPONENT_REMOVED.
Alte medode
public boolean isAncestorOf(Component component)

Metoda verific faptul c component este printe a acestui Container. Va returna true n caz
afirmativ, altfel va returna false.
Metode de Layout
Fiecare container are un LayoutManager. Acesta este responsabil cu poziionarea componentelor n
cadrul container-ului. Metodele listate sunt folosite pentru a dimensiona obiectele din Container.
public LayoutManager getLayout ()

Aceast metod va returna obiectul LayoutManager asociat Container-ului curent.


public setLayout (LayoutManager lm)

Metoda schimb obiectul LayoutManager al Container-ului curent i-l invalideaz.


Componentele din cadrul Container-ului vor fi re-dispuse dup regulile definite in obiectul lm. Dac
obiectul lm este null poziia componentelor din Container poate fi controlat de programator.
public Dimension getPreferredSize ()
public Dimension preferredSize ()

Aceste returneaz un obiect de tip Dimension ce conine mrimea preferat a componentelor


din Container. Container-ul poate determina mrimea preferat apelnd metoda preferredLayoutSize()
care va returna spaiul necesar managerului pentru a aranja componentele. A doua metod este vechea
funcie din Java 1.0 pentru preferredLayoutSize().
public Dimension getMinimumSize ()
public Dimension minimumSize ()
public Dimension getMaximumSize ()

Aceste metode returneaz obiectul de tip Dimension care va calcula minimul/maximul de


spaiu necesar (lime i lungime) pentru ca managerul de Layout s aranjeze componentele.

35

public float getAlignmentX ()


public float getAlignmentY ()

Aceste metode returneaz aliniamentul componentelor din cadrul Container-ului pe


componenta x respectiv y. Container-ul determin aliniamentul apelnd metoda getLayoutAlignmentX(),
respectiv getLayoutAlignmentY() din managerul de Layout actual. Valoarea returnat va fi ntre 0 i 1.
Valorile apropiate de 0 indic faptul c, componenta trebuie poziionat mai la stnga, iar cele apropiate
de 1 indic faptul c, componenta trebuie poziionat mai la dreapta n cazul metodei
getLayoutAlignmentX(). n cazul metodei getLayoutAlignmentY() 0 nseamn mai aproape de partea de
sus iar 1 mai aproape de partea de jos a suprafeei.
public void doLayout ()
public void layout ()

Aceste dou metode indic managerului de Layout s afieze Container-ul.


public void validate ()

Metoda seteaz starea de validitate a container-ului pe true i valideaz recursiv componentele


sale. Dac acesta mai conine un Container, atunci i acela va fi validat. Unele componente nu sunt
iniializate pn nu sunt validate. De exemplu, nu se pot interoga dimensiunile de afiare ale unui
Button, pn cnd acesta nu este validat.
public void invalidate ()

Metoda invalideaz Container-ul actual i componentele din cadrul su.


Evenimente
public void deliverEvent (Event e)

Aceast metod este apelat atunci cnd eveniment de tip Event are loc. Metoda ncearc s
localizeze o component din Container pentru a primi evenimentul aferent ei. Dac este gsit, atunci
coordonatele x i y sunt transmise noii inte, evenimentul e de tip Event este astfel livrat.
public Component getComponentAt (int x, int y)

Aceast metod apeleaz metoda contains() din cadrul fiecrei componente din Container
pentru a vedea dac, coordonatele x i y sunt n interiorul componentei. Dac da, acea component este
returnat. Dac nu se gsete nici o component care s respecte aceast cerin atunci obiectul
Container este returnat. Dac aceste coordonate sunt n afara Container-ului atunci se returneaz null.
public Component getComponentAt (Point p)

36

Aceast metod este identic cu cea anterioar, doar c locaia se specific printr-un obiect de
tip Point.
Asculttori
public synchronized void addContainerListener(ContainerListener listener)

Metoda nregistreaz un obiect listener interesat de a primi notificri atunci cnd un obiect
de tip ContainerEvent trece prin coada de evenimente la care Container-ul curent este abonat.
Atunci cnd aceste evenimente au loc, metodele listener.componentAdded() sau
listener.componentRemoved() sunt apelate. Evident c i ali asculttori pot fi de asemenea nregistrai.
n codul ce urmeaz a fi prezentat, este exemplificat folosirea unui ContainerListener pentru a
nregistra asculttori pentru toate butoanele adugate unui applet. Ceea ce face ca acest cod s
funcioneze, este apelul funciei enableEvents() care are ca efect livrarea evenimentelor n absena
asculttorilor.
/*
<applet code="UsingContainer" width=300 height=50>
</applet>
*/
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class UsingContainer extends Applet implements ActionListener
{
Button b;
public void init()
{
enableEvents (AWTEvent.CONTAINER_EVENT_MASK);
add (b = new Button ("One"));
add (b = new Button ("Two"));
add (b = new Button ("Three"));
add (b = new Button ("Four"));
}
protected void processContainerEvent (ContainerEvent e)
{
if (e.getID() == ContainerEvent.COMPONENT_ADDED)
{
if (e.getChild() instanceof Button)
{
Button b = (Button)e.getChild();
b.addActionListener (this);
}
}
}

37

public void actionPerformed (ActionEvent e)


{
System.out.println ("Selected: " + e.getActionCommand());
}
}

public void removeContainerListener(ContainerListener listener)

Aceast metod terge un listener, adic va face ca acel obiect s nu mai fie abonat. Dac
listener nu este nregistrat, nu se ntmpl nimic.
protected void processEvent(AWTEvent e)

Metoda processEvent()primete toate evenimentele AWTEvent ce au Container-ul curent


drept int. Metoda le va transmite tuturor asculttorilor abonai pentru procesarea ulterioar. Se poate
suprascrie aceast metod pentru a preprocesa evenimentele nainte de a le transmite mai departe.
protected void processContainerEvent(ContainerEvent e)

Metoda processContainerEvent,folosit n programul de mai sus, va primi toate


evenimentele de tip ContainerEvent ce au ca int Container-ul curent. Apoi, aceste evenimente se vor
transmite la orice asculttor pentru procesare ulterioar. Suprascrierea metodei permite preprocesarea
evenimentelor nainte ca acestea s fie retransmise.

Panel
Aceast clas ofer un Container generic pentru afiarea unei suprafee. Este cel mai simplu
dintre toate Container-ele, fiind doar o suprafa rectangular.
Constructorii acestei clase sunt:
public Panel ()
public Panel (LayoutManager layout)

Ultimul constructor permite setarea unui manager de aspect iniial i anume layout.
Evenimentele acestei clase sunt n concordan cu cele amintite la clasa Container, din moment
ce Panel motenete un Container.
Mai jos avem un exemplu simplu pentru a nelege aceast clas.
import java.awt.*;
import java.awt.event.*;
public class PanelTest extends Frame {

38

private
private
private
private

Button copyButton;
Button cutButton;
Button pasteButton;
Button exitButton;

public PanelTest() {
super("Test Panel");
setSize(450, 250);
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
Panel toolbarPanel = new Panel();
toolbarPanel.setBackground(new Color(20, 20, 10));
toolbarPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
copyButton = new Button("Copy");
toolbarPanel.add(copyButton);
cutButton = new Button("Cut");
toolbarPanel.add(cutButton);
pasteButton = new Button("Paste");
toolbarPanel.add(pasteButton);
add(toolbarPanel, BorderLayout.EAST);
// Bottom Panel
Panel bottomPanel = new Panel();
bottomPanel.setBackground(new Color(100, 120, 10));
exitButton = new Button("Exit");
bottomPanel.add(exitButton);
add(bottomPanel, BorderLayout.SOUTH);
}
public static void main(String[] args) {
PanelTest mainFrame = new PanelTest();
mainFrame.setVisible(true);
}
}

De remarcat faptul c Panel-ul nu comport limitatori de margine, aa c diferenierea vizual sa fcut prin culoarea de fundal.

39

Window
Un Window este o suprafa de afiare de top n afara unui browser sau a unui applet. Frame
este o subclas a Window ce conine limite, bara de titlu, etc. n mod normal Window se folosete
pentru a permite crearea meniurilor pop-up sau a altor componente ce necesit acest spaiu. Clasa are o
serie de metode ce influeneaz aparena ferestrei reprezentate.
public Window (Frame parent)

Este constructorul ce poate specifica printele ferestrei, adic n cadrul crei ferestre va activa
aceast fereastr. Atunci cnd printele este minimizat, acelai lucru se ntmpl cu copilul.
public void show ()

Metoda show afieaz fereastra. Atunci cnd fereastra este creat, ea este implicit ascuns.
Pentru a aduce n prim plan fereastra, se poate apela metoda toFront().
public void dispose ()

Aceast metod dealoc resursele ferestrei, ascunznd-o i apoi elibernd memoria. Se va


genera un eveniment WindowEvent cu id-ul WINDOW_CLOSED.
public void toFront ()
public void toBack ()

Cele dou metode aduc fereastra n prim plan respectiv n fundal.


public Toolkit getToolkit ()

Metoda returneaz Toolkit-ul curent al ferestrei, adic obiectul ce ofer informaii despre
platforma pe ca ruleaz programul. Aceasta va permite redimensionarea ferestrei sau alegerea de
imagini pentru aplicatie, etc.
Metodele pentru captarea sau denregistrarea de la evenimentele unei ferestre sunt:
public void addWindowListener(WindowListener listener)
public void removeWindowListener(WindowListener listener)

De asemenea pentru a procesa evenimentele legate de o fereastr avem:


protected void processEvent(AWTEvent e)
protected void processWindowEvent(WindowEvent e)

Pentru a exemplifica conceptele mai sus menionate avem urmtorul program:

40

import java.awt.*;
public class WindowTest extends Frame
{
Window w = new PopupWindow (this);
WindowTest ()
{
super ("Window Example");
resize (250, 100);
show();
}
public static void main (String args[])
{
Frame f = new WindowTest ();
}
public boolean mouseDown (Event e, int x, int y)
{
if (e.modifiers == Event.META_MASK)
{
w.move (location().x+x, location().y+y);
w.show();
return true;
}
return false;
}
}
class PopupWindow extends Window
{
PopupWindow (Frame f)
{
super (f);
Panel p = new Panel ();
p.add (new Button ("About"));
p.add (new Button ("Save"));
p.add (new Button ("Quit"));
add ("North", p);
setBackground (Color.gray);
pack();
}
public boolean action (Event e, Object o)
{
if ("About".equals (o))
System.out.println ("About");
else if ("Save".equals (o))
System.out.println ("Save Me");
else if ("Quit".equals (o))
System.exit (0);
//fereastra este acunsa la
//apasarea oricarui buton
hide();
return true;
}
}

41