De la apariia limbajului Java, bibliotecile de clase care ofer servicii
grafice au suferit probabil cele mai mari schimbri n trecerea de la o versiune la alta. Acest lucru se datoreaz, pe de o parte dificultii legate de implementarea noiunii de portabilitate, pe de alt parte nevoii de a integra mecanismele GUI cu tehnologii aprute i dezvoltate ulterior, cum ar fi Java Beans. In momentul actual, exist dou modaliti de a crea o aplicaie cu interfa grafic i anume: . AWT (Abstract Windowing Toolkit) - este API-ul iniial pus la dispoziie ncepnd cu primele versiuni de Java; . Swing - este parte dintr-un proiect mai amplu numit JFC (Java Foundation Classes) creat n urma colaborrii dintre Sun, Netscape i IBM, care se bazeaz pe modelul AWT, extinznd funcionalitatea acestuia i adugnd sau nlocuind unele componente pentru dezvoltarea aplicaiilor GUI. Este preferabil ca aplicaiile Java s fie create folosind tehnologia Swing, deoarece aceasta pune la dispoziie o palet mult mai larg de faciliti, ns nu se va renuna complet la AWT deoarece aici exist clase eseniale, reutilizate n Swing[4]. Dezavantajul AWT-ului este c arhitecii lui au fost nevoii s ia n considerare numai acele clase de obiecte grafice, care exist ntr-o form sau alta pe toate platformele. Aceasta a fcut ca numrul de clase de obiecte grafice din pachetul java.awt s fie destul de restrns, renunndu-se la funcionalitile specifice numai anumitor platforme. In principiu, crearea unei aplicaii grafice presupune urmtoarele lucruri[4]: . Design - Crearea unei suprafee de afiare (cum ar fi o fereastr) pe care vor fi aezate obiectele grafice (componente) care servesc la comunicarea cu utilizatorul (butoane, controale pentru editarea textelor, liste, etc); - Crearea i aezarea componentelor pe suprafaa de afiare la poziiile corespunztoare; . Funcionalitate - Definirea unor aciuni care trebuie s se execute n momentul cnd utilizatorul interacioneaz cu obiectele grafice ale aplicaiei; - "Ascultarea" evenimentelor generate de obiecte n momentul interaciunii cu utilizatorul i executarea aciunilor corespunztoare, aa cum au fost ele definite. Pachetul javax.swing Componentele Swing, spre deosebire de predecesoarele din versiunile Java anterioare, sunt implementate n ntregime n Java. Aceasta are ca rezultat o
mai bun compatibilitate cu platforme diferite dect n cazul folosirii
componentelor AWT. Unul din principalele deziderate ale tehnologiei Swing a fost s pun la dispoziie un set de componente GUI extensibile care s permit dezvoltarea rapid de aplicaii Java cu interfa grafic competitiv din punct de vedere comercial. Cel mai important pachet, care conine componentele de baz este javax.swing. Orice interfa utilizator Java este compus din urmtoarele elemente: . Componente - orice poate fi plasat pe o interfa utilizator, cum ar fi butoane, liste de derulare, meniuri pop-up, casete de validare sau cmpuri de text. . Containere - acestea reprezint componente care pot conine alte componente (de exemplu panouri, casete de dialog sau ferestre independente) . Administratori de dispunere - reprezint obiecte care definesc modul n care sunt aranjate (dispuse) componentele ntr-un container. Administratorul de dispunere nu este vizibil ntr-o interfa, ns sunt vizibile rezultatele "muncii" sale. Dispunerea componentelor interfeei este de mai multe feluri: dispunere secvenial, dispunere tabelar, dispunere marginal sau dispunere tabelar neproporional. 1). Componente i containere Componentele Swing sunt derivate dintr-o singur clas de baz, numit JComponent, care motenete la rndul ei clasa Container din AWT. Componentele folosite pentru crearea interfeelor grafice Swing pot fi grupate astfel[4]: . 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 Containerele reprezint suprafee de afiare pe care pot fi plasate alte componente, eventual chiar alte containere. Superclasa componentelor de acest tip este Container, din modelul AWT. Containerele de nivel nalt
Pentru a fi afiate pe ecran componentele grafice ale unei aplicaii trebuie
plasate pe o suprafa de afiare (container). Fiecare component poate fi coninut doar ntr-un singur container, adugarea ei pe o suprafa nou de afiare determinnd eliminarea ei de pe vechiul container pe care fusese plasat. Deoarece containerele pot fi ncapsulate n alte containere, o component va face parte la un moment dat dintr-o ierarhie. Rdcina acestei ierarhii trebuie s fie un aa numit container de nivel nalt, care este reprezentat de una din clasele JFrame, JDialog sau JApplet. n general orice aplicaie Java independent bazat pe Swing conine cel puin un container de nivel nalt reprezentat de fereastra principal a programului, instan a clasei JFrame. Containerele intermediare (JPanel, JScrollPane, JTabbedPane, JSplitPane, JLayeredPane, JDesktopPane, JRootPane.) reprezint suprafee de afiare cu ajutorul crora pot fi organizate mai eficient componentele aplicaiei, putnd fi imbricate. JPanel are aceeai funcionalitate ca i clasa Panel din AWT, fiind folosit pentru gruparea mai multor componente Swing i plasarea lor mpreun pe o alt suprafa de afiare. Gestionarul de poziionare implicit este FlowLayout, acesta putnd fi schimbat ns, chiar n momentul construirii obiectului JPanel, sau ulterior cu metoda setLayout. Adugarea de componente se realizeaz ca pentru orice container, folosind metoda add( ). JScrollPane este o clas foarte important n arhitectura modelului Swing, deoarece ofer suport pentru derularea pe orizontal i vertical a componentelor a cror reprezentare complet nu ncape n suprafaa asociat, nici o component Swing neoferind suport intrinsec pentru aceast operaie. Clasa JComponent este superclasa tuturor componentelor Swing, mai puin a celor care descriu containere de nivel nalt JFrame, JDialog, JApplet. Deoarece JComponent extinde clasa Container, deci i Component, ea motenete funcionalitatea general a containerelor i componentelor AWT, furniznd bineneles i o serie ntreag de noi faciliti[4]. Componente pentru editare de text Componentele Swing pentru afiarea i editarea textelor sunt grupate ntr-o ierarhie ce are ca rdcin clasa JTextComponent din pachetul javax.swing.text. Clasele pot mprite n trei categorii, corespunztoare tipului textului editat: 1. Text simplu pe o singur linie - JTextField - Permite editarea unui text simplu, pe o singur linie. - JPasswordField - Permite editarea de parole. Textul acestora va fi ascuns, n locul caracterelor introduse fiind afiat un caracter simbolic, cum ar fi '*'. 2. Text simplu pe mai multe linii - JTextArea - Permite editarea unui text simplu, pe mai multe linii.Orice atribut
legat de stil, cum ar fi culoarea sau fontul, se aplic ntregului text i nu
poate fi specificat doar unei anumite poriuni. Uzual, o component de acest tip va fi inclus ntr-un container JScrollPane, pentru a permite navigarea pe vertical i orizontal dac textul introdus nu ncape n suprafaa alocat obiectului. Acest lucru este valabil pentru toate componentele Swing pentru care are sens noiunea de navigare pe orizontal sau vertical, nici una neoferind suport intrinsec pentru aceast operaiune. 3. Text cu stil mbogit pe mai multe linii - JEditorPane - Permite afiarea i editarea de texte scrise cu stiluri multiple i care pot include imagini sau chiar diverse alte componente. - JTextPane - Aceast clas extinde JEditorPane, oferind faciliti suplimentare pentru lucrul cu stiluri i paragrafe. Componente atomice n categoria componentelor atomice sunt incluse componentele Swing cu funcionalitate simpl, a cror utilizare este facil i n general asemntoare cu a echivalentelor din AWT: . Etichete: JLabel . Butoane simple sau cu dou stri:JButton, JCheckBox, JRadioButton; mai multe butoane radio pot fi grupate folosind clasa ButtonGroup, pentru a permite selectarea doar a unuia dintre ele. . Componente pentru progres i derulare: JSlider, JProgressBar, JScrollBar . Separatori: JSeparator Componente complexe Clasa JList Clasa JList descrie o list de elemente dispuse pe una sau mai multe coloane, din care utilizatorul poate selecta unul sau mai multe. Uzual un obiect de acest tip va fi inclus ntr-un container de tip JScrollPane. Clasa ofer metode pentru selectarea unor elemente din cadrul programului setSelectedIndex, setSelectedIndices, etc. i pentru obinerea celor selectate la un moment dat getSelectedIndex, getSelectedIndices, etc.. Clasa JComboBox Clasa JComboBox este similar cu JList, cu deosebirea c permite doar selectarea unui singur articol, acesta fiind i singurul permanent vizibil. Lista celorlalte elemente este afiat doar la apsarea unui buton marcat cu o sgeat, ce face parte integrant din component. JComboBox funcioneaz dup aceleai principii ca i clasa JList. Clasa JTable Clasa JTable permite crearea de componente care s afieze o serie de elemente ntr-un format tabelar, articolele fiind dispuse pe linii i coloane. Un tabel poate fi folosit doar pentru afiarea formatat a unor date, dar este posibil i editarea informaiei din celulele sale. De asemenea, liniile tabelului pot fi marcate ca selectate, tipul seleciei fiind simplu sau compus, tabelele extinznd astfel funcionalitatea listelor. O serie de clase i interfee necesare lucrului cu tabele se gsesc n pachetul javax.swing.table, acesta
fiind aadar cel ce trebuie importat.
2). Tratarea evenimentelor
Interfaa grafic servete interaciunii cu utilizatorul. De cele mai multe ori programul trebuie s fac o anumit prelucrare n momentul n care utilizatorul a efectuat o aciune i, prin urmare, componentele trebuie s genereze evenimente n funcie de aciunea pe care au suferit-o (aciune transmis de la tastatur, mouse, etc.). n limbajului Java, evenimentele sunt instane ale claselor derivate din AWTEvent[4]. Aadar, un eveniment este produs de o aciune a utilizatorului asupra unui obiect grafic, deci evenimentele nu trebuie generate de programator. In schimb, ntr-un program trebuie specificat codul care se execut la apariia unui eveniment. Tratarea evenimentelor se realizeaz prin intermediul unor clase de tip listener (asculttor, consumator de evenimente), clase care sunt definite n pachetul java.awt.event. In Java, orice component poate "consuma" evenimentele generate de o alt component. Dac o clas dorete s rspund unui eveniment utilizator, ea trebuie s implementeze o interfa care s prelucreze evenimentele. Aceste interfee se numesc interceptoare de evenimente (events listeners). Fiecare interceptor trateaz un anumit tip de eveniment, iar o clas poate implementa oricte evenimente are nevoie[9]. Cele mai importante interceptoare de evenimente sunt: . ActionListener - trateaz evenimente de aciune, care sunt generate de aciunea unui utilizator asupra unei componente, cum ar fi execuia unui clic pe un buton. . WindowListener - trateaz evenimente de ferestre, care sunt generate de maximizarea, minimizarea, mutarea sau nchiderea ferestrelor. . MouseListener - trateaz evenimente de mouse, care sunt generate de clicuri cu mouse-ul, de ptrunderea indicatorului mouse-ului pe suprafaa unei componente sau de prsirea acesteia. . FocusListener - trateaz evenimente de selecionare, care sunt generate, atunci cnd o component devine selectat sau cnd pierde acest atribut. . AdjustmentListener - trateaz evenimente de modificare a componentelor. . ItemListener - trateaz evenimente generate de modificarea strii unei componente). . KeyListener - trateaz evenimente care apar cnd utilizatorul apas o anumit tast.