CATEGORII DOCUMENTE |
Interfata grafica se refera la toate tipurile de comunicare vizuala intre un program si utilizatorii sai. Interfata grafica se refera nu numai la ceea ce utilizatorul vede pe ecran ci si la toate mecanismele de comunicare intre acesta si program.
Limbajul Java pune la dispozitie numeroase clase pentru implementarea diferitelor functionalitati ale interfatei grafice, insa ne vom ocupa in continuare de acelea care permit realizarea unei intefete grafice cu utilizatorul (GUI - Graphical User Interface).
In principiu, crearea unei aplicatii grafice presupune urmatorii pasi:
1. crearea unei suprafete de afisare (cum ar fi o fereastra) pe care vor fi asezate obiectele grafice care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc);
2. crearea si asezarea obiectelor grafice pe suprafata de afisare in pozitiile corespunzatoare;
3. definirea unor actiuni care trebuie sa se execute in momentul cand utilizatorul interactioneaza cu obiectele grafice ale aplicatiei;
4. 'ascultarea' evenimentelor generate de obiecte in momentul interactiunii cu utilizatorul si executarea actiunilor corespunzatoare asa cum au fost ele definite.
In Java
exista doua pachete de clase care ofera servicii grafice:
java.awt si javax.swing. In acest curs ne vom ocupa de pachetul
Swing care este o extensie a pachetului awt. 'Swing' a fost numele de
cod dat proiectului care dezvolta componente noi. Incepand cu javax.swing
este
numele pachetelor pentru Swing API.
Majoritatea
obiectelor grafice sunt subclase ale clasei JComponent, clasa care
defineste generic o componenta grafica care poate
interactiona cu utilizatorul.
Asadar, printr-o componenta grafica vom intelege orice
obiect care are o reprezentare grafica ce poate fi afisata pe
ecran si care poate interactiona cu utilizatorul. Exemple de
componente sunt ferestrele, butoanele, bare de defilare, etc. In general, toate
componentele sunt definte de clase proprii ce se gasesc in pachetul javax.swing,
clasa JComponent fiind
superclasa abstracta a tuturor acestor clase.
Crearea obiectelor grafice nu realizeaza automat si afisarea lor pe ecran. Mai intai ele trebuie asezate pe o suprafata de afisare, care poate fi o fereastra sau suprafata unui applet, si vor deveni vizibile in momentul in care suprafata pe care sunt afisate va fi vizibila. O astfel de suprafata pe care se aseaza obiectele grafice reprezinta o instanta a unei clase obtinuta prin extensia clasei Container; din acest motiv suprafetele de afisare vor mai fi numite si containere. Clasa Container este o subclasa aparte a clasei Component, fiind la randul ei superclasa tuturor suprafetelor de afisare Java (ferestre, applet-uri, etc).
Pachetul Swing ofera programelor care folosesc componentele lui posibilitatea sa-si aleaga natura interfetei ("look and feel") sau, pur si simplu, sa o conserve pe cea caracteristica platformei respective.
Exemplu 1: O aplicatie de sine statatoare, care nu utilizeaza applet-ul.
1. import javax.swing.*;
2. import java.awt.*;
3. import java.awt.event.*;
4. public class SwingTest
16. });
17. JPanel panou = new JPanel();
18. panou.setBorder(BorderFactory.createEmptyBorder( 30,30,10,30));
19. panou.setLayout(new FlowLayout());
20. panou.add(buton);
21. panou.add(eticheta);
22. return panou;
23. }//creazaComponente
24.
25. public static void main(String[] args) catch (Exception e)
29. JFrame frame = new JFrame('Prima aplicatie Swing');
30. SwingTest app = new SwingTest();
31. Component comp = app.creazaComponente();
32. frame.getContentPane().add(comp);
33. frame.addWindowListener(new WindowAdapter()
});
34. frame.pack();
35. frame.setVisible(true);
36. }//main
37. }//class
In linia 17 se creaza un panel (panou) pe care vor fi asezate componentele.
In linia 18 se seteaza marginea panel-ului cu dimensiunile pentru (sus, stanga, jos, dreapta).
In linia 29 se creaza container-ul principal (din varful ierarhiei) si in linia 32 se adauga componentele pe el.
In liniile 33-35 se incheie setarile pentru frame si se afiseaza.
Exemplu 2: O aplicatie care utilizeaza applet-ul.
1. import javax.swing.*;
2. import java.awt.*;
3. public class SwingAppletTest extends JApplet
10. }
In codul urmator se specifica natura interfetei:
try catch (Exception e)
Orice
program care prezinta o GUI Swing contine cel putin un container
Swing. In general, container-ele principale sunt instante ale lui JFrame
, JDialog
sau
(pentru appleturi) JApplet
.
Fiecare obiect JFrame
implementeaza o singura fereastra principala, fiecare
obiect JDialog
cate o fereastra secundara si fiecare obiect JApplet
implementeaza
un applet in cadrul unui browser. Container-ul principal Swing furnizeaza
suportul necesar componentelor Swing pentru a fi afisate si pentru a
manipula evenimentele. In exemplu 1 container-ul folosit este JFrame si
este creat in linia 29. In exemplu 2
container-ul folosit este JApplet (vezi linia 3).
Aplicatiile
Swing grupeaza etichetele si butoanele intr-un container (un JPanel
)
inainte sa le adauge pe frame. Adaugarea componentelor pe panel
inseamna ca ele vor fi controlate de manager-ul de layout al
panel-ului. Manager-ul de layout al unui container determina dimensiunea
si pozitia fiecarei componente care este adaugata pe
container.
Aplicatia din exemplu 1 contine doua evenimente tratate. Una trateaza click-ul pe buton (action events); cealalta trateaza inchiderea ferestrei (window events):
button.addActionListener(new ActionListener()
});
frame.addWindowListener(new WindowAdapter()
});
Dupa cum am vazut, suprafetele de afisare ale componentelor grafice (containerele) sunt extensii ale clasei Container.
Spre deosebire de un applet care isi poate plasa componentele direct pe suprafata de afisare a browser-ului in care ruleaza, o aplicatie independenta are nevoie de propriile ferestre pe care sa faca afisarea componentelor sale grafice. O astfel de suprafata pe care se aseaza obiectele grafice se numeste suprafata de afisare sau container si reprezinta o instanta a unei clase obtinuta prin extensia superclasei Container.
Cele mai importante containere principale sunt: JFrame, JDialog, JWindow si JApplet. Ierarhia de clase este:
java.awt.Container
|__ java.awt.Panel
|__ java.applet.Applet
|__ javax.swing.JApplet
|__ java.awt.Window
|__ java.awt.Frame
| |__ javax.swing.JFrame
|__ java.awt.Dialog
| |__ javax.swing.JDialog
|__ javax.swing.JWindow
Clasa JFrame este folosita pentru implementarea ferestrelor principale. Aceasta componenta are caracteristic cadrul, bara de titlu si controalele ferestrei furnizate de sistemul de operare. Acestea nu pot fi modificate. Comportamentul ferestrelor (redimensionare, minimizare, pozitionare) este controlat de sistemul de operare.
Constructorii clasei JFrame sunt:
JFrame() - construieste o fereastra, fara titlu, initial invizibila.
JFrame(String title) - construieste o fereastra, cu titlu specificat, initial invizibila.
Asadar, o fereastra nou creata este invizibila. Pentru a fi facuta vizibila se va apela metoda show().
Exemplu 3: Se construieste si se afiseaza o fereastra cu titlul 'Prima fereastra'.
import javax.swing.*;
public class AplJFrame
}
Cateva dintre metodele cele mai folosite ale clasei JFrame sunt prezentate in continuare.
Metoda pack()
este folosita pentru a da o dimensiune frame-ului. O alternativa
pentru pack() este setarea explicita a dimensiunii frame-ului prin
apelarea metodei setSize(). In general, folosirea lui pack()
este
preferabila folosirii lui setSize()
,
deoarece pack()
lasa in seama layout manager-ului calculul dimensiunii frame-ului care
tine seama si de alti factori care pot afecta dimensiunea
componentelor.
Metoda setVisible()
este
folosita pentru a afisarea frame-ului.
Metoda getContentPane() returneaza obiectul contentPane al frame-ului. Orice componenta se adauga pe contentPane-ul frame-ului curent.
Exemplu 4:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicFrame catch (Exception e)
/*Se creaza container-ul principal (din varful ierarhiei) si se adauga componentele pe el*/
JFrame frame = new JFrame();
JLabel comp = new JLabel('eticheta1');
JLabel comp1 = new JLabel('eticheta2');
//eticheta2 va fi pusa peste eticheta1
frame.getContentPane().add(comp);
frame.getContentPane().add(comp1);
frame.addWindowListener(new WindowAdapter()
});
frame.pack();
frame.setVisible(true);
}
}
Pentru a crea ferestre secundare se foloseste, de obicei, JDialog. Alte ferestre secundare pot fi create cu:
JOptionPane - creeaza o fereastra standard de dialog
ProgressMonitor - creeaza o fereastra care arata progresul unei operatii
JColorChooser - creeaza o fereastra pentru alegerea culorii
JFileChooser - creeaza o fereastra pentru selectarea unui fisier
Exemplu 5:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicJOptionPane catch (Exception e)
JFrame frame = new JFrame();
JButton b=new JButton('Apasa-ma');
frame.getContentPane().add(b);
b.addActionListener(new ActionListener()
});
frame.addWindowListener(new WindowAdapter()
});
frame.pack();
frame.setVisible(true);
}
}
Fiecare fereastra secundara este dependenta de una principala (de un frame).
O fereastra de dialog poate fi modala. Daca este modala, ea blocheaza accesul la oricare alta fereastra din program.
Cele mai simple ferestre modale pot fi create folosind una din metodele:
JOptionPane.showMessageDialog - fereastra modala inzestrata cu un buton. Se poate specifica mesajul, icoana si titlul ferestrei .
JOptionPane.showOptionDialog - fereastra modala inzestrata cu butoane, mesaj, icoana si titlul ferestrei. Pot fi modificate de utilizator.
Exemplu 6:
Object[] options = ;
int n=JOptionPane.showOptionDialog(
new Frame(),
'Ma parasesti?',
'Fereastra de Optiuni',
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[2]);
JOptionPane.showConfirmDialog - fereastra modala inzestrata cu doua butoane.
Exemplu 7:
JOptionPane.showConfirmDialog(
null,
'Alege un buton',
'Fereastra de confirmare',
JOptionPane.YES_NO_OPTION);
Parametrii folositi de aceste metode:
parentComponent: poate fi frame-ul care contine fereastra de dialog (ea este afisata pornind de la coordonatele ferestrei parinte) sau null (se foloseste un frame implicit si fereastra de dialog este centrata pe ecran);
message: mesajul care apare in fereastra de dialog;
messageType: defineste stilul mesajului. Valori posibile sunt:
- ERROR_MESSAGE
- INFORMATION_MESSAGE
- WARNING_MESSAGE
- QUESTION_MESSAGE
- PLAIN_MESSAGE
optionType: defineste multimea de butoane care apar pe fereastra:
- DEFAULT_OPTION
- YES_NO_OPTION
- YES_NO_CANCEL_OPTION
- OK_CANCEL_OPTION
Pot fi folosite si alte tipuri de butoane;
options: descriere detaliata a multimii butoanelor afisate pe fereastra; in general, este un vector de String-uri;
icon: icoana afisata pe fereastra;
title: titlul ferestrei;
initialValue: butonul selectat implicit.
Metodele
showMessageDialog
,
showConfirmDialog
si showOptionDialog
returneaza un intreg semnificand optiunea utilizatorului. Valorile
acestui intreg pot fi YES_OPTION
, NO_OPTION
, CANCEL_OPTION
,
OK_OPTION
si CLOSED_OPTION
.
Ferestre de dialog nemodale se pot crea cu JDialog.
JDialog este folosita pentru implementarea ferestrelor secundare (cum ar fi dialog boxes si alert boxes) si a celor utilitare. Aceasta componenta are caracteristic cadrul si bara de titlu furnizate de sistemul de operare. Aduce nou fata de clasa Dialog suportul pentru operatia de inchidere implicita.
Exemplu 8:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Dialog
}
});
frame.addWindowListener(new WindowAdapter()
});
frame.pack();
frame.setVisible(true);
}
}
Clasa JWindow este folosita pentru implementarea ferestrelor pline (dreptunghiuri albe pline). Aceste ferestre nu contin bara de titlu sau controale de fereastra.
Exemplu 9:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicJWindow catch (Exception e)
final JFrame frame=new JFrame('Frame-ul meu');
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(1,1));
JButton Buton = new JButton('Apasa-ma!');
contentPane.add(Buton);
Buton.addActionListener(new ActionListener()
}
});
frame.addWindowListener(new WindowAdapter()
});
frame.pack();
frame.setVisible(true);
}
}
Clasa JApplet este folosita pentru implementarea applet-urilor. A se vedea exemplul 2.
Forma containere-lor principale este ilustrata in figura urmatoare:
Sunt componente JFC folosite pentru organizarea ferestrelor. Container-ele intermediare folosesc la impartirea ferestrei in mai multe zone sau la gruparea componentelor. Swing furnizeaza urmatoarele containere intermediare:
Panel |
- Este cel mai flexibil si frecvent utilizat container intermediar. Se implementeaza folosind clasa JPanel. Un panel grupeaza componentele dintr-o fereastra sau dintr-un alt panel. Un panel poate folosi orice layout manager si poate avea o margine (border). |
Scroll Pane |
- Furnizeaza scroll bar (orizontal si vertical) pentru componentele prea mari. |
Split Pane |
- Afiseaza doua componente intr-un spatiu fix, oferind utilizatorului posibilitatea sa redimensioneze fiecare componenta. |
Tabbed Pane |
- Contine mai multe componente dar afiseaza numai una la un moment dat. Utilizatorul poate alege intre componente. |
Tool Bar |
- Grupeaza componentele (in general butoane) intr-o linie sau o coloana, permitand utilizatorului sa o mute oriunde. |
Forma containere-lor intermediare este ilustrata in figura urmatoare:
Exemplu 10: Pentru JScrollPane
JFrame frame = new JFrame('Doar un exemplu');
JTextArea t = new JTextArea(20, 40);
JScrollPane scrpane=new JScrollPane(t);
scrpane.setPreferredSize(new Dimension(100, 100));
frame.getContentPane().add(scrpane);
for(int i=0;i<100;i++)
t.append(i+'n');//(new Integer(i)).toString());
Exemplu 11: Pentru JSplitPane
JFrame frame = new JFrame('Doar un exemplu');
JTextArea t=new JTextArea();
for(int i=0;i<100;i++)
t.append(i+'n');
JLabel label=new JLabel('hjsdkljasldjasljdlafj');
JSplitPane splitpane=new JSplitPane();
splitpane.setOneTouchExpandable(true);
splitpane.setLeftComponent(t);
splitpane.setRightComponent(label);
splitpane.setPreferredSize(new Dimension(100, 100));
frame.getContentPane().add(splitpane);
Exemplu 11: Pentru JTabbedPane
import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
public class AplicTabbed extends JPanel
protected Component crearePanel(String text)
public static void main(String[] args)
});
frame.getContentPane().add(
new AplicTabbed(), BorderLayout.CENTER);
frame.setSize(400, 125);
frame.setVisible(true);
}
}
Figura urmatoare ilustreaza executia exemplului.
Un program poate avea interfete diferite, chiar daca sunt folosite aceleasi componente. Acest lucru se datoreaza folosirii a diferiti gestionari de pozitionare care controleaza dimensiunea si pozitiile componentelor.
Gestionarea pozitionarii
este procesul prin care se determina
dimensiunea si pozitia componentelor. Implicit, fiecare container are
un gestionar de pozitionare - un obiect care
gestioneaza pozitionarea fiecarei componente de pe container.
Acest obiect implementeaza
interfata LayoutManager
. Acesta poate fi inlocuit cu altul care sa fie pe
masura cerintelor. In general, se seteaza
gestionarul de pozitionare pentru doua tipuri de containere:
contentpane (foloseste implicit BorderLayout) si JPanel
(foloseste implicit FlowLayout).
De cate ori se adauga o componenta pe container trebuie tinut cont de gestionarul de pozitionare al containerului respectiv.
Pentru schimbarea layout manager-ului folosit de un container se apeleaza metoda setLayout. Metoda poate primi ca parametru orice instanta a unei clase care implementeaza interfata LayoutManager. Secventa de atasare a unui gestionar pentru un container este:
FlowLayout gestionar = new FlowLayout();
container.setLayout(gestionar);
sau:
container.setLayout(new FlowLayout());
De exemplu:
JPanel jp = new JPanel();
jp.setLayout(new BorderLayout());
Daca argumentul este null, container-ul nu foloseste un layout manager. In acest caz trebuie specificate dimensiunile si pozitiile fiecarei componente de pe container.
Cei mai folositi gestionari in Java sunt: BorderLayout, BoxLayout, FlowLayout, GridBagLayout si GridLayout.
BorderLayout
este
layout manager-ul implicit pentru fiecare container principal. Un BorderLayout
are
cinci zone in care pot fi asezate componentele: nord, sud, est, vest
si centru.
Exemplu 12:
1. import javax.swing.*;
2. import java.awt.*;
3. import java.awt.event.*;
4. public class AplicBorderLayout extends JFrame
});
15. f.setSize(400, 125);
16. f.setVisible(true);
17. }
18. }
Tinand cont ca pentru frame-uri gestionarul implicit este BorderLayout, linia 8 nu mai este necesara. Rezultatul executiei acestui program este:
Gestionarul BoxLayout
aseaza componentele pe o singura linie sau coloana.
Respecta dimensiunile minime ale componentelor si permite alinierea
lor.
Exemplu 13:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicBoxLayout extends JFrame
public static void main(String[] args)
});
f.pack();
f.setVisible(true);
}
}
Rezultatul executiei acestui program este:
Clasa CardLayout
permite implementarea unei arii care contine diferite componente la
momente diferite. Tabbed pane-urile sunt containere intermediare care
furnizeaza o functionalitate similara. Un CardLayout
este
in general controlat de un Combo Box, starea lui determinand panel-ul de
afisat.
Exemplu 14:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AplicCardWindow extends JFrame
implements ItemListener ;
JPanel cbp = new JPanel();
JComboBox c = new JComboBox(comboBoxItems);
c.setEditable(false);
c.addItemListener(this);
cbp.add(c);
contentPane.add(cbp, BorderLayout.NORTH);
cards = new JPanel();
cards.setLayout(new CardLayout());
JPanel p1 = new JPanel();
p1.add(new JButton('Buton 1'));
p1.add(new JButton('Buton 2'));
p1.add(new JButton('Buton 3'));
JPanel p2 = new JPanel();
p2.add(new JTextField('TextField', 20));
cards.add(p1, BUTONPANEL);
cards.add(p2, TEXTPANEL);
contentPane.add(cards, BorderLayout.CENTER);
addWindowListener(new WindowAdapter()
});
}
public void itemStateChanged(ItemEvent evt)
public static void main(String args[])
}
In imaginea urmatoare se vad cele doua stari ale ferestrei in functie de starea Combo Box-ului:
FlowLayout
este
layout manager-ul implicit pentru orice JPanel
.
Aseaza componentele de la stanga spre dreapta, de sus in jos.
Exemplu 15:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicFlowLayout extends JFrame
public static void main(String[] args)
});
f.pack();
f.setVisible(true);
}
}
Rezultatul executiei acestui program este:
GridLayout-ul
aseaza componentele in celulele unui tabel. Fiecare componenta
ocupa tot locul disponibil din celula. Toate celulele au aceeasi
dimensiune. La redimesionarea ferestrei GridLayout-ului
,
celulele isi vor schimba dimensiunile astfel incat sa fie ocupat tot
spatiul ferestrei.
Clasa GridLayout are doi constructori:
public GridLayout(int rows, int columns)
public GridLayout(int rows, int columns,
int horizontalGap, int verticalGap)
Cel putin unul din cele doua argumente rows si columns trebuie sa fie nenul. Argumentele horizontalGap si verticalGap din cel de-al doilea constructor permit specificarea numarului de pixeli dintre celule. Implicit ele au valoarea 0.
Exemplu 16:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicGridLayout extends JFrame
});
f.pack();
f.setVisible(true);
}
}
Rezultatul executiei acestui program este:
Constructorul apelat creeaza o instanta a lui GridLayout care are doua coloane si oricate linii sunt necesare - new GridLayout(0,2).
GridBagLayout este cel mai sofisticat si flexibil layout manager pe care platforma Java il furnizeaza. Aseaza componentele in celulele unui tabel, fiecare componenta putand sa ocupe mai multe celule. Liniile / coloanele tabelului nu este obligatoriu sa aiba aceeasi inaltime / latime. Pentru fiecare componenta care se adauga pe fereastra se seteaza o serie de constrangeri prin crearea unui obiect al clasei GridBagConstraints. Aceeasi instanta a lui GridBagConstraints poate fi folosita pentru mai multe componente, chiar daca ele au constrangeri diferite. GridBagLayout extrage valorile constrangerilor si nu refoloseste GridBagConstraints. Clasa contine urmatoarele atribute care pot fi setate:
gridx, gridy - Specifica linia si coloana coltului din stanga sus a componentei. Coloana cea mai din stanga are gridx=0 iar linia cea mai de sus are gridy=0.
gridwidth, gridheight - Reprezinta numarul de coloane (pentru gridwidth) sau de linii (pentru gridheight) pe care va fi afisata componenta. Valoarea implicita este 1.
fill - Este folosita atunci cand aria de afisare a componentei este mai mare decat dimensiunea ceruta, pentru a determina cum poate fi redimensionata componenta. Valorile valide sunt:
NONE (implicit),
HORIZONTAL (mareste componenta pe orizontala astfel incat sa acopere intreaga suprafata disponibila dar nu schimba inaltimea),
VERTICAL (mareste componenta pe verticala astfel incat sa acopere intreaga suprafata disponibila dar nu schimba latimea),
BOTH (mareste componenta astfel incat sa acopere intreaga suprafata disponibila.
ipadx, ipady - Folosite pentru redimensionarea celulelor. Specifica cat trebuie adunat la dimensiunea minima a componentei. Valoarea implicita este 0. Latimea / inaltimea va avea valoarea minima plus ipadx*2 / ipady*2 pixeli (se aplica in ambele capete ale componentei).
insets - Specifica distanta dintre componenta si colturile suprafetei pe care se afiseaza. Valoarea atribuita este un obiect Insets.
anchor - Este folosita atunci cand componenta este mai mica decat suprafata pe care urmeaza sa fie afisata, pentru a determina unde se plaseaza componenta. Valori valide sunt CENTER (implicit), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST si NORTHWEST.
weightx, weighty - Folosite pentru a determina modul in care sa fie repartizat spatiul dintre coloane / linii. Daca nu se specifica nici o valoare (implicit este 0) atunci toate componentele vor fi grupate in centru container-ului deoarece GridBagLayout pune orice spatiu in plus intre tabel si colturile container-ului.
Exemplu 17:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AplicGridBagLayout extends JFrame
buton = new JButton('Buton 1');
if (shouldWeightX)
c.gridx = 0;
c.gridy = 0;
gridbag.setConstraints(buton, c); //constrangerile impuse sunt atasate componentei
contentPane.add(buton);
buton = new JButton('2');
c.gridx = 1;
c.gridy = 0;
gridbag.setConstraints(buton, c);
contentPane.add(buton);
buton = new JButton('Buton 3');
c.gridx = 2;
c.gridy = 0;
gridbag.setConstraints(buton, c);
contentPane.add(buton);
buton = new JButton('Buton 4 foarte lung');
c.ipady = 40; //seteaza cu cat va creste inaltimea componentei
c.weightx = 0.0;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = 1;
gridbag.setConstraints(buton, c);
contentPane.add(buton);
buton = new JButton('Button 5');
c.ipady = 0; //se revine la inaltimea implicita
c.weighty = 1.0; //spatiu vertical intre celule suplimentar
c.anchor = GridBagConstraints.SOUTH; //componenta va fi plasata in partea de jos a ferestrei
c.insets = new Insets(10,0,0,0);
c.gridx = 1; //componenta se alinieaza cu butonul 2
c.gridwidth = 2; //ocupa latimea a doua butoane
c.gridy = 2; //se afla pe a treia linie
gridbag.setConstraints(buton, c);
contentPane.add(buton);
addWindowListener(new WindowAdapter()
});
}
public static void main(String args[])
}
Rezultatul
executiei acestui program este:
Apasarea unei taste sau a unui buton al mouse-ului declanseaza un eveniment. Pentru a trata evenimentul este necesar un obiect care sa implementeze interfata corespunzatoare si sa fie inregistrat ca un consumator de evenimente (event listener). Componentele Swing pot genera mai multe tipuri de evenimente. Cateva dintre interfetele corespunzatoare ar fi:
ActionListener |
actiuni asupra unui control (click pe un buton, Enter dupa introducerea unui text intr-un camp, selectarea intr-un meniu) |
ComponentListener |
redimensionari, deplasari, ascunderi ale unei componente |
FocusListener |
preluare / pierdere focus |
ItemListener |
selectie / deselectie obiect in lista, meniu, etc. |
TextListener |
modificarea textului din control |
AdjustmentListener |
modificarea unei valori variind intre doua limite (ex: ScrollBar) |
KeyListener |
actionarea unei taste |
MouseListener |
apasarea butonului mouse-ului in timp ce cursorul se afla pe componenta respectiva |
MouseMotionListener |
drag; miscarea mouse-ului pe o componenta |
WindowListener |
inchidere, minimizare, maximizare etc. |
ContainerListener |
adaugare, stergere componenta |
|
schimbarea selectiei intr-o tabela sau intr-o lista |
Fiecare eveniment este reprezentat de un obiect care da informatii despre eveniment si identifica sursa evenimentului. Fiecare generator de eveniment poate avea mai multi consumatori.
generator obiect eveniment /----> consummator de eveniment
de eveniment------------------------------------------> consummator de eveniment
----> consummator de eveniment
Un eveniment, o data aparut, este distribuit tuturor ascultatorilor inregistrati (nu este consumat numai de primul).
Asa cum am spus mai devreme, pentru ca evenimentele unei componente sa fie interceptate de catre o instanta a unei clase ascultator, aceasta clasa trebuie inregistrata in lista ascultatorilor componentei respective. Am spus lista, deoarece evenimentele unei componente pot fi ascultate de oricate clase - cu conditia ca acestea sa fie inregistrate la componenta respectiva. Inregistrarea unei clase in lista ascultatorilor unei componente se face cu metode din clasa Component de tipul addXXXListener, iar eliminarea ei din aceasta lista cu removeXXXListener unde XXX reprezinta tipul evenimentului.
Sunt necesari urmatorii pasi:
1.Clasa trebuie sa implementeze interfata corespunzatoare sau sa extinda o clasa care implementeaza interfata.
public class NumeClasa implements ActionListener
2.Scrierea codului care inregistreaza o instanta a clasei (care va consuma evenimentul) ca si consumator pentru una sau mai multe componente.
Componenta.addActionListener(instantaNumeClasa);
3.Scrierea codul care implementeaza metodele din interfata consumator.
public void actionPerformed(ActionEvent e)
Exemplu 18:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AplicEv extends JFrame
public static void main(String[] args)
});
f.addWindowListener(f.lsn);
f.setSize(400, 125);
//f.pack();
f.setVisible(true);
}
}
class TextWorker implements ActionListener
public void actionPerformed(ActionEvent e)
if(c.equals('ActMinuscule'))
}
}
class Listener extends JTextArea implements ActionListener, WindowListener
public void actionPerformed(ActionEvent e)
public void windowClosed(WindowEvent e)
public void windowOpened(WindowEvent e)
public void windowClosing(WindowEvent e)
public void windowIconified(WindowEvent e)
public void windowDeiconified(WindowEvent e)
public void windowActivated(WindowEvent e)
public void windowDeactivated(WindowEvent e)
}
Rezultatul executiei programului este:
Un obiect de tip JLabel (eticheta) reprezinta o componenta pentru plasarea unui text pe o suprafata de afisare. O eticheta este formata dintr-o singura linie de text static ce nu poate fi modificat de catre utilizator, dar poate fi modificat din program.
Un obiect de tip JButton (buton) reprezinta o componenta pentru plasarea unui buton etichetat pe o suprafata de afisare.
Un obiect de tip JTextField defineste un control de editare a textului pe o singura linie. Este util pentru interogarea utilizatorului asupra unor valori.
Un obiect de tip JTextArea defineste un control de editare a textului pe mai multe linii. Este util pentru editarea de texte, introducerea unor comentarii, etc .
Un obiect de tip JCheckbox (comutator) reprezinta o componenta care se poate afla in doua stari : 'selectata' sau 'neselectata' (on/off). Actiunea utilizatorului asupra unui comutator il trece pe acesta in starea complementara celei in care se gasea. Este folosit pentru a prelua o anumita optiune de la utilizator.
Un obiect de tip JRadioButton defineste un grup de comutatoare din care doar unul poate fi selectat. Uzual, aceste componente se mai numesc radio butoane.
Un obiect de tip JComboBox defineste o lista de optiuni din care utilizatorul poate selecta una singura. La un moment dat, din intreaga lista doar o singura optiune este vizibila, cea selectata. O componenta JComboBox este insotita de un buton etichetat cu o sageata verticala la apasarea caruia este afisata intreaga sa lista, pentru ca utilizatorul sa poata selecta o anumita optiune.
Un obiect de tip JList defineste o lista de optiuni care poate fi setata astfel incat utilizatorul sa poata selecta o singura optiune sau mai multe. Toate optiunile listei sunt vizibile in limita dimensiunilor grafice ale componentei.
Un obiect de tip JScrollbar defineste o bara de defilare verticala sau orizontala. Este utila pentru punerea la dispozitie a utilizatorului a unei modalitati sugestive de a alege o anumita valoare dintr-un interval.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2688
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved