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.