Recapitulare - exercitii
o
2. 3.
4. 5. 6. o
Un Student este caracterizat de numarul de inmatriculare (format din 5 cifre maxim) si de o medie obtinuta. Orice Student este o Persoana. Persoana este caracterizata de atributele: nume si cnp; O Grupa contine Studenti. Clasa Persoana este abstracta; Creati clasele Persoana, Student si Grupa dupa atributele specificate; Grupa contine metode care: 1. aranjeaza studentii in ordine alfabetica dupa nume 2. aranjaza studentii in ordine descresctoare dupa medii 3. Adauga un student la grupa 4. Scoate un student din grupa Encapsulati cele trei clase; Creati o clasa container cu numele Main care sa contina metoda principala si in care sa creati o grupa dintr-un vector de Persoane; Verificati in Main comportamentele clasei Grupa; Clasa Curs este o clasa abstracta; Exista doua tipuri de cursuri: Java si Linux; Fiecare curs este descris de un numar intreg reprezentand gradul de dificultate intre 1 si 10; Un alt atribut al cursului este o instanta de instructor; Clasa Instructor are ca atribute: nume, prenume si cnp; Toate atributele clasei Instructor trebuiesc programate in asa fel incat sa nu poata fi accesibile direct decat din clasa Instructor sau din clasele care o mostenesc pe aceasta;
8. Creati clasele Curs, Java, Linux, Instructor; 9. Creati comportamente in clasa Curs care sa modifice atributele existente; 10. Creati cel putin 3 constructori in clasa Instructor; Cum se numeste aceasta proprietate care permite definirea mai multor metode cu acelasi nume? 11. Este Java un tip de Linux? Dar Linux un tip de Curs? Ce reprezinta aceasta proprietate? o Clasa Element defineste un element chimic; Aceasta contine atributele p,e,n reprezentand numarul de protoni, electroni si neutroni ai elementului; Aceste trei atribute sunt ascunse in clasa; Clasa Substanta contine mai multe instante de Elemente ca atribute; 13. Creati clasele Element si Substanta 14. Creati comportamente ale clasei substanta care: 1. Sa adauge un element la substanta 2. Sa scoata un element din substanta 15. Ce metoda se suprascrie intr-o clasa pentru a afisa proprietati ale unei instante sub forma de sir de caractere? Daca aceasta metoda este suprascrisa atunci unde este ea déjà definita? o Clasa Punct defineste un punct in plan dupa coordonatele x si y; Consideram o Forta descrisa printr-un vector; O instanta de Forta este definita de atributele nume, punct de aplicare si norma; Creati clasele Punct si Forta Creati o metoda de clasa care calculeaza suma algebrica intre doua forte; Prin ce se deosebeste o metoda de clasa de un comportament?
Selecteaza Modul:
7.1 Ce este o interfata grafica? Cu siguranta stiti deja ce este o interfata grafica. Pe numele ei GUI (Graphical User Interface), interfata grafica reprezinta un mod elegant de interactiune a unui sistem cu utilizatorul. Pana acum toate aplicatiile software create de noi afisau mesaje sau primeau informatie din consola. Consola reprezinta primul mod dezvoltat vreodata prin care un program afisa sau primea informatii de la utilizator. Dupa cum deja ati vazut, in consola nu se lucreaza decat cu siruri de caractere, ele reprezentant atat datele de intrare (care trebuiesc procesate de program) cat si datele de iesire (rezultatul executiei aplicatiei); Consola este inca folosita si va ramane in continuare de o utilitate importanta pentru anumite tipuri de aplicatii. De exemplu aplicatiile de tip server in general preiau informatie si o afisaza intr-o consola. Acest lucru se intampl deoarece acest mod de lucru permite pastrarea neocupata si utilizarea de cat mai putina memorie interna (RAM); Serverul, care este o aplicatie ce ofera servicii printr-un proces daemon (ce ruleaza constant pe o masina asteptand conexiuni de la clienti) nu are nevoie in principal de afisari de informatie pe computerul care ruleaza. Singurele modificari care pot fi facute poate reprezinta configurarile si afisarea permanenta a statusului de executie; Pentru acest lucru nu este nevoie de mai mult decat consola; Totusi, pentru un utilizator neexperimentat (care nu lucreaza in domeniul IT), consola poate parea greoaie la utilizare. De aceea intergata grafica este apreciata de majoritatea utilizatorilor de computere, devenind in unele cazuri chiar obiect comercial care determina numarul de clienti (utilizatori); De exemplu in cazul Microsoft Windows, accentul s-a pus din ce in ce mai mult pe dezvoltarea unei interfete grafice aspectuase in detrimentul vitezei de executie sau al resurselor folosite (memorie, procesor ... etc); Interfata grafica este formata din imagini, text si componente care interactioneaza cu utilizatorul prin evenimente; Componentele reprezinta entitati care interactioneaza cu utilizatorul: butoane, meniuri, scrollbars, ferestre, panouri ..etc. Orice aplicatie care este destinata folosirii de catre persoane fara experienta in domeniu IT, dar care sa poata invata usor modul de utilizare al unei aplicatii trebuie sa aiba ca mod de interactiune o interfata grafica.
7.2 Componente si modul de functionare Componentele reprezinta entitatile prin care utilizatorul interactioneaza cu aplicatia. Din punctul de vedere al programaturului , orice componenta este un obiect; Fiind obiecte, acestea sunt create fiecare cu ajutorul unei clase, avand atribute si comportamente; Un aspect important al oricarei componente este urmatorul: Fiecare dintre acestea poate fi plasata pe un sistem de axe Cartezian. In felul acesta componenta se afla cu originea in coltul din stanga sus, iar in jos si la dreapta axele cresc; Sistemul de masurare al interfetelor grafice este in pixeli. Pixelul este cea mai mica unitate (indivizibila) de os singura culoare a unei imagini; Exemple de componente pe care le vom folosi: • • • • • • • • • • • •
applet fereastra buton bara de meniu meniu item de meniu buton de selectie checkbox buton de selectie radio panou ferestra de dialog bara de defilare (scrollbar) eticheta
Componentele se divid in doua categorii: containere si non-containere; Containrerele sunt acele componente care pe interfata lor pot sustine alte componente; De exemplu fereastra este un containter, deoarece pe ea vom amplasa diverese ale componente cum ar fi butoane, meniuri ...etc; Primele titpuri de interfete grafice pe care le vom crea sunt cu ajutorul java.awt.*;
Selecteaza Modul:
7.3 Appleturile - java.applet Appleturile reprezinta programe scrise cu Java. Acestea, spre deosebire de alte programe nu sunt de sine statatoare (nu au o metoda main); Ele se folosesc de metoda principala a altor programe pentru a se executa (cel mai des, de un web browser); Appleturile sunt cele mai simple aplicatii cu interfata grafica scrise cu Java. Pentru a dezvolta astfel de programe folosim clasa Applet din pachetul java.applet; Un applet are definite doua metode pe care va trebui sa le suprasriem in vederea modificarii interfetei grafice a acestuia; Metodele sunt definite in clasa Applet pe care va trebui sa o mosteneasca orice clasa care defineste un applet; 1. paint(Grpagics g) 2. init() Metoda paint() va fi suprascrisa pentru a desena folosind diferite comportamentele ale obiectului Graphics pe interfata appletului; Metoda init() va fi suprascrisa atunci cand trebuie sa adauga componente pe applet; Aceste functii ale metodelor paint() si init() nu trebuiesc incurcate; In paint() nu pot fi adaugate componente asa cum in init() nu se poate desena pe interfata appletului; Clasa Graphics defineste uramtoarele comportamente cu ajutorul carora putem modifica interfata: • • • • •
drawLine(int x1,int y1, int x2,int y2) - pentru desenarea unui segment de dreapta definit de punctele de coordonate A(x1,x2) si B(y1,y2); drawString(String line, int x,int y) - pentru desenarea unui sir de caractere la coordonarele x,y drawRect(int x,int y, int l,int h) - pentru desenarea unui dreptunghi cu coltul stanga sus la coordonatele x,y si o anumita latime l si inaltime h drawOval(int x,int y, int l,int h) - pentru desenarea unei elipse perfect icadrata de dreptunghiul cu coordonatele date ca in metoda drawRect setColor(Color c) - pentru setarea unei culori de desenare
Selecteaza Modul:
7.4 Definirea culorilor - clasa Color Intr-un sistem digital culorile se definesc prin standardul aditiv RGB (Red Green Blue); Acest standard defineste culori prin amestecul unor cantitati din fiecare dintre cele trei culori rosu, verde si albastru; Prin amestecul tuturor in cantintate maxima rezulta alb, iar prin absenta completa a culorilor rezulta negru; Fiecarei culori ii este rezervat un byte de informatie adica valori intre 0 si 255; Astfel o culoare poate fi reprezentata cu clasa Color prin definirea instantelor cu urmatorul construcotor: •
Color(int red,int green, int blue)
De exemplu: Color c1 = new Color(255,0,0); // defineste rosu aprins Fiecare parametru poate lua valori intre 0 si 255, reprezentant cantitatile de culoare care se amesteca; Exista posibilitatea de a defini culori cu transparenta; Pentru asta se foloseste construcotrul cu patru parametrii, ultimul reprezentand transparenta care ia de asemenea valori intre 0 si 255; •
Color(int red,int green,int blue,int alpha)
Culorile cunoscute sunt deja definite si reprezinta constante in clasa Color; Acestea pot fi accesate prin dereferentiere: • • • • •
Color.red Color.blue Color.yellow Color.green Color.violet
Culorile se modifica pe o instanta Graphics prin metoda setColor(); • •
g.setColor(Color.red) // prin folosirea constantei g.setColor(new Color(200,100,0)) // prin definirea unei culori cu ajutorul unuia dintre constructori
Selecteaza Modul:
7.5 Butoane - java.awt.Button Cu ajutorul clasei Button din pachetul java.awt putem defini componente de tip buton; Constructori: • •
Button() Button(String s)
Exemple: • • •
Button b1 = new Button(); Button b2 = new Button("Textul de pe buton"); Button b3= new Button(new String("Textul de pe buton"));
Adaugarea oricarei componente pe Applet se face cu metoda add(Component c) mostenita din clasa Applet; Exemplu: Button b = new Button("Butonul meu"); add(b); // adaugarea butonului Nu uitati ca adaugarea oricarei componente se face prin suprascrierea metodei init()
Selecteaza Modul:
7.6 Manageri de positionare (Layout Managers) Un manager de pozitionare reprezinta un obiect definit de o clasa care se ocupa de modul in care sunt aranjate compoentele pe un container; (De exemplu putem defini un mangager de poziionare pentru a amplasa intr-un anumit fel un buton pe un applet); Vom invata trei tipuri de manageri de pozitionare: 1. FlowLayout 2. BorderLayout 3. GridLayout FlowLayout este clasa ce pozitioneaza componentele la dreapta, la stanga sau centrat sus; BorderLayout ii pozitioneaza in functie de marginea containerului, iar GridLayout in functie de un grid imaginar cu coodronate date la construire; Orice manager se pozitionare se seteaza cu ajutorul metodei setLayout() mostenita din clasa Applet; Exemplu: setLayout(new FlowLayout()); Clasa FlowLayout are constante care definesc locatia unde sunt aranjate componentele: • • •
FlowLayout.LEFT FlowLayout.CENTER FlowLayout.RIGHT
Exemplu: setLayout(new FlowLayou(FlowLayout.LEFT)) Daca nu se precizeaza constanta, atunci ele sunt default setate CENTER; Clasa BorderLayout are cinci constante care sunt specifice la adaugarea fiecarei componente; Managerul se seteaza setLayout(new BorderLayout()) dupa care se specifica o constanta la adaugarea unei componente din cele 5: • • • • •
BorderLayout.CENTER BorderLayout.NORTH (pentru partea de sus) BorderLayout.SOUTH (pentru partea de jos) BorderLayout.WEST (pentru stanga) BorderLayout.EAST (pentru dreapta)
Exemplu: add(b, BorderLayout.NORTH) // unde b este un buton spre exemplu Pentru GridLayout cosntrucotrul este GridLayout(int a,int b); a reprezinta numarul de linii si b numarul de coloane ale gridului; O componeta se adauga dupa setarea gridului cu metoda add cu un singur parametru si va completa intotdeauna urmatoarea casuta libera a gridului de la stanga la dreapta de sus in jos;
Selecteaza Modul:
7.7 Panouri Panourile sunt componente de tip container. Acestea sunt folosite in formatarea interfetei grafice prin adaugarea pe alte containere in influenta diferitilor manageri de pozitionare; Clasa Panel din java.awt defineste aceste componente dupa constructorii: • •
Panel(); Panel(LayoutManaget lm)
Selecteaza Modul:
7.8 Componente text Componentele text sunt folosite pentru a-i permite utilizatorului sa introduca siruri de caractere; Exista doua tipuri de componente text: • •
TextField (pentru texte de o singura linie) TextArea (pentru texte pe mai multe linii)
Cele doua clase sunt parte a pachetului java.awt; TextField se construieste: •
TextField(int c) // c reprezinta dimensiunea in latime a textfield-ului
TextArea se construieste: •
TextArea(int r,int c) // r,c reperezentand randurile si coloanele componentei text
Exemple: • •
TextArea ta = new TextArea(5,7); TextField tf = new TextField(10);
Continutul campului text se poate lua cu ajutorul metodei: •
getText() - care returneaza un String
Constinutul poate fi setat cu ajutorul setterului: •
setText(String s)
Pentru TextArea se poate adauga text la continutul actual prin metoda append(String s);
Selecteaza Modul:
8.1 Evenimente Evenimentele reprezinta unul dinre modurile in care un utilizator interactioneaza cu interfata grafica. Dezvoltarea de aplicatii software care se bazeaza pe evenimente pentru interactiunea cu utilizatorul se numeste event-driven programming; Exemple de evenimente sunt: • • • • • • • •
apasarea pe butonul unui mouse tinerea apasata a unui buton eliberarea unui buton drag-and-drop apasarea unei taste eliberarea unei taste miscarea cursorului intrarea sau iesirea cursorului pe sau de pe o componenta
In urma unui astfel de eveniment programul poate fi conceput sa execute un anumit set de instructiuni; Un eveniment este asociat unei componente; Altfel spus este nevoie sa precizam mai intai la ce componenta se refera un anumit eveniment; Acest lucru se poate face cu ajutorul unui ascultator (listener); Un ascultator este un obiect care dezvolta un fir de executie separat ce asteapta un eveniment de un anumit tip pentru o componenta pe care a fost setat; Un eveniment este un obiect care se instantiaza in momentul in care utilizatorul interactioneaza cu interfata grafica; Pasii pentru descrierea unui eveniment sunt: 1. Aplicarea unui ascultator pe o componenta 2. Scrierea instructunilor care se executa dupa ce s-a returnat un astfel de eveniment
Selecteaza Modul:
8.2 Click pe butoane Unui buton definit cu ajutorul clasei Button din pachetul java.awt i se poate atasa un ascultator pentru un eveniment de tip ActionEvent; Acest eveniment este de fapt cel ce reprezinta un click pe buton; Mai intai va trebui sa implementam interfata ActionListener; Aceasta se afla in pachetul java.awt.event.* care trebuie importat; Pe butonul pe care vrem sa atasam ascutlatorul vom folosi metoda addActionListener() care primeste ca paramentru o instanta a clasei care suprascrie metoda actionPerformed(ActionEvent ev); La suprascrierea acestei metode scriem instructiunile care trebuiesc executate la intalnirea evenimentului; O a doua metoda este trimiterea ca parametru metodei addActionListener() a unei instante definite abstract prin suprascrierea clasei si a metodei actionPerformed()
Selecteaza Modul:
8.3 MouseListener MouseListener este interfata care contine metodele ce trebuiesc suprascrise pentru cinci evenimente diferite ce pot fi executate cu ajutorul mouseului pe o componente oarecare: voidmouseClicked(MouseEvent e) Pentru click cu mouseul pe o componenta voidmouseEntered(MouseEvent e) Pentru intrarea cu cursorul pe o componenta voidmouseExited(MouseEvent e) Pentru iesirea de pe o componenta a cursorului mousePressed(MouseEvent e) Pentru apasarea unui buton mouseReleased(MouseEvent e) Pentru eliberarea unui buton
Daca implementati interfata MouseListener va trebui sa suprascrieti toate metodele descrise in tabelul de mai sus, chiar daca doar o parte au un rost in scrierea programului; Regula este urmatoarea general valabila: La implementarea unei interfete trebuiesc suprascrise toate metodele publice definite in acea interfata;
Selecteaza Modul:
8.4 MouseMotionListener Interfata MouseMotionListener contine metode care trebuiesc suprascrise pentru evenimente de miscare ale mouseului: • •
drag (apasarea butonului si miscarea cursorului) move (miscarea cursorului) mouseDragged(MouseEvent e) pentru evenimentul de drag mouseMoved(MouseEvent e) pentru miscarea cursorului
Pentru a atasa un astfel de ascultator pentru oriceare dintre aceste doua metode folosim metoda addMouseMotionListener();
Selecteaza Modul:
8.5 MouseEvent MouseEvent este clase care defineste un eveniment specific mouseului; Instante de MouseEvent sunt trimise aproape pentru fiecare tip de eveniment specific mouseului; Din acest motiv voi arata cateva comportamente ale acestui obiect care pot fi folosite in aplicatii; • • • • • • • • •
getButton() - returneaza o constanta din care poate fi aflat butonul de pe mouse de pe care s-a apasat getClickCount() - returneaza numarul de click-uri single-click, double-click ... etc sub forma unui int getModifiersEx() - returneaza sub forma unui int tastele care au fost tinute apasat atunci cand s-a facut click cu mouse-ul "ctrl", "shift", "ctrl-shift" ...etc getMouseModifiersText(int mod) - traduce numarul care reprezinta tastele tinute apasat la click in siruri de caractere care reprezinta exact numele tastelor ca mai sus getPoint() - returneaza un Point reprezentad locatia cursorului pe componenta getX() - returneaza coordonata X a punctului in care se afla cursorul relativ la componenta getY() - returneaza coordonata Y a punctului in care se alfa cursorul relativ la componenta getXOnScreen() - returneaza coordonata X a punctului in care se alfa cursorul relativ la ecran getYOnScreen() - returneaza coordonata Y a punctului in care se alfa cursorul relativ la ecran
Metoda getButton este in general folosita impreuna cu constantele : • • • •
BUTTON1 BUTTON2 BUTTON3 NOBUTTON
Valoarea returnata de metoda se compara cu una din constante si se afla in felul acesta de pe ce buton s-a apasat sau in cazul in care evenimentul nu a fost creat de catre mouse acesta va fi egal cu NOBUTTON;
Selecteaza Modul:
8.6 MouseWheelListener si MouseWheelEvent MouseWheelListener este o interfata care contine metoda ce trebuie suprascrisa pentru verificarea miscarii rotitei mouseului; •
mouseWheelMoved(MouseWheelEvent ev)
Evenimentul specific rotitei mouseului este MouseWheelEvent
Selecteaza Modul:
8.7 MouseAdapter Folosirea interfetelor prezentate in lectiile anterioare are un dezavantaj semnificativ; De exemplu pentru interfata MouseListener daca dorim sa folosim doar evenimentul Click adica metoda mouseClicked(MouseEvent ev) atunci va trebui oricum sa le suprascriem si pe celelalte 5 metode; MouseAdapter este o clasa care ne scapa de munca nefolositoare de suprascriere a acestor metode de fiecare data cand folsim un eveniment; Aceasta clasa poate fi folosita pentru oricare dintre evenimentele prezentate in lectiile antorioare referitoare la mouse sau la rotita mouseului; Cu alte cuvinte in locul interfetelor descrise anterior vom folosi doar clasa MouseAdapter; Totusi va trebui sa pastram in functie de tipul evenimentului ascultatorul corespunzator: • • •
addMouseListener() addMouseMotionListener() addMouseWheelListener()
Fiind o clasa care suprascrie metodele in toate celelalte interfete, la folosirea MouseAdapter nu mai este nevoie sa suprascrem decat metodele care ne sunt necesare (cele pe care le folosim);
Selecteaza Modul:
8.8 ComponentListener si ContainerListener Metode din interfata ComponentListener: componentHidden(ComponentEvent e) Aruncat daca componenta a fost facuta invizibila componentMoved(ComponentEvent e) Aruncat daca componenta a fost mutata componentResized(ComponentEvent e) Aruncat daca s-a modificat dimensiunea componentei componentShown(ComponentEvent e) Aruncat daca componenta a fost facuta vizibila
Metode din interfata ContainerListener: componentAdded(ContainerEvent e) Aruncat cand s-a adaugat o componenta pe container componentRemoved(ContainerEvent e) Aruncat cand a fost scoasa o componenta de pe container
Selecteaza Modul:
8.9 TextListener Metoda textValueChanged(TextEvent ev) este suprascrisa pentru evenimentul invocat atunci cand in componenta text pe care am atasat ascultatorul este modificat continutul; Pentru a executa instructiuni la modificarea continutului unei componente text trebuie sa folosimt interfata TextListener si sa suprascriem metoda textValueChanged();
8.10 WindowAdapter si WindowEvent WindowAdapter este clasa ce reuneste trei interfete ce contin metode referitoare la evenimentele pe ferestre; Asemanatoare clasei MouseAdapter, cu ajutorul acestei clase putem suprascrie numai metodele de care avem nevoie atunci cand folosim evenimente pe ferestre; windowActivated(WindowEvent e) Apelata la activarea unei ferestre windowClosed(WindowEvent e) Apelata la inchiderea unei ferestre windowClosing(WindowEvent e) Apelata in timpul procesului de inchidere windowDeactivated(WindowEvent e) Apelata la dezactivarea unei ferestre. windowDeiconified(WindowEvent e) Apelata la deiconificarea unei ferestre windowGainedFocus(WindowEvent e) Apelata cand ferestra obtine focusul; windowIconified(WindowEvent e) Apelata la iconificarea unei ferestre windowLostFocus(WindowEvent e) Apelata atunci cand fereastra pierde focusul windowOpened(WindowEvent e) Apelata la deschiderea ferestrei; windowStateChanged(WindowEvent e) Apelata la modificarea starii ferestrei;
WindowEvent este evenimentul specific ferestrelor; Pentru o fereastra se numeste stare de focus perisoada in care tastatura si combinatiile de taste se refera direct la acea fereastra; Atunci cand tastatura nu se mai refera direct la fereastra ci la o alta compoenenta, se numeste ca fereastra "a pierdut focusul"; O fereastra ese activa cand se poate lucra cu ea si inactiva atunci cand nu se poate lucra cu ea; Iconificarea reprezinta scoaterea ferestrei din taskar, iar deiconificarea este operatiunea inversa;
Selecteaza Modul:
9.1 Crearea ferestrelor cu SWING - JFrame Clasa JFrame este cea pe care o vom folosi pentru a crea ferestre; Ca orice alta clasa care reprezinta componente swing ea se afla in pachetul javax.swing; Pentru ca este un container vom folosi de cele mai multe ori aceasta clasa prin mostenire nu prin instantiere; Altfel spus, vom crea clase care sa reprezinta ferestre si pentru ca acestea sa devina ferestre de tip JFrame ele vor mosteni aceasta clasa; public class Fereastra extends JFrame{ } Daca incercam in acest moment sa folosim clasa fereastra prin instantiere cu construcotrul default acea instanta creata ar reprezenta o fereastra; Pentru a modifica aceasta fereastra adaugandu-i componente pe interfata vom folosi un constructor; public Fereastra(String titlu){ super(titlu); } De obicei acest contructor primeste prin parametru titlul ferestrei si il seteaza prin intermediul constructorului clasei: JFrame(String titlu); Toate componentele vor reprezenta pentru aceasta ferestra atribute si vor fi definite corespunzator inainte de constructor; De obicei componentele de pe o ferestra sunt definite private pentru ca ele au un scop numai in interiorul clasei si nu sunt accesate din exterior; JFrame definieste un container prin urmare se pot atasa manageri de pozitionare unei ferestre pentru a aranja interfata acesteia; Sunt folositi aceeasi LayoutManagers din java.awt si de asemenea se seteaza folosind metoda setLayout(); Default o fereastra JFrame are setat managerul BorderLayout cu constanta CENTER; De asemenea aceasta este invizibila si trebuie facuta vizibila dupa instantiere folosind metoda setVisible(boolean state); Daca parametrul este false atunci ea este facuta invizibila, daca parametrul este true atunci fereastra devine vizibila; Alte metode prin intermediul careia putem modifica atribute ale ferestrei JFrame: • • • • •
setSize(int w, int h) setLocation(int x, int y) setBounds(int x, int y,int h,int w) setResizable(boolean state) setIconImage(Image i)
Metoda add(Component c) este folosita pentru a adauga pe fereastra o componenta exact ca in cazul Appleturilor; Metoda add() este mostenita din clasa Container; Selecteaza Modul:
9.2 Crearea butoanelor - JButton
Un buton poate fi creat folosind clasa JButton; De obicei butonul este contruit folosind unul dintre constructorii: • • •
public JButton(); // un buton fara text public JButton(String text) // un buton cu text dat ca parametru la construire public JButton(String text, Icon ico) // buton cu text si imagine
Textul de pe buton poate fi modificat folosind metoda setText(String text) sau poate fi preluat folosind metoda getText(); Metodele setLabel() si getLabel() sunt considerate obsolete si nu se mai folosesc in prezent; Din moment ce butonul reprezinta o componenta, poate fi adaugat pe un container folosind metoda add(Component c) a containerului; Butonul JButton este sensibil la evenimente de tip ActionEvent, asadar modalitatea de atasare a ascultatorilor si de creare evenimente este similara butoanelor Button din pachetul java.awt;
9.3 Crearea componentelor text Vom folosi trei tipuri de componete text: JTextField, JTextArea si JPasswordField; Componenta JTextFiled este un camp de text cu un singur rand pe care pot incapea mai multe caractere; In general aceasta componenta este folosita pentru a introduce un text de dimensiuni mici; Componenta JTextArea este un camp de text care permite introducerea unui text pe mai multe randuri, deci aceasta componenta este folosita pentru texte de dimensiuni mai mari; Metoda folosita pentru preluarea textului dintr-o componenta text este: getText() care returneaza o instanta de String; Pentru a modifica textul dintr-un camp de text se foloseste metoda setText(String text) Componenta JTextArea are in comportament si metoda append(String text) care permite adaugarea unui text la componenta; Componenta JPasswordField este similara componentei JTextField, doar ca , aceasta ascunde caracterele introduse de utilizator ca in cazul unui camp pentru introducerea parolei obisnuit;
Selecteaza Modul:
9.4 Butoane de selectie Clasele JCheckBox si JRadioButton definesc componente de tip butoane de selectie; Standard, butoanele JCheckBox sunt folosite pentru a crea liste de optiuni de tip multiple-choice (din care poti selecta mai multe variante), iar JRadioButton pentru crearea de liste de tip single-choice (din care se poate selecta o singura optiune); Astfel pentru butoanele JRadioButton adaugam o noua clasa ButtonGroup cu ajutorul careia precizam care sunt butoanele din care se selecteaza o singura optiune; ButtonGroup defineste un grup de butoane; Din butoanele ce apartin aceluiasi grup nu putem selecta decat o singura optiune; Ambele tipuri de componente se creaza similar butoanelor JButton; In general acestea nu sunt folosite cu evenimente si prin verificari ale starilor acestora (se verifica daca este sau nu select la un anumit eveniment); Verificarea starii unei astfel de componente se face folosind medoda isSelected() care returneaza true daca butonul este bifat si false daca nu este bifat; Un grup de butoane se creaza astfel: ButtonGroup bg = new ButtonGroup(); Un buton poate fi adaugat la grupul de butoane bg (instanta creata mai devreme) folosind metoda add(Component c); Daca este cazul se poate folosi un eveniment de modificare a starii unui buton care este definit in pachetul javax.swing.event; Evenimentul se atasaza similar celor din java.awt.event; folosind ascultatorul ItemListener; Selecteaza Modul:
9.5 Meniuri Pentru a crea meniuri avem la dispozitie cinci clase: JMenuBar, JMenu, JMenuItem, JRadioButtonMenuItem, JCheckBoxMenuItem; Intai trebuie creata o instanta de bara de meniu cu ajutorul clasei JMenuBar; Pe aceasta instanta vor trebui adaugate meniurile; Instanta clasei JMenuBar este setata pe fereastra folosind metoda setJMenuBar(JMenuBar mb); Clasa JMenu este cea care defineste un meniu ce poate fi adaugat pe bara de meniu; In general este folosit constructorul: •
public JMenu(String titlu) // titlul meniului Ex: File, Edit, Insert ...etc
Meniul este adaugat pe bara de meniu folosind metoda add(); JMenuBar mb = new JMenuBar(); JMenu m = new JMenu("File"); mb.add(m); // adaugam meniul pe bara de meniu Folosind acceasi metoda add() poate fi adaugat un meniu intr-un alt meniu creindu-se astfel submeniuri; De asemenea se pot adauga intr-un meniu butoane (JMenuItem) folosind metoda add(); Un buton specific unui meniu se creeaza folosind unul dintre constructorii: • •
public JMenuItem(String text) public JMenuItem(String text, Icon ico)
Exista de asemenea si butoane de selectie care pot fi adaugate in meniuri; Acestea pot fi create cu ajutorul clasele JRadioButtonMenuItem si JCheckBoxMenuItem si functioneaza similar celor definite cu clasele JRadioButton si JCheckBox;
Selecteaza Modul:
9.6 Etichete - JLabel O eticheta reprezinta cea mai simpla componenta; Aceasta este folosita pentru afisarea unui text static in cele mai multe cazuri; O eticheta se creaza folosind clasa JLabel: •
public JLabel(String text)
si este adaugata pe un container folosind metoda add() a containerului;
Textul de pe o eticheta poate fi modificat sau preluat folosind metodele getText() si setText(String text)
9.7 Panouri - JPanel Un panou reprezinta un container asemenea unei ferestre; Acesta este folosit prin adaugarea pe alte containere (in general ferestre sau alte panouri); Panoul poate fi construit folosind constuctorii: • •
public JPanel() public JPanel(LayoutManger lm)
O componenta poate fi adaugata pe un panou folosindaceeasi metoda add() ca si in cazul ferestrelor, mostenita de la clasa Container;
9.8 JScrollPane JScrollPane este o componenta folosita pentru adaugarea de bare de defilare pentru o alta compoenta care ar putea depasi dimensiunile containerului in care este adaugata; Instanta JScrollPane nu este folosita in actiunile directe pe care le are componente pe care o sustine; La construire instantei i se da o componenta pentru care este creata si pe care adauga bare de defilare (scrollbars); Apoi instanta JScrollPane este adaugata pe container in locul componentei din instanta JScrollPane; Exemplu: JTextArea ta = new JTextArea(4.5); JScrollPane jsp = new JScrollPane(ta); add(jsp); ta.setText("Un text");
10.1 Tipuri generice Tipurile generice reprezinta entitati abstracte, care nu au definit un prototip, dar care pot fi tratate in interiorul unei clase, pentru ca mai apoi sa fie precizat cu exactitate prototipul la care se refera. In felul acesta poate fi creat un nou pototip flexibil, ale carui tipuri de atribute sunt dinamice, putand fi modificate de la o instanta la alta. Sa presupunem urmtorul scenariu: Clasa Animal defineste instante ce au ca unul dintre atribute chiar instante de animale. Insa Animal este si cainele si tigrul si pisica. Cum poate fi creata o clasa care sa definesca instante in care un atibut sa aiba mai intai tipul Caine, apoi Tigru si in cele din urma Pisica;
Clasa Animal defineste un prototip ce are ca atribut un tip generic (abstrct / neprecizat la
definire):
In clasa Main sunt definite trei instante diferite de Animal:
In acest fel se spune ca atributul clasei generice este dinamic. Atributul generic poate lua orice tip, atata timp cat va fi precizat la instantiere:
Datorita faptului ca sunt neprecizate ca prototip, tipurile generice nu pot face parte din tipuri statice. Acestea pot fi tratate in clasa doar ca atribute (tipuri non-statice). De asemenea nu poate fi instantiata o matrice de tipuri generice:
Tipurile generice pot fi folosite in parametrii metodelor non-statice dar si ca tipuri de return:
O clasa poate defini mai multe tipuri generice. Acestea vor fi separate prin virgula:
Selecteaza Modul:
10.2 Mostenirea tipurilor generice Un tip generic poate fi definit ca mostenitor al unei alte clase pentru a restrange dinamismul dat tipului. In felul acesta poate fi creata o restrictie a tipului cu care poate fi instantiat genericul; De exemplu in situatia de mai jos atributul dat genericului trebuie sa se afle in arborele de mostenire al clasei JPanel, sub aceasta pentru a putea inlocui tipul abstract:
La instantiere:
Tipul generic in acest caz poate fi instantiat cu orice clasa ce mosteneste JPanel:
Totusi, spre deosebire de ultimul exemplu (clasa Animal), tipul generic nu mai poate fi dat de orice clasa:
Un tip generic poate fi mostenit la definire. In acest fel poate fi creata o dependinta intre tipurile generice ale unei clase:
Selecteaza Modul:
10.3 Colectii Pachetul java.util ofera un set de interfete si clase numite Java Collections Framework cu ajutorul carora, instante de diferite tipuri pot fi grupate in entitati numite colectii asupra carora se pot efectua algoritmi. Cele mai importante interfete si clase din Java Collections Framework sunt: Interfete: • • • • • • • • •
Collection List Set Queue SortedSet NavigableSet Map SortedMap NavigableMap
Clase: • • • • • • • •
HashSet ArrayList Vector LinkedList TreeSet Hashtable HashMap TreeMap
Clase de algoritmi: • •
Arrays Collections
Sunt patru tipuri de colectii: • • • •
Liste - grupuri de entitati Multimi (Sets) - grupuri de entitati unice Map - grupuri de entitati identiicate cu un ID unic Queues (Cozi) - entitati ordonate intr-un mod in care urmeaza sa fi procesate
Selecteaza Modul:
10.4 Collection, List, Set, Map si Queue Interfata Collection este radacina intregului arbore ce reprezinta frameworkul Collection. O colectie reprezinta un grup de obiecte denumite general elemente. Interfata List defineste o lista. O lista este o colectie de elemente ordonate, identificate printr-un id. Elementele pot fi accesate prin intermediul identificatorului, pot fi parcurse sau scoase din lista. Lista permite adaugarea elementelor duplicat. Interfata List defineste un tip generic E (element) care poate fi precizat la crearea listei.
Interfata Set defineste o colectie similara unei multimi matematice. Un obiect poate fi adaugat sau scos din colectie. Colectia nu permite adaugarea elementelor egale (pentru care metoda equals() returneaza true). De asemenea poate fi verificat faptul ca un element apartine unui Set.
Interfata Map defineste doua tipuri generice K si V. K se numeste key (cheie) si V se numeste value (valoare). Colectia atribuie unei chei un element ca valoare.
Interfata Queue defineste o interfata similara unei structuri de coada. Queue contine metode care adauga un element la capatul cozii, care preia primul element din coada si il sterge sau care doar preia primul element din coada. O coada functioneaza standard pe principiul FIFO (First In First Out).
Selecteaza Modul:
10.5 List Pentru instantierea unei liste este folosita una dintre clasele: • •
•
ArrayList - folosita in principal pentru parcurgeri rapide, aceasta clasa defineste ceva similar unei matrici care poate creste dinamic. Vector - una dintre cele mai vechi colectii Java. Este similara cu ArrayList dar metodele definite de aceasta clasa sunt sincronizate pentru siguranta apelului in fire de executie separate LinkedList - Similara unei liste inlantuite. Fiecare element are legatura cu doi vecini. Clasa poate fi usor folsita pentru implementarea structurilor de coada si stiva.
Folosirea clasei Vector:
Clasa LinkedList: Instantele LinkedList pot fi de asemenea folosite cu o zona de memorie a interfetei List pentru a restrage metodele la cele ale interfetei. De asemenea clasa poate fi instantiata in propria zona de memorie ce ofera posibilitatea accesului si la alte metode comportament specifice:
Metode din clasa LinkedList: • • • • • • •
add(E e); addFirst(E e); addLast(E e); getFirst(); getLast() removeFirst() removeLast()
Selecteaza Modul:
10.6 Set Interfata Set nu permite duplicate in elementle adaugate colectiei. Pentru instantiere este folosita una dintre clasele: • • •
HashSet LinkedHashSet TreeSet
Clasa HashSet foloseste un hash pentru identificarea elementelor. Clasa poate fi folosita pentru definirea unei colectii care nu ordoneaza elementele si nu permite duplicat in inregistrari.
Se poate observa din exemplu ca elementele nu sunt ordonate cat si ca acestea nu pot fi adaugate duplicat. Clasa LinkedHashSet defineste o structura HashSet in care elementele sunt ordonate. Elementele vor fi afisate in ordinea introducerii.
In continuare nu este permisa adaugarea elementelor egale.
Clasa TreeSet descrie o colectie de tip set sortata. O colectie sortata aranjeaza elementele la introducere dupa un algoritm. TreeSet este un arbore binar echilibrat. Algoritmul dupa care elementele sunt ordonate este Red-Black Tree.
Selecteaza Modul:
10.7 Map Collectia de tipul Map identifica printr-o cheie unica valori adaugate. Fiecare element este o pereche "key-value". Clasele care pot fi folosite pentru a crea o astfel de colectie sunt: • • • •
HashMap Hashtable LinkedHashMap TreeMap
HashMap este cea mai simpla colectie de tip Map. Aceasta nu sorteaza si nu ordoneaza elementele.
Se observa faptul ca elementele nu sunt ordonate dupa adaugare si nici sortate. Cheile pot fi obinute si parcurse cu un Iterator. Cheia este unica, prin urmare in functie de aceasta poate fi preluata valoarea.
Clasa Hashtable este, similar clasei Vector, una dintre cele mai vechi clasedin Java API. In prezenta versiune, clasa defineste o tabela de dispersie similar clasei HashMap, dar ofera metode sincronizate pentru folosirea colectiilor din mai multe fire de executie in desfasurare. Colectia LinkedHashMap este similara colectiei HashMap, dar ordoneaza elementele dupa ordinea introducerii:
TreeMap defineste o colectie sortata si ordonata de tip Map.
Selecteaza Modul:
10.8 Clasa Collections Clasa Collections din pachetul java.util defineste algoritmi ca metode de clasa ce pot fi folosite asupra colectiilor. Sortarea unei liste:
Ordonare inversa:
Amestecarea (shuffle):
Extragerea minimului sau a maximului:
Rotatia elementelor: Initial:
Dupa ciclarea cu 4 elemente:
Interschimbarea a doua elemente (swap):
Selecteaza Modul:
10.9 Fire de executie Firele de executie pot fi imaginate ca secvente de instructiuni ce se desfasoara in paralel independent in cadrul unui proces. Instructiunile executate de un fir de executie (numit Thread) au acces la aceleasi zone de memorie. Firele de executie sunt create fie prin mostenirea clasei Thread, fie prin implementearea interfetei Runnable. Orice clasa care mosteneste Thread sau implementeaza Runnable defineste instante care pot porni un fir de executie. Instructiunile firului de executie sunt date de comportamentul run() ce trebuie suprascris din clasa Thread sau din interfata Runnable. Exemplul de mai jos defineste un fir de executie prin mostenirea clasei Thread:
Dupa crearea unei instante a unui fir de executie, pentru a porni firul de executie se apeleaza metoda start(), comportament al instantei firului de executie mostenit de la clasa Thread.
Fiecare instanta reprezinta un fir de executie ce poate fi pornit:
Ultimul exemplu, din imaginea de mai sus reprezinta un program cu trei fire de executie. Unul este firul principal de executie din care sunt pornite alte doua. instructiunile celor trei fire de executie dupa pornirea fiecaruia se desfasoara simultan, independent unul de celalalt. Metoda sleep() , definita static in clasa Thread poate fi folosita pentru adormirea firului de executie timp de un numar de milisecunde. Exista urmatoarele doua supraincarcari ale metodei sleep(): •
sleep(int milisecunde)
•
sleep(int milisecunde, int nanosecunde)
In exemplul de mai jos, firul de executie este adormit 300 milisecunde dupa fiecare iteratie a ciclului for. Metoda arunca o exceptie de tip InterruptedException, care trebuie tratata pentru apelul metodei;
10.10 Implementarea interfetei Runnable Metoda de creare a unui fir de executie prin implementarea interfetei Runnable poate fi utila atunci cand clasa care trebuie sa devina fir de executie mosteneste deja o alta clasa:
Se poate crea instanta Thread pe baza instantei Runnable (fereastra care implementeaza
Runnable), iar apoi firul poate fi pornit cu metoda start().
Selecteaza Modul: