Documente Academic
Documente Profesional
Documente Cultură
Facultatea de tiine
Departamentul de Matematic i Informatic
Componente AWT
Componente Swing
Componentele AWT au peste 100 de metode comune, motenite din clasa Component. Acestea
servesc uzual pentru aflarea sau setarea atributelor obiectelor, cum ar fi: dimensiune, poziie,
culoare, font, etc. i au formatul general getProprietate, respectiv setProprietate. Cele mai folosite,
grupate pe tipul proprietii gestionate sunt:
Poziie
getLocation, getX, getY, getLocationOnScreen,
setLocation, setX, setY
Dimensiuni
getSize, getHeight, getWidth
setSize, setHeight, setWidth
Dimensiuni i poziie
getBounds
setBounds
Culoare
getForeground, getBackground
setForeground, setBackground
Font
getFont
setFont
Vizibilitate
setVisible
isVisible
Interactivitate
setEnabled
isEnabled
Componentele adugate sunt memorate ntr-o list iar poziiile lor din aceast list vor defini
ordinea de traversare front-to-back a acestora n cadrul containerului. Dac nu este specificat nici
un index la adugarea unei componente, atunci ea va fi adugat pe ultima poziie a listei.
Clasa Container conine metodele comune tuturor suprafeelor de afiare. Cele mai
folosite sunt:
add - permite adugarea unei componente pe suprafaa de afiare. O component nu poate
aparine dect unui singur container, ceea ce nseamn c pentru a muta un obiect dintr-un
container n altul trebuie eliminat mai nti de pe containerul iniial.
remove - elimin o component de pe container;
setLayout - stabilete gestionarul de poziionare al containerului;
getInsets - determin distana rezervat pentru marginile suprafeei de afiare;
validate - foreaz containerul s reaeze toate componentele sale. Aceast metod
trebuie apelat explicit atunci cnd se adaug sau se elimin componente pe suprafa de
afiare dup ce aceasta a devenit vizibil.
Frame f = new Frame("O fereastra");
// Adauga un buton direct pe fereastra
Button b = new Button("Hello");
f.add(b);
// Adauga doua componente pe un panel
Label et = new Label("Nume:");
TextField text = new TextField();
Panel panel = new Panel();
panel.add(et);
panel.add(text);
// Adauga panel-ul pe fereastra i, indirect, cele doua componente
f.add(panel);
Gestionarea poziionrii
Un gestionar de poziionare (layout manager) este un obiect care controleaz dimensiunea
i aranjarea (poziia) componentelor unui container. Aadar, modul de aranjare a componentelor pe
o suprafaa de afiare nu este o caracteristica a clasei Container. Fiecare obiect de tip
Container, sau o extensie a lui (Applet, Frame, Panel) are asociat un obiect care se ocupa
cu dispunerea componentelor pe suprafaa sa: gestionarul de poziionare. Toate clasele care
instaniaz obiecte pentru gestionarea poziionrii implementeaz interfaa LayoutManager. La
7
instanierea unui container se creeaz implicit un gestionar de poziionare asociat acestui container.
De exemplu pentru o fereastra (un obiect de tip Window sau o subclasa a sa) gestionarul implicit
este de tip BorderLayout, n timp ce pentru un container de tip Panel este o instan a clasei
FlowLayout.
FlowLayout
BorderLayout
GridLayout
CardLayout
Programele nu apeleaz n general metode ale gestionarilor de poziionare iar n cazul cnd
avem nevoie de obiectul gestionar l putem obine cu metoda getLayout din clasa Container.
Una din facilitile cele mai utile oferite de gestionarii de poziionare este rearanjarea
componentele unui container atunci cnd acesta este redimensionat. Poziiile i dimensiunile
componentelor nu sunt fixe, ele fiind ajustate automat de ctre gestionar la fiecare redimensionare
astfel nct sa ocupe ct mai estetic suprafaa de afiare.
Pentru situaii n care se dorete o amplasare a componentelor la anumite poziii fixe, iar
acestea s rmn acolo chiar dac se redimensioneaz containerul, se trimite argumentului null
metodei setLayout:
//pozitionare absoluta a componentelor in container
container.setLayout(null);
Gestionarul FlowLayout
Acest gestionar aeaz componentele pe suprafaa de afiare n flux liniar, mai precis,
componentele sunt adugate una dup alta pe linii, n limita spaiului disponibil. In momentul cnd
o componenta nu mai ncape pe linia curenta se trece la urmtoarea linie, de sus n jos.
Adugarea componentelor se face de la stnga la dreapta pe linie, iar alinierea obiectelor n cadrul
unei linii poate fi de trei feluri: la stnga, la dreapta, centrate. Implicit componentele sunt centrate
pe fiecare linie iar distanta implicita ntre componente este de 5 uniti pe verticala i 5 pe
orizontal.
Exemplu 2.
import java.awt.*;
import javax.swing.*;
public class TestFlowLayout {
public static void main(String args[]) {
JFrame f = new JFrame("Flow Layout");
f.setLayout(new FlowLayout());
JButton
JButton
JButton
JButton
JButton
b1
b2
b3
b4
b5
f.add(b1);
=
=
=
=
=
new
new
new
new
new
JButton("Button 1");
JButton("2");
JButton("Button 3");
JButton("Long-Named Button 4");
JButton("Button 5");
f.pack();
f.setVisible(true);
}
}
Redimensionnd fereastra astfel nct cele cinci butoane sa nu mai ncap pe o linie, ultimele dintre
ele vor fi trecute pe linia urmtoare:
Gestionarul BorderLayout
Gestionarul BorderLayout mparte suprafaa de afiare n cinci regiuni, corespunztoare
celor patru puncte cardinale i centrului. O componenta poate fi plasata n oricare din aceste regiuni,
9
dimensiunea componentei fiind calculata astfel nct sa ocupe ntreg spaiul de afiare oferit de
regiunea respectiva. Pentru a aduga mai multe obiecte grafice ntr-una din cele cinci zone, ele
trebuie grupate n prealabil ntr-un panel, care va fi amplasat apoi n regiunea dorita.
Aadar, la adugarea unei componente pe o suprafa gestionat de BorderLayout, metoda add
va mai primi pe lng numele componentei i zona n care aceasta va fi amplasata, acesta fiind
specificat prin una din constantele clasei BorderLayout: NORTH, SOUTH, EAST, WEST,
CENTER.
Exemplu 3.
import java.awt.BorderLayout;
import javax.swing.*;
import static java.awt.BorderLayout.*;
public class TestBorderLayout {
public static void main(String args[]) {
JFrame f = new JFrame("Border Layout");
// poate sa lipseasca, e implicit la JFrame
f.setLayout(new BorderLayout());
f.add(new JButton("Nord"), NORTH);
f.add(new JButton("Sud"), SOUTH);
f.add(new JButton("Est"), EAST);
f.add(new JButton("Vest"), WEST);
f.add(new JButton("Centru"), CENTER);
f.pack();
f.setVisible(true);
}
}
Gestionarul GridLayout
Gestionarul GridLayout organizeaz containerul ca un tabel cu rnduri i coloane,
componentele fiind plasate n csuele tabelului de la stnga la dreapta ncepnd cu primul rnd.
Csuele tabelului au dimensiuni egale iar o component poate ocupa doar o singura csu.
Numrul de linii i coloane poate fi specificat n constructorul gestionarului dar poate fi modificat i
ulterior prin metodele setRows i setCols. De asemenea, distanta ntre componente pe orizontala
i distanta ntre rndurile tabelului pot fi specificate n constructor sau stabilite ulterior.
Exemplu 4.
10
import java.awt.*;
import javax.swing.*;
public class TestGridLayout {
public static void main(String args[]) {
JFrame f = new JFrame("Grid Layout");
f.setLayout(new GridLayout(3, 2));
f.add(new JButton("Button 1"));
f.add(new JButton("2"));
f.add(new JButton("Button 3"));
f.add(new JButton("Long-Named Button 4"));
f.add(new JButton("Button 5"));
f.pack();
f.setVisible(true);
}
}
Cele cinci butoane ale ferestrei vor fi pe trei rnduri i doua coloane astfel:
Gestionarul CardLayout
Gestionarul CardLayout trateaz componentele adugate pe suprafaa sa ntr-o manier
similar cu cea a dispunerii crilor de joc ntr-un pachet. Suprafaa de afiare poate fi asemnat cu
pachetul de cri iar fiecare component este o carte din pachet. La un moment dat, numai o singur
component este vizibil.
Clasa dispune de metode prin care s poat fi afiat o anumit component din pachet, sau
s se poat parcurge secvenial pachetul, ordinea componentelor fiind intern gestionarului.
Principala utilitate a acestui gestionar este utilizarea mai eficient a spaiului disponibil n
situaii n care componentele pot fi grupate n aa fel nct utilizatorul s interacioneze la un
moment dat doar cu un anumit grup (o carte din pachet), celelalte fiind ascunse.
Exemplu 5. Aplicaia arat modul de funcionare a unui CardLayout. Clasa TestCardLayout
particularizeaz clasa JFrame prin motenire. Sunt tratate evenimentele de click pe dou butoane
prin implementarea interfeei asculttor ActionListener.
// ontine si tratarea de evenimente pt. 2 butoane
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestCardLayout extends JFrame implements ActionListener {
JPanel tab;
public TestCardLayout() {
super("TestCardLayout");
JButton card1 = new JButton("Card 1");
JButton card2 = new JButton("Card 2");
JPanel butoane = new JPanel();
11
butoane.add(card1);
butoane.add(card2);
// partea care se va ascunde
JLabel et = new JLabel("Nume:");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
panel.add(et);
panel.add(text);
tab = new JPanel();
tab.setLayout(new CardLayout());
TextField tf = new TextField("Text Field");
tab.add("Card 1", tf);
tab.add("Card 2", panel);
add(butoane, BorderLayout.NORTH);
add(tab, BorderLayout.CENTER);
// adaugarea de ascultatoare pt. evenimente
card1.addActionListener(this);
card2.addActionListener(this);
pack();
}
public void actionPerformed(ActionEvent e) {
CardLayout gestionar = (CardLayout) tab.getLayout();
gestionar.show(tab, e.getActionCommand());
}
public static void main(String args[]) {
new TestCardLayout().setVisible(true);
}
}
Exemplu 6.
import java.awt.*;
import javax.swing.*;
public class TestPanel {
public static void main(String args[]) {
JFrame f = new JFrame("Panel");
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(new JLabel("Text:"));
panel.add(new JTextField("", 20));
panel.add(new JButton("Reset"));
f.add(panel, BorderLayout.NORTH);
f.add(new JButton("OK"), BorderLayout.EAST);
f.add(new JButton("Cancel"), BorderLayout.WEST);
f.pack();
f.setVisible(true);
}
}
13
Component
(generare de eveniment)
Listener
(interceptarea evenimentului)
Aadar, pentru a scrie cod care s se execute n momentul n care utilizatorul interacioneaz cu o
componenta grafic trebuie sa facem urmtoarele lucruri:
Evenimentele sunt, ca orice altceva n Java, obiecte. Clasele care descriu aceste obiecte se
mpart n mai multe tipuri n funcie de componenta care le genereaz, mai precis n funcie de
aciunea utilizatorului asupra acesteia. Pentru fiecare tip de eveniment exist o clasa care instaniaz
obiecte de acel tip; de exemplu: evenimentul generat de acionarea unui buton este implementat prin
clasa ActionEvent, cel generat de modificarea unui text prin clasa TextEvent, etc.
Toate aceste clase au ca superclasa comuna clasa AWTEvent.
14
ntruct o clasa poate implementa oricte interfee ea va putea s asculte evenimente de mai multe
tipuri:
class Ascultator implements ActionListener, TextListener
15
16
Aadar, orice clas poate asculta evenimente de orice tip cu condiia s implementeze
interfeele specifice acelor evenimente.
17
Adjustable
Applet
AdjustmentEvent
ContainerEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
Button
ActionEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
Canvas
FocusEvent, KeyEvent, MouseEvent, ComponentEvent
Checkbox
ItemEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
CheckboxMenuItem ActionEvent, ItemEvent
Choice
ItemEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
Component
FocusEvent, KeyEvent, MouseEvent, ComponentEvent
Container
ContainerEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
Dialog
ContainerEvent, WindowEvent, FocusEvent, KeyEvent,
MouseEvent, ComponentEvent
FileDialog
ContainerEvent, WindowEvent, FocusEvent, KeyEvent,
MouseEvent, ComponentEvent
Frame
ContainerEvent, WindowEvent, FocusEvent, KeyEvent,
MouseEvent, ComponentEvent
Label
FocusEvent, KeyEvent, MouseEvent, ComponentEvent
List
ActionEvent, FocusEvent, KeyEvent, MouseEvent,
ItemEvent, ComponentEvent
Menu
ActionEvent
MenuItem
ActionEvent
Panel
ContainerEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
PopupMenu
ActionEvent
Scrollbar
AdjustmentEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
ScrollPane
ContainerEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
TextArea
TextEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
TextComponent
TextEvent, FocusEvent, KeyEvent, MouseEvent,
ComponentEvent
TextField
ActionEvent, TextEvent, FocusEvent, KeyEvent,
MouseEvent, ComponentEvent
Window
ContainerEvent, WindowEvent, FocusEvent, KeyEvent,
MouseEvent, ComponentEvent
18
ActionListener
AdjustmentListener
ComponentListener
Metodele interfetei
actionPerformed(ActionEvent)
adjustmentValueChanged(AdjustmentEvent)
componentHidden(ComponentEvent)
componentShown(ComponentEvent)
componentMoved(ComponentEvent)
componentResized(ComponentEvent)
ContainerListener
componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
FocusListener
focusGained(FocusEvent)
focusLost(FocusEvent)
KeyListener
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener
mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
WindowListener
windowOpened(WindowEvent)
windowClosing(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
ItemListener
itemStateChanged(ItemEvent)
TextListener
textValueChanged(TextEvent)
19
Exemplu 2. Crearea unei ferestre cu ascultarea evenimentelor sale folosind implementarea directa a
interfeei WindowListener.
import java.awt.*;
import java.awt.event.*;
class Fereastra extends JFrame implements WindowListener {
public Fereastra(String titlu) {
super(titlu);
this.addWindowListener(this);
}
//metodele interfetei WindowListener
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {
dispose();
//inchid fereastra
System.exit(0);
//termin programul
}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
}
public class TestWindowListener {
public static void main(String args[]) {
Fereastra f = new Fereastra("O fereastra");
f.setVisible(true);
}
}
Se observ c trebuie implementate toate metodele interfeei, chiar dac nu se scriem nici un
cod pentru ele. Singura metoda care intereseaz este windowClosing n care se specific ce
trebuie fcut atunci cnd utilizatorul dorete s nchid fereastra. Pentru a evita scrierea inutil a
acestor metode exista o serie de clase care implementeaz interfeele de tip listener far a
specifica nici un cod pentru metodele lor. Aceste clase se numesc adaptori.
Utilizarea adaptorilor
Un adaptor este o clasa abstracta care implementeaz o interfa de tip listener. Scopul
unei astfel de clase este ca la crearea unui asculttor de evenimente, n loc s implementeze o
anumita interfa i implicit toate metodele sale, se extinde adaptorul corespunztor interfeei
respective i se supradefinete doar metodele care intereseaz (cele n care se scrie o anumit
secven de cod).
De exemplu, adaptorul interfeei WindowListener este WindowAdapter iar folosirea
acestuia este data n exemplul de mai jos.
20
Exemplu 3. Crearea unei ferestre cu ascultarea evenimentelor sale folosind extinderea clasei
WindowAdapter.
import java.awt.*;
import java.awt.event.*;
class Fereastra extends JFrame {
public Fereastra(String titlu) {
super(titlu);
this.addWindowListener(new Ascultator());
}
}
class Ascultator extends WindowAdapter {
//suprdefinim metodele care ne intereseaza
public void windowClosing(WindowEvent e) {
//?.dispose();
// dispose nu se mai poate apela, de ce?
System.exit(0);
}
}
public class TestWindowAdapter {
public static void main(String args[]) {
Fereastra f = new Fereastra("O fereastra");
f.setVisible(true);
}
}
21
n tabelul de mai jos sunt dai toi adaptorii interfeelor de tip listener - se observ c o
interfa YYYListener are un adaptor de tipul YYYAdapter. Interfeele care nu au un adaptor sunt
cele care definesc o singura metoda i prin urmare crearea unei clase adaptor nu i are rostul.
Interfaa "listener"
ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
TextListener
WindowListener
Adaptor
nu are
nu are
ComponentAdapter
ContainerAdapter
FocusAdapter
nu are
KeyAdapter
Mouse
MouseMotionAdapter
nu are
WindowAdapter
Codul programului a fost redus substanial prin folosirea unui adaptor i a unei clase anonime.
22
23
24