1 / 85

Objektno orijentisano programiranje

Objektno orijentisano programiranje. Java, GUI po četak. GUI-ji u Javi. GUI – grafički korisnički interfejs Postoji ogromna funkcionalnost u Javinim bibliotekama klasa za podršku GUI. Sve to nemoguće je obuhvatiti jednom knjigom

taro
Download Presentation

Objektno orijentisano programiranje

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Objektno orijentisano programiranje Java, GUI početak

  2. GUI-ji u Javi • GUI – grafički korisnički interfejs • Postoji ogromna funkcionalnost u Javinim bibliotekama klasa za podršku GUI. • Sve to nemoguće je obuhvatiti jednom knjigom • Samo klasa JFrame sadrži preko 200 metoda uključujući one nasleđene od superklasa • Bićemo jako selektivni u pogledu klasa koje ćemo upoznati i njihovih metoda • Pokrićemo samo ono osnovno što nam je potrebno da kreiramo svoje aplikacije i aplete • Osnovni elementi koji nam trebaju za kreiranje GUI-ja nalaze se u 2 paketa: java.awt i javax.swing.

  3. GUI-ji u Javi • Paketjava.awt je u Javi 1.1 bio primarno skladište klasa za kreiranje GUI-ja ( Abstract Windowing Toolkit ), ali mnoge od klasa koje ovaj paket definiše zamenjene su u Javi 2 klasama iz javax.swing. Mnoge klase, ne sve. • Većina klasa paketa javax.swing koje definišu GUI elemente, tzv. Swing komponente, obezbeđuju dosta unapređene alternative za komponente definisane klasama iz java.awt paketa. • Npr. JButton klasa iz javax.swing u odnosu na Button klasu iz java.awt • Međutim, Swing klase su izvedene i samim tim zavise od osnovnih klasa definisanih u java.awt paketu i to ne možemo ignorisati.

  4. GUI-ji u Javi • Swing klase su deo opštijeg skupa, tzv. Java Foundation Classes ( JFC ) klasa za programiranje GUI-ja. JFC pored Swing klasa sadrži takođe i klase za 2D crtanje iz paketa java.awt.geom i klase koje podržavaju drag-and-drop iz paketa java.awt.dnd . JFC takođe uključuje application program interface (API) definisan u paketu javax.accessibility • Swing klase su fleksibilnije od odgovarajućih klasa iz paketa java.awt, pošto su u potpunosti implementirane u Javi. ( java.awt komponente u velikoj meri zavise od native-koda). Pošto su Swing komponente "čista" Java, nisu ograničene karakteristikama platforme na kojoj se izvršavaju. • Pored dodatne funkcionalnosti i fleksibilnosti Swing komponenata, one imaju i tzv. pluggable look-and-feel svojstvo koje omogućava promenu izgleda komponente. Možemo programski izabrati za komponentu neki od standardnih ili kreirati sopstveni look-and-feel ako želimo. (pluggable look-and-feel je olakšan dizajniranjem klasa na poseban način, tzv. Model-View-Controller arhitekturom – MVC) • MVC nije od posebnog značaja za primenu Swing klasa, ali jeste ako hoćemo da modifikujemo pluggable look-and-feel komponente.

  5. Kreiranje prozora • Osnovni prozor u Javi predstavljen je objektom klase Window, definisane u paketu java.awt • Međutim, objekti ove klase jedva da se ikada koriste direktno jer ova klasa ne obezbeđuje neke osnovne stvari potrebne za prozor aplikacije poput title bar-a i okvira. • Klasa JFrame paketa javax.swing je mnogo korisnija za kreiranje prozora jer nudi obilje mogućnosti. • Njene superklase: java.lang Object Component definiše komponentu, entitet koji se može prikazati Container definiše komponentu koja može sadržati druge kompon. java.awt Window definiše osnovni prozor bez titile bar-a i okvira Frame definiše prozor sa title bar-om i okvirom javax.swingJFrame definiše frame – to je prozor sa proširenim mogućnostima

  6. Kreiranje prozora • Klasa Component definiše osnovna svojstva i metode za sve komponente. Videćemo kasnije da je to bazna klasa za sve Swing komponente • Klasa Container dodaje mogućnost Component objektu da sadrži druge komponente, što je česta potreba • Pošto klasa JFrame ima Container za superklasu, JFrame objekat može sadržati druge komponente. • menu bar treba da sadrži menije npr. a toolbar toolbar dugmad itd. Iz tog razloga klasa Container je takođe bazna za sve klase koje definišu Swing komponente. • Klasa Window dodaje klasi Container metode specifične za prozor, poput rukovanja događajima koji nastaju interakcijom korisnika sa prozorom • Klasa JFrame dodaje klasi Frame mnogo sofisticiranije mogućnosti za crtanje i prikaz drugih komponenti

  7. Kreiranje prozora • Možemo prikazati prozor aplikacije kreiranjem objekta tipa JFrame, pozivom metoda objekta za postavljanje veličine prozora, a zatim pozivom metoda za prikaz prozora • import javax.swing.JFrame; public class TestWindow { // objekat prozor static JFrame prozor = new JFrame("Naslov prozora"); public static void main(String[] args){ int sirinaProzora=400; // sirina prozora u pikselima int visinaProzora=150; // visina prozora u pikselima prozor.setBounds(50,100,sirinaProzora,visinaProzora); // postavljanje velicine i pozicije prozor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); prozor.setVisible(true); // prikaz prozora } }

  8. Kreiranje prozora, TestWindow • Ovaj prozor je potpuno operativan. Moguće je promeniti veličinu prozora, minimizovati ga, zatvoriti aplikaciju klikom na X. • Program će se završiti uredno ako smo korektno uneli kod. Ako dođe do grešaka, to se neće desiti. Ako se iz bilo kog razloga aplikacija ne završi regularno, Ctrl+Alt+Delete, pa se iz Task Manager-a završi aplikacija • U prethodnom programu, objekat tipa JFrame se kreira i smešta kao inicijalna vrednost statičkog atributa klase TestWindow, pa će on biti automatski kreiran kada se učita klasa TestWindow. Argument konstruktora definiše naslov koji će biti prikazan u prozoru aplikacije. • main() metod poziva 3 metoda za objekat prozor. • Metod setBounds() definiše veličinu i poziciju prozora, prva 2 argumenta odgovaraju x i y koordinatama gornjeg levog ugla prozora aplikacije relativno u odnosu na gornji levi ugao ekrana, dok drugi par argumenata određuje širinu i visinu prozora u pikselima

  9. Kreiranje prozora, TestWindow • Koordinatni sistem ekrana ima koordinatni početak (0,0) u gornjem levom uglu ekrana, pozitivna x-osa ide sleva na desno, a pozitivna y-osa odozgo nadole • (50,100) gornji levi ugao prozora • širina prozora 400 • visina prozora 150  donji desni ugao na poziciji (450, 250)

  10. Kreiranje prozora, TestWindow • Stvarna fizička širina i visina prozora zavisiće od veličine ekrana i rezolucije. Za datu veličinu ekrana, što je veća rezolucija, to će prozor biti manji i bliži gornjem levom uglu ekrana. • Metod setDefaultCloseOperation() za objekat tipa JFrame određuje šta se dešava kada zatvorimo prozor, bilo klikom na X bilo izborom Close iz menija koji se prikaže kada kliknemo na Java-ikonicu u gornjem levom uglu prozora • Postoje 4 argumenta koje možemo da koristimo za ovaj metod • U primeru je korišćena konstanta EXIT_ON_CLOSE definisana u klasi JFrame. Njen efekat je: zatvaranje prozora, oslobađanje resursa prozora i komponenti koje on sadrži i završavanje aplikacije • Ostale 3 vrednosti koje možemo koristiti kao argument setDefaultCloseOperation() metoda, definisane su u WindowConstants interfejsu i to su: • DISPOSE_ON_CLOSE okvir i komponente koje on sadrži se uništavaju, ali aplikacija se ne završava • DO_NOTHING_ON_CLOSE operacija zatvaranja prozora neće imati nikakvog efekta • HIDE_ON_CLOSE prozor se samo skriva pozivom metoda setVisible() sa argumentom false. Ovo je default akcija ako ne pozovemo setDefaultCloseOperation() metod. Kada je prozor skriven, uvek se može kasnije ponovo prikazati pozivom metoda setVisible() sa argumentom true.

  11. Kreiranje prozora, TestWindow • Možda želimo da preduzmemo još nešto osim ovih opcija kada korisnik izabere zatvaranje prozora. Npr. da pitamo korisnika da li želi da sačuva podatke koje je unosio pre završetka programa. To uključuje obradu događaja pridruženog Close stavci menija ili Close dugmetu. O tome kasnije. • Metod setVisible() sa argumentom true prikazuje prozor aplikacije preko svih prozora koji su trenutno vidljivi na ekranu • Metodi setBounds() i setVisible() su članovi klase JFrame nasleđeni od klase Component, pa su dostupni za svaku komponentu. Međutim, kao što ćemo videti, obično za ostale komponente ne postavljamo veličinu i poziciju. • Metod setDefaultCloseOperation() definisan je u klasi JFrame, pa je primenljiv samo za JFrame prozor objekte.

  12. Komponente i kontejneri • Komponenta predstavlja grafički entitet koji može biti prikazan na ekranu • Komponenta je svaki objekat klase koja je potklasa klase Component. • Kao što smo videli, JFrame prozor je komponenta, ali postoje i mnoge druge • Na narednom slajdu su prikazane neke od potklasa klase Component, one koje su nama bitne.

  13. Komponente i kontejneri

  14. Komponente i kontejneri • Tipična upotreba ključnih klasa ove hijerarhije: • JFrame koristi se kao osnovni prozor aplikacije. Objekat ove klase ima title bar i mogućnost dodavanja menija i drugih komponenata. Najčešće ćemo praviti potklasu ove klase kako bismo kreirali prozor specifičan za našu aplikaciju • JWindow prozor bez title bar-a i ikona za upravljanje prozorima. Tipično se koristi kao pomoćni prozor aplikacije kada ima više displeja u sistemu • JDialog za kreiranje dijalog prozora koji služi za unos podataka u program na različite načine. Obično kreiramo dijalog kao odgovor na izbor neke stavke menija ili klika na dugme • JApplet bazna klasa za Java 2 aplet – program koji je napravljen da radi ugrađen u web stranu. Moguće je crtati u JApplet, dodavati menije i druge komponente • JComponent potklase ove klase definišu niz standardnih komponenti poput menija, dugmadi, checkbox-ova itd. Koristimo ih za kreiranje GUI-ja aplikacije ili apleta

  15. Komponente i kontejneri • Sve klase izvedene iz Container mogu sadržati druge objekte proizvoljnih klasa izvedenih iz Component. Pošto je klasa Container potklasa klase Component, svaki objekat kontejner je i Component takođe, pa kontejner može sadržati i druge kontejnere • Izuzetak su klasa Window i njene potklase, objekti tipa Window ( ili njene potklase ) ne mogu biti sadržane u drugom kontejneru. Ako to pokušamo biće izbačen izuzetak. • Klasa JComponent je bazna za sve Swingkomponente korišćene u prozoru kao deo GUI-ja, i pošto je ova klasa izvedena iz Container, sve Swing komponente su takođe kontejneri. • Klasa JApplet, koja je bazna za sve Swing aplete, izvedena je iz Component preko klase Container, pa će time aplet naslediti metode iz obe te klase. On takođe nasleđuje metode stare klase Applet koje dalje unapređuje. • Klase JApplet, JFrame, JDialog i JComponent se sve nalaze u paketu javax.swing • Applet je u java.applet, a sve ostale su u java.awt • Uvek ćemo koristiti klasu JApplet za definisanje apleta, pošto je ona značajno bolja od Applet

  16. Window i Frame komponente • Osnovna razlika između JFrame objekta i Window objekta je ta što JFrame objekat predstavlja glavni prozor aplikacije, dok nam je za kreiranje Window objekta uvek neophodno da prethodno imamo JFrame objekat • Pošto je klasa JDialog direktno izvedena iz klase Window, možemo kreirati JDialog objekat u aplikaciji jedino u kontekstu JFrame objekta. Osim podrazumevanog konstruktora, konstruktori klase JDialog generalno zahtevaju JFrame objekat kao argument, i taj JFrame objekat je roditeljJDialog objekta. • JFrame objekat ima okvir, promenljive je veličine, može imati ugrađeni menu bar. Pošto je JFrame objekat glavni prozor aplikacije, njegova veličina i pozicija definisane su relativno u odnosu na ekran. JDialog objekat sa JFrame roditeljskim objektom biće smešten relativno u odnosu na roditelja. • Dakle, JApplet, JFrame, JDialog su sve kontejneri pošto sve imaju klasu Container za baznu, pa mogu sadržati komponente. One su takođe same po sebi komponente pošto su izvedene iz klase Component. Međutim, nije sve baš tako jednostavno. • Komponente za svoj GUI ne dodajemo direktno JFrame ili JApplet objektu našeg programa.

  17. Prozorski okviri (Window panes) • Kada želimo da dodamo GUI komponente ili crtamo u prozoru prikazanom JFrame objektom, mi dodajemo komponente ili crtamo u prozorski okvir rukovođen JFrame objektom. Isto važi i za aplet. • Uopšteno govoreći, prozorski okviri su kontejnerski objekti koji predstavljaju površ prozora i ima ih više vrsta. • Najveći deo vremena koristimo content pane. • odnos contentPane objekta, drugih prozorskih okvira i prozora aplikacije prikazan je na narednom slajdu

  18. Prozorski okviri (Window panes)

  19. Prozorski okviri (Window panes) • contentPane – u njega obično dodajemo komponente osim menubar-a. Kada pozovemo metod getContentPane() za JFrame objekat, dobijemo referencu na njega. • Površ JFrame prozora ispod title bar-a odgovara JRootPane objektu. On sadrži drugi okvir, objekat layeredPane sa slike, koji je tipa JLayeredPane. Ovaj okvir odgovara celoj površi koju zauzima JRootPane objekat prozora i obrađuje menu bar ako on postoji u prozoru. • Površ u layeredPane ispod menu bar-a odgovara contentPane objektu i tu tipično dodajemo GUI komponente. Takođe, prikaz teksta i crtanje radimo u površi pokrivenoj content pane-om. • layeredPane objekat ima specijalna svojstva za napredne aplikacije koje dopuštaju rukovanje grupama komponenata u različitim lejerima koji preklapaju jedni druge unutar okvira. Sa ovom mogućnošću možemo kontrolisati kako će se komponente prikazivati relativno u odnosu na druge komponente, pošto se lejeri prikazuju određenim redosledom od pozadi ka napred. Komponente prednjeg lejera pojaviće se na ekranu ispred onih koje se nalaze u lejeru koji je negde pozadi.

  20. Prozorski okviri (Window panes) • Takođe, postoji i 1 dodatni okvir koji nije prikazan na slici, i to je glassPane objekat, koji takođe odgovara čitavoj JRootPane površi. Sadržaj glassPane objekta prikazuje se povrh svih ostalih okvira, pa se on koristi za prikaz komoponenti koje želimo da budu iznad svega ostalog prikazanog u prozoru – npr. za drop-down menije ili za prikaz grafike koja se relativno često ažurira – npr. animacije. • Kada deo onoga što se prikazuje treba da se animira, statička pozadina može biti nezavisno prikazana pomoću contentPane. Pošto ona ne mora da se reprocesira svaki put kada animirani objekti treba ponovo da se iscrtaju, ceo proces biće mnogo efikasniji • Klasa JFrame definiše metode pomoću kojih možemo dobiti referencu na proizvoljni okvir: • getRootPane() povratni tip metoda je JRootPane • getLayeredPane() JLayededPane • getContentPane()Container • getGlassPane() Component

  21. Prozorski okviri (Window panes) • Sve ovde opisane klase koje predstavljaju okvire same po sebi su Swing komponente, definisane u paketu javax.swing • JApplet objekat ima isti raspored okvira kao i JFrame objekat, pa se dodavanje komponenti i crtanje u apletu vrši na potpuno isti način. • Aplet definisan kao JApplet objekat takođe može imati menu bar upravo kao i prozor aplikacije. • Svi okviri, kao i menu bar, su komponente.

  22. Osnove komponenata • Postoji nekoliko osnovnih koncepata zajedničkih za sve komponente • Iako sada sledi puko nabrajanje klasa i metoda, većina tih mogućnosti biće praktično upotrebljena kasnije • Da bismo razumeli osnovne stvari koje možemo raditi sa Swing komponentama, istražićemo funkcionalnost koju one nasleđuju od Component i Container. • Kada je neka komponenta sadržana u nekoj drugoj, ta druga se zove roditelj. Referencu na roditeljski objekat za svaku datu komponentu možemo dobiti pozivom metoda getParent(). Ovaj metod se nasleđuje od klase Component, i vraća tip Container, pošto jedino potklasa od Container može sadržati druge komponente. Ako nema roditelja, npr. u slučaju JFrame komponente, metod vraća null.

  23. Atributi klase Component • Atributi klase Component čuvaju sledeće informacije o objektu: • position (x,y) koordinate; gde je objekat smešten u odnosu na njegov kontejner, u koordinatnom sistemu kontejnerskog objekta • name ime komponente, tipa String • size vrednosti za širinu i visinu objekta • foreground color i background color boje za objekat • font font koji koristi objekat kada prikazuje tekst • cursor definiše izgled kursora kada je iznad objekta • enable da li je objekat omogućen ili nije – kada jeste, njegovo enabled stanje je true i objekat izgleda normalno, a u suprotnom je sive boje. onemogućen objekat takođe može generisati događaje • visible da li je objekat vidljiv na ekranu ili nije; ako objekat nije označen kao vidljiv, ne iscrtava se na ekranu • valid da li je objekat validan ili nije – ako nije layout entiteta koji sačinjavaju objekat nije određen. To je slučaj pre nego što objekat postane visible

  24. Atributi klase Component • Karakteristike Component objekta možemo menjati samo pozivanjem njegovih metoda ili utičući na njih indirektno na neki način pošto su sve deklarisane kao private. • Npr. ime Component objekta myWindow možemo promeniti sa: myWindow.setName("Novo ime"); • Metod getName() vraća ime objekta, kao String: String ime=myWindow.getName(); • Metodi isVisible(), isEnabled(), isValid() vraćaju true ako je objekat visible, enabled i valid, redom. • Možemo postaviti da objekat bude visible ili enabled prosleđivanjem vrednosti true kao argumenta metodima setVisible() i setEnabled(), redom.

  25. Atributi klase Component • Uobičajena zabluda sa Swing komponentama je ta da će poziv setEnabled(false) sprečiti događaje poput klika mišem na komponentu. To nije slučaj. Sve što taj poziv radi jeste da postavi interni enabled status na false uzrokujući da komponenta posivi. Da bismo sprečili da događaji onemogućene komponente imaju efekta, moramo pozvati isEnabled() za komponentu u kodu za obradu događaja da utvrdimo da li je komponenta omogućena ili ne. A onda možemo da odlučimo da ne radimo ništa ako metod isEnabled() vrati false.

  26. Veličina i pozicija komponente • Pozicija je definisana x i y koordinatama tipa int ili objektom tipa java.awt.Point • Objekat Point ima 2 public atributa,x i y. • Veličina je definisana int vrednostima width i height ili objektom tipa java.awt.Dimension • Klasa Dimension ima 2 public atributa, width i height. • Veličina i pozicija komponente se često zadaju zajedno objektom tipa java.awt.Rectangle • Rectangle objekat ima public atribute x i y, koji definišu gornji levi ugao pravougaonika, i atribute width i height, koji definišu njegovu veličinu. Svi ovi atributi su tipa int. • Komponente imaju tzv. "prioritetnu" (preferred) veličinu definisanu java.awt.Dimension objektom koji enkapsulira vrednosti za širinu i visinu. Ta veličina varira u zavisnosti od objekta. Npr. ta veličina za JButton objekat koji definiše dugme je veličina koja se prilagođava labeli dugmeta

  27. Veličina i pozicija komponente • Veličina komponente se određuje automatski kada ona ima roditeljsku komponentu. O tome kasnije. • Komponenta takođe ima minimalnu i maksimalnu veličinu • Veličina komponente će biti između minimalne i maksimalne, a ako je prostor raspoloživ za tu komponentu manji od njene minimalne veličine, komponenta neće biti prikazana • Možemo postaviti "prioritetnu", minimalnu i maksimalnu veličinu komponente • Metodi klase Component za pristup veličini i poziciji su: • Rectangle getBounds()vraća veličinu i poziciju objekta kao objekat tipa Rectangle • Rectangle getBounds(Rectangle rect) smešta poziciju i veličinu u Rectangle objekat koji prosledimo kao argument i vraća referencu na rect. Ova verzija metoda omogućuje ponovnu upotrebu postojećeg Rectangle objekta. Ako je rect null, metod će kreirati novi Rectangle objekat. • Dimension getSize() vraća tekuću veličinu Component objekta kao Dimension objekat • Dimension getSize(Dimension dim) • Point getLocation() vraća poziciju Component objekta kao objekat tipa Point • Point getLocation(Point p)

  28. Veličina i pozicija komponente • Pozicija i/ili veličina komponente mogu se promeniti korišćenjem sledećih metoda: • void setBounds(int x, int y, int width, int height) • void setBounds(Rectangle rect) • void setSize(Dimension d) • setLocation(int x, int y) • setLocation(Point p) • Takođe, mogu se postaviti parametri za utvrđivanje opsega veličine • void setMinimumSize(Dimension d) ako je argument null, veličina komponente biće podrazumevana minimalna veličina • void setMaximumSize(Dimension d) • void setPreferredSize(Dimension d)

  29. Veličina i pozicija komponente • Još jedan bitan metod klase Component je getToolkit() • On vraća objekat tipa Toolkit koji sadrži informacije o okruženju u kom se aplikacija izvršava, uključujući i veličinu ekrana u pikselima. • Možemo koristiti ovaj metod kao pomoć pri postavljanju veličine i pozicije prozora na ekranu • Možemo modifikovati prethodni primer kako bismo to demonstrirali • TestWindow2 • Koristimo Toolkit objekat da prikažemo prozor na sredini ekrana, sa širinom i visinom jednakim polovini širine i visine ekrana import java.awt.Toolkit; import java.awt.Dimension; ... Toolkit theKit = prozor.getToolkit(); Dimension velicinaEkrana = theKit.getScreenSize();

  30. Dimenzioniranje prozora pomoću Toolkit, TestWindow2 • Toolkit objekat, theKit, dobijamo pozivom metoda getToolkit() za JFrame objekat prozor. Ovaj objekat predstavlja okruženje na našem računaru i enkapsulira sva svojstva i mogućnosti tog okruženja koja se tiču Jave, uključujući i rezoluciju i veličinu ekrana • Toolkit objekat nije moguće kreirati direktno pošto je Toolkit apstraktna klasa. Postoji samo 1 Toolkit objekat u aplikaciji, onaj na koji dobijemo referencu pozivom metoda getToolkit() za komponentu • Metod getScreenSize() je član Toolkit objekta i vraća objekat tipa Dimension koji sadrži atribute width i height sa vrednostima veličina širine i visine ekrana izraženim u broju piksela. Koristimo te vrednosti da bismo postavili koordinate za poziciju prozora i širinu i visinu prozora pomoću metoda setBounds().

  31. Centriranje prozora, TestWindow3 • TestWindow3 • Ovo nije jedini način centriranja prozora. java.awt.GraphicsEnvironment objekat sadrži informacije o grafičkim uređajima u sistemu. • Referenca na GraphicsEnvironment objekat može se dobiti pozivom statičkog metoda getLocalGraphicsEnvironment() klase GraphicsEnvironment : GraphicsEnvironment localGE = GraphicsEnvironment.getLocalGraphicsEnvironment(); • Onda se može pozvati metod getCenterPoint() da bi se dobio Point objekat sa koordinatama centra ekrana: Point centar = localGE.getCenterPoint();

  32. Centriranje prozora, TestWindow3 import java.awt.GraphicsEnvironment; ... Point center = GraphicsEnvironment.getLocalGraphicsEnvironment(). getCenterPoint(); int sirinaProzora = 400; int visinaProzora = 150; prozor.setBounds(center.x - sirinaProzora/2, center.y - visinaProzora/2, sirinaProzora, visinaProzora); ...

  33. Tačke i pravougaonici • mala digresija: klase Point i Rectangle • obe klase nalaze se u paketu java.awt • Mnogi metodi ovih klasa su vrlo korisni za crtanje u prozoru • Entiteti prikazani u prozoru tipično imaju pridružene Rectangle objekte koji definišu površi unutar prozora koje ti entiteti zauzimaju • Point objekti se koriste u definiciji drugih geometrijskih entiteta poput linija i krugova i za određivanje njihove pozicije u prozoru • Ni Point ni Rectangle objekti nemaju ugrađenu reprezentaciju na ekranu. Oni nisu komponente, oni su apstraktni geometrijski entiteti • Ako želimo da prikažemo pravougaonik, moramo da ga nacrtamo

  34. Point objekti • 2 public atributa tipa int : x i y • Points.java • promena pozicije Point objekta: metod move() ili metod setLocation() ( postavljanje vrednosti atributa x i y ) • getLocation() metod vraća kopiju tekućeg Point objekta • translate() metod – za translaciju Point objekta • equals() metodom se porede 2 Point objekta. Porede se x i y koordinate objekata i metod vraća true ako su odgovarajući parovi koordinata jednaki. • Ovo nije jedina klasa koja predstavlja tačke

  35. Rectangle objekti • 4 public atributa, tipa int • pozicija Rectangle objekta određena je atributima x i y, a njegova veličina atributima width i height • Pošto su svi atributi public, možemo im direktno pristupati i direktno ih menjati, ali će kod bti malo čitljiviji ako se koriste metodi koji su na raspolaganju • 7 konstruktora: • Rectangle() //u tački (0,0), sa dimenzijama 0,0 • Rectangle(int x, int y, int width, int height) • Rectangle(int width, int height) // x = y = 0 • Rectangle(Point p, Dimension d) • Rectangle(Point p) // width = height = 0 • Rectangle(Dimension d) // x = y = 0 • Rectangle(Rectangle r) // iste dimenzije i pozicija kao r

  36. Rectangle objekti • Pristup i promena pozicije Rectangle objekta – korišćenjem getLocation() metoda, koji vraća Point objekat i setLocation() koji ima 2 verzije: 1 zahteva x i y koordinate nove pozicije kao argumente, a druga Point objekat • Na Rectangle objekat može se primeniti metod translate() na isti način kao kod Point objekta. • Za pristup i promenu veličine Rectangle objekta koriste se metod getSize() koji vraća Dimension objekat i setSize() koji kao argument zahteva ili Dimension objekat koji određuje novu veličinu ili 2 argumenta tipa int koji odgovaraju novim vrednostima širine i visine. • Takođe, može se koristiti nekoliko metoda za kombinovanje Rectangle objekata i za proširenje Rectangle objekta tako da obuhvati datu tačku • Na narednom slajdu, pravouganoik koji predstavlja rezultat operacije prikazan je isprekidanom linijom

  37. Rectangle objekti

  38. Rectangle objekti • Rectangle intersection(Rectangle r)vraća Rectangle objekat koji je presek tekućeg objekta i argumenta. Ako se ta 2 pravougaonika ne seku, vraća Rectangle objekat na poziciji (0,0) i width = height = 0 • Rectangle union(Rectangle r)vraća najmanji Rectangle objekat koji sadrži tekući i pravougaonik r • void add(Rectangle r) proširuje tekući Rectangle objekat tako da obuhvati i argument r • void add(Point p) proširuje tekući Rectangle objekat tako da obuhvati i tačku p. Rezultat je najmanji pravougaonik koji sadrži originalni pravougaonik i tačku • void add(int x, int y) da obuhvati tačku (x,y) • void grow(int h, int v) povećava tekući Rectangle objekat pomeranjem granica od centra za h po horizontali i za v po vertikali

  39. Rectangle objekti • Sledećim metodima mogu se testirati i porediti Rectangle objekti na različite načine: • boolean isEmpty() vraća true ako je width = height = 0, false inače • boolean equals(Object rect) true ako su tekući i pragougaonik argument jednaki, false inače, a jednaki su ako su na istoj poziciji i imaju iste širine i visine. Ako argument nije Rectangle objekat, vraća se false. • boolean intersects(Rectangle rect) vraća true ako se tekući i pravougaonik argument seku, false inače • boolean contains(Point p) vraća true ako tekući Rectangle objekat obuhvata tačku p, false inače • boolean contains(int x, int y) -||- tačku (x,y) • Svi ovi metodi biće korisni kada rukujemo sadržajem Java prozora • Postoje i druge klase koje definišu pravougaonike

  40. Vizuelne karakteristike komponenti • 2 stvari određuju vizuelni izgled komponente: • reprezentacija komponente kreirana Java kodom u klasi komponente koji se izvršava kada se prikaže komponenta i • sve ono što se crta na komponenti • Component objekat se može iscrtati implementiranjem njegovog paint() metoda. Taj metod se poziva automatski kada treba nacrtati komponentu • Naša implementacija paint() metoda mora uključiti kod za generisanje svega onoga što želimo da iscrtamo unutar Component objekta. Sama komponenta – JButton ili JFrame npr. – biće automatski iscrtana, a paint() metod treba da predefinišemo samo za ono dodatno što hoćemo da nacrtamo na njoj.

  41. Vizuelne karakteristike komponenti • Neke aspekte izgleda osnovne komponente možemo menjati pozivajući sledeće metode za objekat: • void setBackground(Color aColor) postavlja boju pozadine na aColor. Boja pozadine je boja koja se koristi za osnovnu komponentu • Color getBackground() vraća tekuću boju pozadine • void setForeground(Color bColor) postavlja na bColor boju svega što se pojavljuje na osnovnoj komponenti. Npr. labele na dugmetu • Color getForeground() vraća tekuću foreground boju • void setFont(Font aFont) postavlja font • Font getFont() vraća font • void setCursor(Cursor aCursor) postavlja izgled kursora unutar površine zauzete Component objektom • Da bismo mogli da koristimo ove metode, potrebno je da znamo šta su Color objekti i kako da kreiramo Color i Font objekte

  42. Definisanje boje • Boja ekrana predstavlja se objektom klase Color ( java.awt ) • Vrednost boje definiše se kao kombinacija 3 osnovne boje: crvene, zelene i plave (RGB) • Postoje i drugi načini zadavanja boja u Javi, ali mi ćemo se zadržati na ovom • Intenzitet svake od osnovnih boja može imati vrednost od 0 do 255 • (0,0,0) – crna • (255,255,255) – bela Color myBlack = new Color(0,0,0); // crna boja Color myWhite = new Color(255,255,255); // bela boja Color myGreen = new Color(0,200,0); // nijansa zelene • 3 argumenta konstruktora odgovaraju intenzitetima crvene, zelene i plave boje, redom

  43. Definisanje boje • Klasa Color definiše i public final static promenljive za standardne boje: WHITE (255,255,0) RED (255,0,0) PINK (255,175,175) LIGHT_GRAY (192,192,192) ORANGE (255,200,0) MAGENTA (255,0,255) GRAY (128,128,128) YELLOW (255,255,0) CYAN (0,255,255) DARK_GRAY (64,64,64) GREEN (0,255,0) BLUE (0,0,255) BLACK (0,0,0) • Kada smo kreirali Color objekat, možemo posvetliti ili potamniti boju pozivom metoda brighter() i darker() koji uvećavaju ili umanjuju intenzitet komponenti boje za predefinisani faktor boja.brighter(); boja.darker();

  44. Definisanje boje • Intenziteti komponenti boje uvek ostaju između 0 i 255. Faktor koji se koristi za potamnjivanje komponente je 0.7. Za posvetljivanje komponente, intenzitet se povećava korišćenjem faktora 1/0.7 • Ovde je bitno da možemo dobiti samo boje koje podržavaju računar i okruženje operativnog sistema na kom se Java program izvršava. Ako je na raspolaganju ograničen broj boja, ovi metodi možda neće imati efekta • Možemo dobiti intenzitet svake od komponenti boje pomoću: getRed(), getGreen() i getBlue() metoda nad Color objektom. • Boja se takođe može dobiti i kao vrednost tipa int koja je kombinacija komponenata boje Color objekta korišćenjem getRGB() metoda • Moguće je i kreirati Color objekat od 1 RGB vrednosti tipa int.

  45. Definisanje boje • Metod equals() poredi 2 Color objekta i vraća true ako su odgovarajuće komponente boja jednake. • == ne treba koristiti za poređenje Color objekata, jer se time utvrđuje da li 2 reference na Color objekte referišu na isti objekat u memoriji • Može se koristiti getRGB() metod za poređenje boja: if(bojaA.getRGB()==bojaB.getRGB()) { // radimo nesto… } • ovo poredi 2 integer RGB vrednosti na jednakost, pa ovde == proizvodi korektan rezultat • klasa Color podržava i providnost boja čuvanjem vrednosti α iz opsega 0.0 do 1.0, gde je 0.0 potpuno providno, a 1.0 potpuno neprovidno

  46. Sistemske boje • U paketu java.awt nalazi se potklasa SystemColor klase Color. Ova klasa enkapsulira standardne boje koje host operativni sistem koristi za prikaz različitih komponenti • Klasa sadrži definicije 24 public final static promenljivih tipa SystemColor koje određuju standardne sistemske boje koje sistem koristi za GUI komponente. Npr. za sistemske boje za prozor: window definiše boju pozadine za prozor window_text definiše boju teksta za prozor window_border definiše boju ivice prozora • Ako su nam potrebne i druge, npr. boje za menije, naslove, kontrole itd. možemo ih naći u dokumentaciji klase SystemColor. • Ako želimo da poredimo SystemColor vrednost sa Color objektom, moramo koristiti getRGB() u poređenju: if( bojaA.getRGB() == SystemColor.window.getRGB() ) { // … }

  47. Kreiranje kursora • Objekat java.awt.Cursor klase enkapsulira bitmap-reprezentaciju kursora miša • Ova klasa sadrži final static konstante koje određuju standardne tipove kursora. Njih koristimo za izbor ili kreiranje određenog kursora • Standardni tipovi kursora su: DEFAULT_CURSOR N_RESIZE_CURSOR NE_RESIZE_CURSOR CROSSHAIR_CURSOR S_RESIZE_CURSOR NW_RESIZE_CURSOR WAIT_CURSOR E_RESIZE_CURSOR SE_RESIZE_CURSOR TEXT_CURSOR W_RESIZE_CURSOR SW_RESIZE_CURSOR HAND_CURSOR MOVE_CURSOR • Resize kursori su oni koje vidimo kada menjamo veličinu prozora povlačenjem njegovih ivica. Ove konstante nisu kao Color konstante koje su Color objekti – ove konstante su tipa int, ne tipa Cursor, i namenjene su da se koriste kao argumenti konstruktora

  48. Kreiranje kursora • Da bismo kreirali Cursor objekat koji predstavlja tekst-kursor: Cursor myCursor = new Cursor(Cursor.TEXT_CURSOR); • Alternativno, možemo dobiti kursor nekog od predefinisanih tipova korišćenjem statičkog metoda Cursor myCursor = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR); • Ovaj metod je posebno koristan kada ne želimo da pamtimo Cursor objekat, nego samo da ga prosledimo metodu poput setCursor() za Component objekat • Ako želimo da vidimo kako izgledaju standardni kursori, modifikujemo prethodni primer – promenimo background boju za content pane prozora aplikacije i probamo različite kursore : import java.awt.Color; import java.awt.Cursor; // ... ... prozor.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); prozor.getContentPane().setBackground(Color.PINK);

  49. Fontovi • Objekat tipa Font predstavlja font. Klasa Font je zapravo prilično komplikovana, pa ćemo videti samo njen delić. • Ova klasa razlikuje karakter i glif ( glyph ), tj. oblik u kom će se slovo pojaviti kada se prikaže ili odštampa. Za karaktere koji odgovaraju mnogim jezicima karakter može uključiti više od jednog glifa za njegovo prikazivanje. • Da bismo kreirali Font objekat moramo proslediti ime fonta, stil i veličinu. Npr. Font myFont = new Font( "Serif", Font.ITALIC, 12 ); • ovo definiše 12-point Times Roman italic font • Preostale opcije koje se mogu koristiti za stil su PLAIN i BOLD • Ime koje je ovde upotrebljeno, "Serif", je logičko ime fonta. Druga logička imena mogla bi da budu "Dialog", "DialogInput", "Monospaced" ili "SansSerif".

  50. Fontovi • Umesto logičkog imena fonta može se proslediti fizičko ime poput "Times New Roman" ili "Palatino". • Swing komponente rade i sa logičkim i sa fizičkim fontovima, dok AWT mogu da koriste samo logičke fontove. • Logička imena imaju tu prednost da rade na proizvoljnoj platformi, pa se logički font može koristiti bez potrebe provere njegove dostupnosti. Ipak, izgled logičkog fonta može varirati od platforme do platforme • Korišćenje fizičkih fontova pruža veću fleksibilnost, ali font koji se koristi mora biti dostupan na platformi na kojoj se izvršava kod. • Stilovi se mogu i kombinovati OR-ovanjem ili sabiranjem pošto je svaki stil jednobitni integer. Ako želimo da myFont bude i BOLD i ITALIC: Font myFont = new Font("Serif", Font.ITALIC + Font.BOLD, 12);

More Related