Sunteți pe pagina 1din 16

Interfața grafică cu utilizatorul

Interfața grafică cu utilizatorul (GUI), este un


termen cu înțeles larg care se referă la toate
tipurile de comunicare vizuală între un program
și utilizatorii săi. Aceasta este o particularizare a
interfeței cu utilizatorul (UI), prin care vom
înțelege conceptul generic de interacțiune dintre
program și utilizatori.
Limbajul Java pune la dispoziție numeroase clase
pentru implementarea diverselor funcționalitati
UI, însă ne vom ocupa în continuare de cele care
permit realizarea intefeței grafice cu utilizatorul
(GUI).
De la apariția limbajului Java, bibliotecile de clase care oferă
servicii grafice au suferit probabil cele mai mari schimbări în
trecerea de la o versiune la alta. Acest lucru se datorează, pe de
o parte dificultății legate de implementarea noțiunii de
portabilitate, pe de altă parte nevoii de a integra mecanismele
GUI cu tehnologii apărute și dezvoltate ulterior. În momentul
actual, există două modalități de a crea o aplicație cu interfață
grafică și anume:
 AWT(Abstract Windowing Toolkit) - este API-ul inițial pus la
dispoziție începând cu primele versiuni de Java;
 Swing - parte dintr-un proiect mai amplu numit JFC (Java
Foundation Classes) creat în urma colaborării dintre Sun,
Netscape și IBM, Swing se bazează pe modelul AWT,
extinzând funcționalitatea acestuia și adăugând sau înlocuind
componente pentru dezvoltarea aplicațiilor GUI.
Așadar, este de preferat ca aplicațiile Java să fie create folosind
tehnologia Swing, aceasta punând la dispoziție o paletă mult
mai largă de facilități, însă nu vom renunța complet la AWT
deoarece aici există clase esențiale, reutilizate în Swing.
În principiu, crearea unei aplicații grafice presupune
următoarele lucruri:
 Design
– Crearea unei suprafețe de afișare (cum ar fi o fereastră) pe
care vor fi așezate obiectele grafice (componente) care
servesc la comunicarea cu utilizatorul (butoane, controale
pentru editarea textelor, liste, etc);
– Crearea și așezarea componentelor pe suprafața de afișare
la pozițiile corespunzătoare;
 Funcționalitate
– Definirea unor acțiuni care trebuie să se execute în
momentul când utilizatorul interacționează cu obiectele
grafice ale aplicației;
– ”Ascultarea” evenimentelor generate de obiecte în
momentul interacțiunii cu utilizatorul și executarea acțiunilor
corespunzătoare, așa cum au fost ele definite.
Tehnologia Swing
In JFC (Java Foundation Classes) din care face parte tehnologia
Swing sunt incluse următoarele:
 Componente Swing
Sunt componente ce înlocuiesc și în acelașii timp extind vechiul
set oferit de modelul AWT.
 Look-and-Feel
Permite schimbarea înfățișării și a modului de interacțiune cu
aplicația în funcție de preferințele fiecăruia. Același program
poate utiliza diverse moduri Look-and-Feel, cum ar fi cele
standard Windows, Mac, Java, Motif sau altele oferite de diverși
dezvoltatori, acestea putând fi interschimbate de către utilizator
chiar la momentul execuției .
 Accessibility API
Permite dezvoltarea de aplicații care să comunice cu dispozitive
utilizate de către persoane cu diverse tipuri de handicap, cum ar
fi cititoare de ecran, dispozitive de recunoaștere a vocii, etc.
 Java 2D API
Folosind Java 2D pot fi create aplicații care utilizează
grafică la un nivel avansat. Clasele puse la dispoziție
permit crearea de desene complexe, efectuarea de
operații geometrice (rotiri, scalări, translații, etc.),
prelucrarea de imagini, tipărire, etc.
 Drag-and-Drop
Oferă posibilitatea de a efectua operații drag-and-drop
între aplicații Java și aplicații native.
 Internaționalizare
Internaționalizarea și localizarea aplicațiilor sunt două
facilități extrem de importante care permit dezvoltarea de
aplicații care să poată fi configurate pentru exploatarea
lor în diverse zone ale globului, utilizând limba și
particularitățile legate de formatarea datei, numerelor
sau a monedei din zona respectivă.
Componentele folosite pentru crearea interfețelor grafice Swing pot fi grupate
astfel:
 Componente atomice
JLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JScrollBar, JSlider,
JProgressBar, JSeparator
 Componente complexe
JTable, JTree, JComboBox, JSpinner, JList, JFileChooser, JColorChooser,
JOptionPane
 Componente pentru editare de text
JTextField, JFormattedTextField, JPasswordField, JTextArea, JEditorPane,
JTextPane
 Meniuri
JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem,
JRadioButtonMenuItem
 Containere intermediare
JPanel, JScrollPane, JSplitPane, JTabbedPane, JDesktopPane, JToolBar
 Containere de nivel înalt
JFrame, JDialog, JWindow, JInternalFrame, JApplet.
Asemănări și deosebiri cu AWT
Nu se poate spune că Swing înlocuiește modelul
AWT ci îl extinde pe acesta din urmă adăugându-i noi
componente care fie înlocuiesc unele vechi fie sunt
cu totul noi. O convenție în general respectată este
prefixarea numelui unei clase AWT cu litera ”J”
pentru a denumi clasa corespondentă din Swing.
Astfel, în locul clasei java.awt.Button putem folosi
javax.swing.JButton, în loc de java.awt.Label putem
folosi javax.swing.JLabel, etc. Este recomandat ca o
aplicație cu interfață grafică să folosească fie
componente AWT, fie Swing, amestecarea lor fiind
mai puțin uzuală.
Poziționarea componentelor este preluată din AWT, fiind
adăugate însă noi clase care descriu gestionari de
poziționare în completarea celor existente, cum ar fi
BoxLayout și SpringLayout. Diferă însă modul de lucru cu
containere.
Pentru a fi afișate pe ecran componentele grafice ale unei
aplicații trebuie plasate pe o suprafață de afișare (container).
Fiecare componentă poate fi conținută doar într-un singur
container, adăugarea ei pe o suprafață nouă de afișare
determinând eliminarea ei de pe vechiul container pe care
fusese plasată. Intrucât containerele pot fi încapsulate în alte
containere, o componentă va face parte la un moment dat
dintr-o ierarhie. Rădăcina acestei ierarhii trebuie să fie un
așa numit container de nivel înalt, care este reprezentat de
una din clasele JFrame, JDialog sau JApplet.
În general orice aplicație Java independentă
bazată pe Swing conține cel puțin un container
de nivel înalt reprezentat de fereastra principală
a programului, instanță a clasei JFrame.
Simplificat, un obiect care reprezintă o fereastră
Swing conține o zonă care este rezervată barei
de meniuri și care este situată de obieci în
partea sa superioară și corpul ferestrei pe care
vor fi plasate componentele. Imaginea de mai
jos pune în evidență această separare, valabilă
de altfel pentru orice container de nivel înalt:
Corpul ferestrei este o instanță a clasei Container ce
poate fi obținută cu metoda getContentPane. Plasarea și
aranjarea componentelor pe suprafața ferestrei se va face
deci folosind obiectul de tip Container și nu direct
fereastra.
Ferestre interne
Din punctul de vedere al folosirii ferestrelor, aplicațiile pot
fi împărțite în două categorii:
 SDI (Single Document Interface).
 MDI (Multiple Document Interface).
Programele din prima categorie gestionează la un
moment dat o singură fereastră în care se găsesc
componentele cu care interacționează utilizatorul. În a
doua categorie, fereastra principală a aplicației înglobează
la rândul ei alte ferestre, uzual cu funcționalități similare,
ce permit lucrul concurent pe mai multe planuri.
În Swing, clasa JInternalFrame pune la dispoziție o
modalitate de a crea ferestre în cadrul altor ferestre.
Ferestrele interne au aproximativ aceeași înfățișare și
funcționalitate cu ferestrele de tip JFrame, singura
diferență fiind modul de gestionare a acestora.
Arhitectura modelului Swing
Modelul Swing este bazat pe o arhitectură
asemănătoare cu MVC (modelview- controller).
Arhitectura MVC specifică descompunerea unei
aplicații vizuale în trei părți separate:
Modelul - care va reprezenta datele aplicației.
Prezentarea - modul de reprezentare vizuală a
datelor.
Controlul - transformarea acțiunilor
utilizatorului asupra componentelor vizuale în
evenimente care să actualizeze automat
modelul acestora(datele).
Din motive practice, în Swing părțile de prezentare și control
au fost cuplate deoarece exista o legătură prea strânsă între
ele pentru a fi concepute ca entități separate. Așadar,
arhitectura Swing este de fapt o arhitectură cu model
separabil, în care datele componentelor (modelul) sunt
separate de reprezentarea lor vizuală. Această abordare este
logică și din perspectiva faptului că, în general, modul de
concepere a unei aplicații trebuie să fie orientat asupra
reprezentării și manipulării informațiilor și nu asupra
interfeței grafice cu utilizatorul.
Pentru a realiza separarea modelului de prezentare, fiecărui
obiect corespunzător unei clase ce descrie o componentă
Swing îi este asociat un obiect care gestionează datele sale și
care implementează o interfață care reprezintă modelul
componentei respective. După cum se observă din tabelul de
mai jos, componente cu reprezentări diferite pot avea același
tip de model, dar există și componente care au asociate mai
multe modele:
Fiecare componentă are un model inițial implicit, însă are posibilitatea de
a-l înlocui cu unul nou atunci când este cazul. Metodele care accesează
modelul unui obiect sunt: setModel, respectiv getModel, cu argumente
specifice fiecărei componente în parte.
Tratarea evenimentelor
Modelele componentelor trebuie să notifice apariția unor
schimbări ale datelor gestionate astfel încât să poată fi
reactualizată prezentarea lor sau să fie executat un
anumit cod în cadrul unui obiect de tip listener. In Swing,
această notificare este realizată în două moduri:
1. Informativ - Modelele trimit un eveniment prin care
sunt informați ascultătorii că a survenit o anumită
schimbare a datelor, fără a include în eveniment
detalii legate de schimbarea survenită. Obiectele de
tip listener vor trebui să apeleze metode specifice
componentelor pentru a afla ce anume s-a schimbat.
2. Consistent – Modele ce pun la dispoziție interfețe
specializate și tipuri de evenimente specifice ce includ
toate informațiile legate de schimbarea datelor.

S-ar putea să vă placă și