You are on page 1of 225

Java i objektno orijentirano programiranje

Predrag Broanac

Sadraj
1. Osnovni pojmovi ..................................................................................................... 3 1.1 Program, programiranje, programski jezik..................................................... 4 1.2 Povijest programskih jezika ............................................................................. 6 1.2.1 Strojni jezici ............................................................................................. 6 1.2.2 Simboliki jezici....................................................................................... 6 1.3 Tehnike pisanja programa ................................................................................ 8 2. Uvod u Javu .............................................................................................................. 9 2.1 Programski jezik Java......................................................................................10 2.2 Izvravanje Java programa .............................................................................11 2.3 BlueJ razvojno okruenje ...............................................................................13 2.4 Elementi Jave...................................................................................................20 2.5 Tipovi podataka...............................................................................................22 2.5.1 Jednostavni tipovi podataka ................................................................23 2.5.1.1. Cjelobrojni tipovi podataka.........................................................23 2.5.1.2. Znakovni tip podataka.................................................................23 2.5.1.3. Realni tip podataka.......................................................................24 2.6 Deklaracija varijabli.........................................................................................25 2.7 Operatori ........................................................................................................26 2.7.1 Aritmetiki operatori ............................................................................26 2.7.2 Relacijski operatori ...............................................................................27 2.7.3 Logiki operatori...................................................................................28 2.7.4 Prioritet operatora.................................................................................29 2.7.5 Izraunavanje mjeovitih izraza ..........................................................29 2.8 Prvi programi...................................................................................................31 3. Naredbe grananja ...................................................................................................33 3.1 if, if/else naredba..................................................................................34 3.2 switch/case naredba...............................................................................36 4. Petlje ........................................................................................................39 4.1 for petlja ........................................................................................................40 4.2 while petlja ...................................................................................................44 4.3 do/while petlja ...........................................................................................47 5. Sloeni tipovi podataka .........................................................................................50 5.1 Niz ....................................................................................................................51 5.1.1 Viedimenzionalni nizovi.....................................................................53 5.2 String .................................................................................................................57 6. Objektno orijentirano programiranje ..................................................................59 6.1 Drugaiji pristup programiranju....................................................................60 6.2 Klasa i objekt ...................................................................................................61 6.3 Kreiranje objekta iz klase ...............................................................................66 6.3.1 Pristup elementima klase......................................................................67
2

Java i objektno orijentirano programiranje

6.4 Nasljeivanje klasa ..........................................................................................69 7. Programi u Javi.......................................................................................................74 7.1 Klasa i program ...............................................................................................75 7.2 Metoda main ....................................................................................................76 7.3 Izvravanje Java programa iz komandnog prompta ...................................79 8. Elementi grafikog korisnikog suelja ...............................................................80 8.1 O grafikom korisnikom suelju .................................................................81 8.2 Prozor i njegovi dijelovi .................................................................................82 8.3 Okviri za tekst i gumbi ...................................................................................84 8.3.1 Okviri za tekst .......................................................................................84 8.3.2 Gumbi ....................................................................................................84 9. Dogaaji .................................................................................................................88 10. Iznimke ....................................................................................................................94 10.1 to je iznimka..............................................................................................95 10.2 Hvatanje iznimki u Javi..............................................................................95 10.3 Procesiranje iznimki ...................................................................................98 11. Sloeniji elementi grafikog korisnikog suelja ..............................................102 11.1 Kvadratii za odabir opcija......................................................................102 11.2 Kruii za odabir opcija ...........................................................................103 11.3 Podruja za tekst.......................................................................................104 11.4 Trake za pomicanje ..................................................................................105 11.5 Padajue liste .............................................................................................106 11.6 Izbornici.....................................................................................................107 12. Unos i ispis podataka...........................................................................................111 12.1 Streamovi...................................................................................................112 12.1.1 Bajtovni streamovi..............................................................................113 12.1.2 Znakovni streamovi............................................................................113 12.2 Standardni ulaz i izlaz...............................................................................113 12.3 Tekstualne datoteke..................................................................................116 12.3.1 itanje podataka iz datoteka..............................................................116 12.3.2 Spremanje podataka u datoteke ........................................................119 13. Dijaloki prozori...................................................................................................122 13.1 Dijaloki prozori za otvaranje/spremanje dokumenata.......................124 13.2 Poruke, potvrde i jednostavan unos.......................................................126 13.2.1 Metoda showMessageDialog...................................................127 13.2.2 Metoda showConfirmDialog...................................................128 13.2.3 Metoda showInputDialog........................................................129 13.2.4 Metoda showOptionDialog .....................................................130 13.3 Klasa Color i odabir boja .....................................................................131 13.4 Klasa Font...............................................................................................133 14. Klasa Graphics................................................................................................135 14.1 Metode klase Graphics.......................................................................137 14.2 Crtanje grafa funkcije ...............................................................................143 15. Java appleti ............................................................................................................148
3

15.1 Primjer appleta ..........................................................................................149 15.2 Integriranje appleta u web stranicu ........................................................151 15.3 Prosljeivanje parametara appletu iz web browsera.............................155 16. I jo dva primjera .................................................................................................160 16.1 Telefonski imenik .....................................................................................161 16.2 Chat ............................................................................................................161

Java i objektno orijentirano programiranje

1
Osnovni pojmovi
Program, programiranje, programski jezik Povijest programskih jezika Tehnike pisanja programa

Program, programiranje, programski jezik


Jeste li se ikada zapitali to se u raunalu dogaa od trenutka kada pomaknete mia po stolu do trenutka dok se pomakne pokaziva mia na monitoru raunala? Kako raunalo na osnovu sliice na koju smo kliknuli "zna" koji program treba pokrenuti? Prisjetimo se da je raunalo ureaj sastavljen od niza meusobno povezanih elektronikih komponenata, ija je osnovna zadaa omoguiti pamenje i efikasnu obradu podataka. Raunalo kao skup fizikih komponenata nam nee biti od velike pomoi. Ukoliko ga ne opremimo odgovarajuim programima, pomak mia po stolu mu nee znaiti nita, ak tovie nee niti prikazati pokaziva mia na ekranu. Dakle, da bismo raunalo pretvorili u pomagalo moramo ga opskrbiti odgovarajuim programima. Da bismo mogli sluati glazbu potreban nam je odgovarajui program koji e nam to omoguiti. Kao to moemo primijetiti programi su vrlo bitni za rad raunala, stoga emo se mi ovdje baviti upravo time, pisanjem programa. to je to u stvari program? Program je niz naredbi koje su pisane tako da ih raunalo razumije i moe ih izvesti a koje rjeavaju neki problem. Unutar programa se nalaze detaljne upute raunalu kako treba reagirati na odreenu akciju korisnika. Posao oko pripreme i pisanja programa zovemo programiranje, a programiranjem se bave programeri. Kao to znamo raunalo sve podatke uva u digitalnom obliku. Dakle da bi raunalo razumjelo program on mora biti napisan kao niz nula i jedinica. Prvi programi su se uistinu tako i pisali. Za takve programe kaemo da su napisani u strojnom jeziku. Takvo programiranje bilo je izuzetno mukotrpno. Danas je programiranje znatno pojednostavljeno. Programi se piu u nekom od mnotva programskih jezika. Programski jezik je skup pravila rijei i simbola pomou kojih se piu programi, tj. pomou kojih se detaljno opisuju koraci rjeavanja nekog problema. Zadatak programskog jezika je napisani program prevesti u jezik strojni jezik koji raunalo razumije. Program niz naredbi koje rjeavaju neki zadatak a pisane su tako da ih raunalo moe razumjeti. Programiranje posao oko pripreme i pisanja programa. Programer osoba koja se bavi programiranjem. Programski jezik skup pravila rijei i simbola pomou kojih se piu programi. Strojni jezik osnovni jezik raunala; jezik nula i jedinica Ve smo rekli da raunalo sve podatke uva u digitalnom obliku tj. kao niz nula i jedinica. Znamenka nula ili 1 se naziva binarna znamenka odnosno bit. Niz od 8 bitova nazivamo bajt (byte). Postavlja se pitanje kako je mogue slova, slike, zvuk, pretvoriti u bitove? Jedan od naina kako se npr. znakovi zapisuju u digitalnom obliku je ASCII kd (American Standard Code for Information Interchange). ASCII kdom je mogue kodirati ukupno 128 znakova, koji u tom sluaju imaju kdove od 0 do 127. Slovo A se u ASCII tablici nalazi na 65. mjestu, B na 66. mjestu, Mala slova zapoinju na 97. mjestu, Osim ASCII kda esto je u upotrebi i tzv. proireni ASCII kd, pomou kojega je mogue zapisati ukupno 256 razliitih znakova. Prvih 128 znakova proirenog ASCII kda isti su kao i kod ASCII kda i oni su jednaki za sve zemlje. Sljedeih 128 znakova nije standardizirano i tu se nalaze specijalni znakovi za pojedine zemlje. Kod nas se tu nalaze slova , , , Kod oba navedena kdiranja znakovi se zapisuju pomou 8 bitova (kod ASCII kda je prvi bit uvijek 0) i to tako da se redni broj znaka pretvori u binarni zapis. Tako je binarni kd slova A 01000001, Osim dva navedena, postoji jo niz drugih naina kdiranja. Jedan od nama znaajnijih je tzv. unicode, pomou kojega je mogue kdirati ukupno 65536 znakova. Ovaj nain kdiranja nam

Java i objektno orijentirano programiranje ja bitan jer ga koristi Java. Prvih 128 znakova isto je kao i kod ASCII kda, a za zapis jednog znaka koristi se 16 bitova (2 bajta). Bit osnovna jedinica podataka sadri jednu binarnu znamenku (0 ili 1). Bajt (B) niz od 8 bitova. Kilobajt (KB) 1024 bajta. Megabajt (MB) 1024 kilobajta Gigabajt (GB) 1024 megabajta ASCII kd jedan od naina kodiranja znakova, pomou kojega je mogue kodirati ukupno 128 razliitih znakova. Proireni ASCII kd omoguava kdiranje 256 razliitih znakova Unicode omoguava kodiranje 65536 razliitih znakova (koristi ga Java)

Povijest programskih jezika


itava povijest programskih jezika mogue je svrstati u dvije osnovne kategorije: strojni jezici simboliki jezici Strojni jezici Programi pisani u strojnom jeziku pisani su tako da ih raunalo moe neposredno izvravati bez prijanjeg prevoenja. Program se sastoji od niza binarnih znamenaka. Programiranje na strojnom jeziku je izuzetno naporan i mukotrpan posao. Mogunosti pogreke su vrlo velike. Svako raunalo ima svoj strojni jezik. Program napisan na jednom raunalu ne moe se izvravati na drugom raunalu, esto ak niti na razliitim raunalima istog proizvoaa. Simboliki jezici Kao to smo rekli, programiranje u strojnom jeziku nije niti malo ugodan posao. Prvi korak prema neto naprednijim programskim jezicima bilo je napraviti programski jezik koji e naredbe strojnog jezika zamijeniti rijeima, ime e pamenje i pisane naredbi biti znatno pojednostavljeno. Kao rezultat toga nastao je assembler. Svaka naredba assemblera je u stvari sinonim za odreenu naredbu strojnog jezika. U tablici 1-1 dan je primjer naredbi u assembleru i nekom strojnom jeziku.
Assembler Strojni jezik

LOAD STOR MULT ADD SUB

00100100 00100010 00100110 00100101 00100011 Tablica 1-1 Naredbe zapisane u assembleru i nekom strojnom jeziku

Nakon to napiemo program u assebmleru, zadaa assemblera je taj program prevesti u strojni jezik kako bi ga raunalo moglo izvriti. Assembler je jo poznat i kao nii simboliki jezik. Iako pojednostavljeno, programiranje u assembleru je i dalje dosta nespretno. Stoga se pojavljuju tzv. vii programski jezici. Vii programski jezici su vie orijentirani programeru. Programiranje je daljnje pojednostavljeno. Unutar kategorije viih programskih jezika postoje dvije osnovne potkategorije: proceduralni jezici u sreditu ovakvih programskih jezika nalazi se postupak odnosno procedura kako neto napraviti. U tu kategoriju spada veina danas poznatih programskih jezika Pascal, C, Java, neproceduralni jezici za razliku od proceduralnih jezika kod kojih je teite stavljeno postupak kako neto napraviti, kod neproceduralnih jezika je teite stavljeno na ono to elimo dobiti a ne zamaramo se postupkom kako emo to dobiti. U ovu skupinu spadali bi jezici kao to su Excel, SQL, Ovi su jezici jo vie orijentirani prema programeru. Osnovni nedostatak ovakvih jezika lei u injenici da su ogranieni na rjeavanje samo jedne klase problema (Excel tablini prorauni, SQL rad s bazama podataka,)

Java i objektno orijentirano programiranje Kao i kod niih simbolikih jezika, programe napisane u nekom viem simbolikom jeziku potrebno je prevesti na strojni jezik. Openito postoje dva naina na koji se jezici prevode na strojni jezik: kompajliranje itav program se prevede na strojni jezik a tek potom se izvri, poznatiji kompajleri bili bi: Pascal, C, interpetiranje naredba po naredba programa se prevodi i odmah izvrava, poznatiji interpreteri su: ASP, PHP, Basic, Java ne spada nije u potpunosti niti komplajler niti interpreter. Vie govora o prevoenju programa pisanih u Javi bit e u nastavku. Program napisan u viem programskom jeziku naziva se izvorni program (source code). Nakon prevoenja izvornog programa dobiva se izvrna verzija programa (executable program).
programski jezici

strojni jezici

simboliki jezici

nii simboliki jezici

vii simboliki jezici

proceduralni

neproceduralni

Slika 1-1 Shematski prikaz programskih jezika Primjer 1 1: Dio programa, koji rauna zbroj dva broja (c=a+b), zapisan u strojnom jeziku, assembleru i Javi.
Strojni jezik Assembler Java

00100100 00010001 00100101 00010010 00100010 00010011

LOAD a ADD b STOR C

c = a + b;

Strojni jezici jezici kod kojih se naredbe piu iskljuivo pomou binarnih znamenaka. Programi napisani u strojnom jeziku mogu se direktno oitavati u memoriju raunala. Assembler nii simboliki jezik kod kojeg svaka naredba predstavlja odgovarajuu naredbu u strojnom jeziku. Proceduralni jezici jezici kod kojih programer odreuje na koji e se nain rjeavati neki problem. Neproceduralni jezici jezici kod kojih se programiranje svodi na opisivanje rezultata koji se eli dobiti a ne programira se nain na koji se dolazi do rjeenja. Kompajler (compiler) program koji prevodi itav program na strojni jezik a tek potom se program izvrava.

Interpreter program koji prevodi naredbu po naredbu izvornog programa te ju odmah izvrava. Izvorni program (source code) program pisan u nekom viem simbolikom jeziku, naredbe su pisane u onom obliku u kojem ih pie programer Izvrni program (executable program) program koji se dobije prevoenjem izvornog koda na strojni jezik a koji se moe izvravati na raunalu.

Tehnike pisanja programa


Sve do prije nekoliko godina veina je programskih jezika bazirala na tzv. strukturnom programiranju. Zadani problem se dijeli na manje probleme koji se zatim neovisno rjeavaju i ponovo spajaju kako bi se dolo do rjeenja zadanog problema. Strukturno programiranje karakterizira nastojanje da se programer usredotoi na nain kako e rijeiti neki problem, a da pri tome ne treba puno voditi rauna kako e se pojedina naredba izvesti na razini samog hardvera. Programi se rastavljaju na potprograme (funkcije i procedure), koji se tada po potrebi mogu pozivati u razliitim dijelovima programa. Strukturno programiranje poznato je jo i kao topdown, odnosno modularno programiranje. Najpoznatiji strukturni programski jezici su Pascal, C, Basic U posljednjih nekoliko informatika se razvija toliko brzo da se javlja potreba za novim nainom programiranja koje e biti jo efikasnije. Osnovni cilj je napraviti program iji e se dijelovi moi ponovo upotrijebiti u drugim programima. Kao posljedica toga javlja se drugaiji nain programiranja a to je objektno-orijentirano programiranje. Prvi korak pri rjeavanju problema kod objektno-orijentiranog programiranja je unutar zadanog problema identificirati vane dijelove koje nazivamo objekti. Sljedei korak je pronai odnose izmeu objekata. elimo li npr. napisati program koji e simulirati vonju automobila, osnovni objekti koji e karakterizirati taj problem bit e automobil i voza. Sljedei korak bio bi odrediti neka osnovna svojstva objekata. U naem bi primjeru neka svojstva automobila bila marka automobila, maksimalna brzina, ubrzanje, dok bi za vozaa neka od svojstava mogla biti ime i prezime, visina, teina, Nadalje nam preostaje definirati neke operacije nad objektima. Neke od operacija mogle bi biti poveavanje brzine, koenje, Kao to se moe primijetiti na danom primjeru, za svaki su objekt definirane neke osnovne karakteristike koje ga opisuju svojstva, te operacije koje se nad njim mogu izvravati metode. Programski jezici koji omoguavaju objektno-orijentirano programiranje zovu se objektno orijentirani programski jezici. Svi noviji programski jezici su vie ili manje objektno-orijentirani. Java je u potpunosti objektno orijentirani programski jezik. I u ovom je trenutku jedan od najboljih izbora za uenje objektno-orijentiranog programiranja. Pascal i C su isto na neki nain objektno-orijentirani, u njima je isto mogue kreirati objekte, dodjeljivati im svojstva, no u osnovi su ti jezici strukturni i sama priroda im nije objektno-orijentirana.

10

Java i objektno orijentirano programiranje

Zadaci za vjebu
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. to je program? Objasni pojam programiranje. to je programski jezik? Objasni pojam kodiranje. Koja je razlika izmeu ASCII i Unicode koda? Objasni razliku izmeu strojnih i simbolikij programskih jezika. Koji je najpoznatiji nii simboliki jezik? Navedi neke vie programske jezike. Objasni razliku izmeu kompajliranja i interpretiranja. Navedi nekoliko kompajlera i nekoliko interpretera. Koje su dvije najee tehnike pisanja programa? Objasni!

11

2
Uvod u Javu
Programski jezik Java Izvravanje Java programa BlueJ razvojno okruenje Elementi Jave Tipovi podataka Prvi programi

12

Java i objektno orijentirano programiranje

Programski jezik Java


Krajem 1990 godine skupina programera tvrtke SUN krenula je u kreiranje jedinstvenog programskog jezika ije e se aplikacije moi izvravati ne samo na raunalima ve i na ostalim ureajima koji u sebi sadre mikroipove (televizor, perilica rublja, toster, ). Nakon nepunih 5 godina svjetlo dana je ugledao novi programski jezik poznat pod imenom Java. Java je danas poznata kao programski jezik ije se aplikacije mogu izvravati na Internetu, na raunalima razliitih proizvoaa i razliitih operativnih sustava. To znai da se ista aplikacija moe izvravati na PC-u, Mac-u, odnosno ista se aplikacije moe izvravati pod operativnim sustavom Windows, Unix, Linux, Svjedoci smo da se danas Java aplikacije izvravaju na Internetu, mobilnim telefonima ali i mnogim drugim ureajima. Java je jednostavan, u potpunosti objektno-orijentirani programski jezik. Sintaksa Jave podsjea na sintaksu C-a odnosno C++-a. No isto tako, kako zbog potpune objektno-orijentiranosti ali i niza drugih karakteristika dosta razlikuje od njih. Prema nekim autorima poznavanje jezika kao to su C odnosno C++ moe biti ak oteavajue za uenje Jave jer programer u poetku koristi ono to ve zna iz drugih jezika i teko usvaja mogunosti koje mu nudi Java. Kod Jave razlikujemo dvije vrste "programa": aplikacije (application) apleti (applet) Aplikacija je program koji se nalazi na raunalu korisnika i izvravaju se kada ih korisnik pokrene. Klasini primjeri aplikacija bili bi npr. Warcraft III, Microsoft Word,Da bi se Java aplikacije mogle izvravati na raunalu korisnika raunalo mora imati instaliran Javin izvrni program (Java Virtual Machine), koji moe pokrenuti aplikaciju pisanu u Javi. Veina dananjih operativnih sustava u sebi imaju ugraen Java Virtual Machine. Za razliku od aplikacije, aplet je svojevrsna Internet aplikacija koja se izvrava u pregledniku (Internet Explorer, Netscape Navigator,). Apleti su u stvari aplikacije koje "ive" na Internetu i pokreu se uitavanjem stranice na kojoj se nalaze. Zbog injenice da se izvravaju na Internetu apleti su daleko siromaniji u svojim mogunostima. Kao i ostale Internet aplikacije apleti najee nemaju mogunost pisati po tvrdom disku korisnika. Ne mogu upotrebljavati sve resurse korisnikovog raunala, ali imaju jednu veliku prednost a to je injenica da se nalaze na Internetu i bez instaliranja su dostupne svim korisnicima Interneta. Aplikacija program koji se samostalno izvrava na raunalu korisnika Applet "mali program" koji se izvrava na Internetu, izvrava se unutar nekog od Web preglednika (Internet Explorer, Netscape Navigator,)

13

Izvravanje Java programa


Kao to smo ve napomenuli programi pisani u Javi mogu se izvravati ne samo na razliitim operativnim sustavima ve i na razliitim ureajima. Zbog toga se programi pisani u Javi izvravaju malo drugaije nego to je to uobiajeno. Kao i kod ostalih programskih jezika, programer u odabranom editoru pie kd programa sljedei pravila Jave. Takav program, naziva se izvorni program (source program ili source code). Svaki program napisan u Javi u stvari predstavlja jednu klasu (class) ije se ime navodi u izvornom programu. Tako napisani izvorni program potrebno je spremiti u tekstualni dokument pod imenom ime_klase.java, pri emu je ime klase ime klase koje smo naveli u izvornom programu. Nakon to je izvorni program napisan i spremljen slijedi druga faza a to je prevoenje programa (kompajliranje) u tzv. bajt-kd (bytecode) oblik programa. Prilikom prevoenja programa prevoditelj analizira sintaksnu i semantiku ispravnost programa. U kdu trai elemente Jave te ih interpretira i prevodi u univerzalni bajt-kd, koji e se moi izvravati neovisno o operativnom sustavu i u tome i jest osnovna razlika izmeu Jave i ostalih programskih jezika. Kod ostalih se programskih jezika kompajliranjem stvara kd specifian za odgovarajui operativni sustav.
Windows Java kompajler izvorni program Unix Java kompajler bajt-kd Unix JVM Windows JVM

Slika 2-1 Kompajliranje Javi programa na razliitim operativnim sustavima


Windows kompajler izvorni program Unix kompajler izvrni program (Unix) izvrni program (Windows)

Slika 2-2 Standardno kompajliranje programa na razliitim operativnim sustavima Ukoliko prilikom prevoenja prevoditelj naie na izraze ili dijelove koje ne zna interpretirati prijavit e odgovarajuu greku i kompajliranje nee biti uspjeno zavreno. Krajnji rezultat kompajliranja je datoteka pod imenom ime_klase.class. Nakon kompajliranja programa, program je spreman za pokretanje. Program se pokree pokretanjem datoteke .class. Java apleti se pokreu pomou Web preglednika odnosno

14

Java i objektno orijentirano programiranje pomou odgovarajueg programa koji omoguava pokretanje apleta AppletViewer. Samo izvravanje Java programa i nije tako jednostavno. Naime, prilikom pisanja programa programer najee koristi neke ve gotove dijelove kda. Npr. koristi ve gotove naredbe za unos podataka s tipkovnice, ispis podataka na ekran, kreiranje korisnikog suelja, koje programeru znatno olakavaju posao. Java u tu svrhu sadri svoj Java development kit (JDK). Java development kit u osnovi sadri niz gotovih klasa koje su vrlo korisne prilikom programiranja. Nakon to je program kompajliran, on se i dalje referencira na gotovi kd iz JDK-a. Taj dio kda nalazi se unutar tzv. biblioteka (library). Biblioteke su u Javi organizirane u pakete (package) koji su u stvari skupovi ve gotovih klasa. Povezivanje bajt-kda kreirane aplikacije s dijelovima odgovarajuih biblioteka zadaa je programa koji nazivamo linker. Sada moemo detaljnije objasniti izvravanje programa pisanih u Javi. Najprije se bajt-kd napisanog programa povezuje s odgovarajuim bibliotekama a potom se uitava u radnu memoriju raunala. Uitavanje programa u radnu memoriju raunala automatski izvrava program poznat kao loader. Kao to smo ve spomenuli program je u stvari niz instrukcija koje se izvravaju. Isto smo tako rekli da se raunalo razumije samo naredbe napisane u strojnom jeziku. Na program se i dalje nalazi u bajt-kdu. Prevoenje naredbi iz bajt-kda u strojni jezik obavit e interpreter. Interpreter je jo jedan u nizu programa ija je zadaa prevoditi naredbu po naredbu u strojni jezik raunala i potom ju izvriti. Kao to smo ve rekli bajt-kd Java programa moe se izvravati na razliitim operativnim sustavima. Jedino to je potrebno da bi se bajt-kd izvrio na nekom raunalu je Java Virtual Machine (JVM). Java Virtual Machine razumije bajt-kd te omoguava prevoenje programa na strojni jezik raunala.
izvorni program

kompajler

bajt-kd

biblioteke

linker

loader

interpreter

naredbe u strojnom jeziku

Slika 2-3 Izvravanje programa pisanih u Javi Izvorni program (source program, source code) program napisan u nekom viem programskom jeziku. Bajt-kd optimizirani skup naredbi kreiranih tako da se mogu izvravati na bilo kojem operativnom sustavu. Nastaje kompajliranjem izvornog programa. AppletViewer program koji omoguava pokretanje apleta izvan Web preglednika Java development kit (JDK) programska oprema za pisanje programa u Javi

15

Biblioteka (library) skup svih klasa koje su ve definirane i koje se mogu pozivati unutar programa Paket skup meusobno povezanih klasa Linker program koji povezuje bajt-kd s ve gotovim klasama iz JDK Loader program koji uitava izvrni program u radnu memoriju raunala Interpreter program koji prevodi jednu po jednu naredbu iz bajt-kda u strojni jezik raunala te ju izvrava. Java Virtual Machine izvrni sustav za izvravanje Java bajt-kda na nekom raunalu.

BlueJ razvojno okruenje


Da bismo zapoeli programirati u Javi potreban nam je u najmanju ruku Java interpreter koji e izvorni program prevesti u bajt-kd. Izvorni program mogue je napisati u bilo kojem editoru. Programiranje u nekom obinom editoru nije ba ugodno. U obinom editoru nije vidljiva razlika izmeu naredbi programskog jezika, komentara, ili teksta koji se ispisuje, to moe znatno oteati programiranje. Stoga danas za veinu jezika postoje okruenja za pisanje programa tzv. razvojna okruenja. Razvojna okruenja ine programiranje "ugodnijim". Editori razvojnih okruenja najee razliitim bojama oznaavaju kljune rijei, komentare, varijable, Novija su razvojna okruenja jo inteligentnija pa na osnovu prvih nekoliko znakova predviaju unos, to znatno moe olakati posao programeru. Veina dananjih velikih informatikih tvrtki nudi razvojna okruenja za Javu. Borland je npr. napravio JBuilder, Microsoft je napravio J++, Sun je napravio Java Workshop, Veina ovih okruenja je komercijala i cijena im je nerijetko dosta visoka. Nae e razvojno okruenje u ovoj knjizi biti BlueJ. BlueJ je razvojno okruenje koje korisniku omoguava da "razmilja na objektni nain". Osim toga izuzetno je pogodan za kontrolu izvravanja pojedinog dijela programa. No imajmo na umu i jedan bitan detalj a to je injenica da je BlueJ besplatan i dostupan svima na Internetu. BlueJ razvojno okruenje napisan je u Javi to omoguava njegovo izvravanje na svim operativnim sustavima. Razvojno okruenje skup programa koji programiranje u nekom programskom jeziku ine ugodnijim. Najee u sebi imaju ugraen editor za pisanje programa, omoguavaju kompajliranje programa, omoguavaju kontrolu izvravanja programa, BlueJ besplatno Java razvojno okruenje namijenjeno prvenstveno uenju objektnoorijentiranog programiranja u Javi.

Prije instalacije BlueJa na raunalo potrebno je instalirati Java 2 runtime (JDK). JDK i BlueJ nalaze se na CD-u u prilogu ove knjige. Pokretanjem BlueJ aplikacije na ekranu e se pojaviti suelje koje e nam omoguiti pisanje programa.

16

Java i objektno orijentirano programiranje

Slika 2-3 Suelje BlueJ razvojnog alata Nakon to smo pokrenuli program za poetak emo otvoriti novi projekt. Novi projekt emo otvoriti tako da u izborniku Project odaberemo New Project.

Slika 2-4 Kreiranje novog projekta Nadalje emo u prozoru koji se otvori upisati ime projekta. BlueJ e potom kreirati poseban direktorij s upisanim imenom te e otvoriti novi prozor za upravo kreirani projekt.

17

Slika 2-5 Prozor kreiranog projekta Sljedei korak je dodavanje klase u projekt. Klasu emo u ovom trenutku poistovjetiti s programom. Vie rijei o klasama bit e u sljedeim poglavljima. Novu emo klasu kreirati tako da kliknemo na gumb New Class koji se nalazi pri vrhu lijevog dijela prozora. U prozoru koji se otvori upiemo ime klase.

Slika 2-6 Prozor za kreiranje klase Nakon to smo kliknuli na gumb OK prozor e se zatvoriti i u postojeem prozoru e se pojaviti jo jedna sliica koja e predstavljati upravo kreiranu klasu, a pri vrhu sliice e se nalaziti ime klase (zbroj).

18

Java i objektno orijentirano programiranje

Slika 2-7 Kreirana klasa je dodana u projekt Ovime definicija klase nije gotova. tovie definicija klase tek slijedi. Stoga emo kliknuti desnim gumbom mia na sliicu klase zbroj i u izborniku odabrati Open Editor ili jednostavno 2 puta kliknuti lijevim gumbom mia na ime klase.

Slika 2-8 Pokretanje editora za definiranje klase U editoru koji se je otvorio nalazi se ve upisan dio klase koju elimo kreirati. Za poetak emo izbrisati sadraj prozora i upisati sljedei kd: public class zbroj { public static int zbroj(int x, int y) { 19

return x + y; } }

Slika 2-9 Izgled prozora nakon to upiemo kd klase Sljedei je korak kompajliranje ovako programa. Da bismo program kompajlirali lijevim emo gumbom mia kliknuti na gumb Compile u gornjem izborniku prozora. Prije samog kompajliranja program e se spremiti. Ukoliko kompajler nije naiao na greke u kdu, u donjem e se dijelu prozora pojaviti poruka: Class compiled - no syntaks errors Ponovo emo se vratiti na prozor u kojem su prikazane sve klase naeg projekta (Slika 2-8) te emo desnim gumbom mia kliknuti na sliicu klase zbroj te emo iz izbornika odabrati int zbroj(x, y). Time emo u stvari pokrenuti metodu zbroj() klase zbroj.

Slika 2-10 Pokretanje metode zbroj() Budui da metoda zbroj() ima dva ulazna parametra (varijable) (x i y) te vraa njihov zbroj, otvorit e se novi prozor unutar kojeg emo upisati vrijednosti za parametre x i y.

20

Java i objektno orijentirano programiranje

Slika 2-11 Okvir za definiranje vrijednosti parametara metode Klikom na gumb OK otvorit e se novi prozor u kojem e se nalaziti vrijednost koju metoda vraa. Budui da naa metoda rauna zbroj brojeva x i y rezultat e, za unesene vrijednosti 4 i 5 biti 9.

Slika 2-12 Rezultat izvravanja metode Jednom kreiranu klasu mogue je ponovno otvarati i po potrebi mijenjati te izvravati. Klasu emo otvoriti tako da u izborniku Project odaberemo Open Project.

Slika 2-13 Otvaranje postojeeg projekta

21

U prozoru koji se otvori odaberemo ime projekta koji elimo otvoriti.

Slika 2-14Odabiranje projekta koji elimo otvoriti Na kraju emo kliknuti na gumb Open i pojavit e se prozor u kojem e se nalaziti sve klase odabranog projekta.

Slika 2-15 Prozor s klasama odabranog projekta Pojmove kao to su klasa, metoda, s kojima smo se ovdje susreli detaljno emo objasniti u nastavku knjige. Za sada e za nas klasa biti program a metodu moemo zamisliti kao manji program unutar velikog programa. Metoda ima svoje ulazne parametre, to su u stvari podaci koji su metodi potrebni da bi rijeila neki problem. U opisanom primjeru imali smo jednu metodu zbroj() koja je raunala zbroj dvaju prirodnih brojeva. Da bi metoda mogla izraunati zbroj dva broja treba znati koji su to brojevi, stoga je imala dva ulazna parametra, brojeve x i y.

22

Java i objektno orijentirano programiranje

Elementi Jave
Da bismo uspjeno programirali u nekom programskom jeziku trebamo dobro vladati njegovim sintaksnim i semantikim pravilima, kljunim rijeima te specijalnim znakovima. Sintaksa jezika odnosi se na naredbe programskog jezika, objanjava kako izgledaju ispravno napisani izrazi (naredbe),... Semantika se odnosi na znaenje naredbi, tj. to ta naredba radi. Specijalni znakovi su znakovi koji imaju svoje znaenje unutar programskog jezika. Neki od specijalnih znakova dani su sljedeom tablicom:
Kategorija Specijalni znakovi

matematiki + - * / interpunkcijski . , ? ; relacijski < <= > >= == != Tablica 2-1 Najee koriteni specijalni znakovi u Javi Kao to postoje simboli koji imaju svoje specijalno znaenje, tako postoje i rijei koje imaju specijalno znaenje, koje nazivamo rezervirane rijei (keywords). Neke od njih su: class, public, private, static, int, float, boolean,... Kao to smo mogli primijetiti u primjeru iz zadnjeg poglavlja, pri samom kreiranju klase, morali smo joj dodijeliti ime (zbroj), nadalje smo metodi isto tako morali dodijeliti ime (zbroj), a dodatno smo imenovali i parametre (varijable) u metodi (x, y). Openito emo sva takva i slina imena zvati identifikatori. Identifikatori u Javi mogu se sastojati od slova engleske abecede, znamenaka i znakova "_" i "$", pri emu znamenka ne moe biti na prvom mjestu. Duljina identifikatora (broj znakova) u Javi nije ograniena. Ovdje je isto tako bitno napomenuti da je Java case sensitive jezik, to znai da se velika i mala slova razlikuju (npr. Zbroj i zbroj su dva razliita identifikatora). Primjer 2 1: Sljedei identifikatori su korektno napisani: prvi $2 _treci$a Primjer 2 2: Primjeri neregularnih identifikatora: 1a na prvom mjestu se ne smije nalaziti znamenka zbroj brojeva sadri razmak kua nedozvoljeni znak Kako bismo se u vlastitom kodu uspjeno snalazili i nakon nekog vremena, odnosno kako bismo olakali razumijevanje koda svima onima koji e ga kasnije itati, koristit emo komentare. Openito je namjena komentara da se unutar njih stavljaju objanjenja koda ili neke napomene za izmjene programa. elimo li u komentar staviti samo jednu liniju koda, na poetku te linije emo staviti //. //komentar Vie linija koda emo staviti u komentar tako da na poetku prve linije koda stavimo /*, te iza posljednjeg znaka stavimo */.

23

/* komentar1 komentar2 komentar3 */ Npr. //ovo je komentar ili /* ovo je komentar */

24

Java i objektno orijentirano programiranje

Tipovi podataka
U osnovi kod Jave razlikujemo dvije kategorije tipova podataka: objektni tipovi podataka neobjektni tipovi podataka Objektni tipovi podataka definirani su klasama i o njima e biti govora neto kasnije. Neobjektni (jednostavni) tipovi podataka i shematski su prikazani na sljedeoj slici:
byte

short cjelobrojni int

long

znakovni

char

float realni double

logiki

boolean

Slika 2-16 Jednostavni tipovi podataka

25

Jednostavni tipovi podataka Cjelobrojni tip podataka Unutar cjelobrojnog tipa podataka postoji nekoliko podtipova. Podtipovi se razlikuju s obzirom na raspon vrijednosti za koje su definirani, to neposredno utjee na koliinu memorije koju zauzimaju. Raspon vrijednosti i koliina memorije potrebne za spremanje jedne varijable dani su sljedeom tablicom: Tip podataka byte short int long Raspon vrijednosti Zauzee memorije (bitovi) -128 do 127 8 -32768 do 32767 16 -2147483648 do 2147483647 32 -922337203684547758808 do 922337203684547758807 64 Tablica 2-2 Cjelobrojni tipovi podataka

Znakovni tip podataka Tip podataka char namijenjen je radu s znakovima. Vrijednosti koje ovaj tip podataka moe primiti su bilo koji znak iz tzv. Unicode skupa znakova. Znakovi se navode unutar jednostrukih navodnika npr. 'A', '0', '+', '%',... Osim ovakvih znakova, tip podataka char sadri i neke znakove koji postoje na tipkovnici, ali za njih ne postoji posebna oznaka (npr. tipka tab). Takvi znakovi sastoje se od oznake "\" i odgovarajueg znaka. Neki od takvih oznaka dani su u sljedeoj tablici: Znak \' \" \\ \r \n \t \b Opis jednostruki navodnik dvostruki navodnik kosa crta "\" prelazak u novi red (carriage return) prelazak u novi red (line feed) horizontalni tabulator backspace Tablica 2-3 Neki od specijalnih znakova

26

Java i objektno orijentirano programiranje

Realni tip podataka Kao to mu i ime govori, ovaj emo tip podataka koristiti pri radu s realnim vrijednostima. Java brojeve prikazuje u tzv. eksponencijalnom obliku. Kod takvog prikaza broj se sastoji od sljedeih elemenata: jednoznamenkasti cijeli broj decimalna toka 6 decimala znak "E" eksponent Primjer 2 3: Primjer zapisa realnih brojeva u eksponencijalnom obliku broj eksponencijalni zapis objanjenje 315.46 3.154600E2 315.46 = 3.1546 102 0.02 2.000000E-2 0.02 = 2 10-2 -3.14 -3.140000E0 -3.14 = -3.14 100 Osnovni podtipovi realnog tipa podataka su dani su sljedeom tablicom: Tip podataka float double Raspon vrijednosti
-3.4 1038 do 3.4 1038 -1.7 10308 do 1.7 10308

Zauzee memorije (bitovi) 32 64

Tablica 2-4 Realni tipovi podataka Osim po rasponu vrijednosti i koliini memorije koju zauzimaju, ovi se tipovi podataka razlikuju i s obzirom na preciznost, tj. s obzirom na broj bitnih decimalnih znamenaka. Broj decimalnih znamenaka koje e se uzimati u obzir kod float tipa podataka je 6 ili 7, odnosno 15 kod double. Logiki tip podataka Logiki tip podataka (boolean) moe sadravati samo dvije vrijednosti true ili false (istina ili la). Memorija potrebna za pohranjivanje vrijednosti tipa boolean je 1 bit.

27

Deklaracija varijabli Kao to smo ve rekli, varijable su u stvari "oznake" za memorijske lokacije na koje emo privremeno pohranjivati podatke tijekom izvravanja programa. Prije pohranjivanja vrijednosti trebamo odrediti koji tip vrijednosti emo pohraniti na odgovarajuu lokaciju, te rezervirati (alocirati) prostor. To sve emo napraviti deklaracijom varijabli. Opi oblik deklaracije varijabli u Javi je: tip ime_varijable; gdje je tip bilo koji tip podataka (int, float, boolean, char,...). Ukoliko se istovremeno deklarira vie varijabli istog tipa, one se meusobno odvajaju zarezom. Primjer 2 4: Primjeri deklaracija varijabli: int n; float a, b; char c; boolean t; Neki programski jezici deklariranjem varijable automatski postavljaju na neku poetnu (inicijalnu) vrijednost, tj. inicijaliziraju ih na neku vrijednost. Npr. u Pascalu e varijabla tipa byte deklariranjem biti inicijalizirana na vrijednost 0. Kod Jave to nije sluaj. Kod Jave vrijednosti varijable nakon deklaracije ne moraju biti inicijalizirane, i ukoliko to ne napravimo eksplicitno a u programu koristimo takve varijable prilikom kompajliranja e se pojaviti greka. Varijabli emo pridruiti vrijednost operatorom "=". Primjer 2 5: Primjeri pridruivanja vrijednosti varijablama: n = 2; x = 3.14; c = 'c'; t = false; Prilikom pridruivanja vrijednosti varijablama valja voditi rauna da vrijednost koja se pridruuje varijabli bude istog tipa kao i varijabla. Vrijednost varijable mogue je inicijalizirati na neku vrijednost i prilikom deklaracije varijabli. U takvim sluajevima e deklaracija varijable imati sljedei oblik: tip ime_varijable = vrijednost; Primjer 2 6: Primjer deklaracije varijabli gdje se varijable inicijaliziraju neposredno iza deklaracije int i = 3; float x = -8.17; 28

Java i objektno orijentirano programiranje char c = 'y', d = 'n'; Isto tako je prilikom deklariranja varijabli i njihovog inicijaliziranja, mogue koristiti i izraze koji e varijabli inicijalno pridruiti vrijednost tog izraza. Kod ovakve inicijalizacije trebamo voditi rauna da su sve varijable, koje koristimo s desne strane znaka jednakosti inicijalizirane. Primjer 2 7: Primjer deklaracije varijabli gdje se varijable inicijaliziraju neposredno iza deklaracije i to dodjeljivanjem vrijednosti izraza. int i = 3; int j = i*2;

Operatori Osnovni cilj programiranja je na osnovu ulaznih podataka dobiti potrebne rezultate. Da bismo iz ulaznih podataka dobili rezultate trebamo nad podacima izvriti odgovarajue manipulacije. Manipulacije nad podacima izvrit emo pomou operatora. Operatore u Javi dijelimo u nekoliko osnovnih kategorija: aritmetiki operatori; relacijski operatori; logiki operatori; bitovni operatori.

S obzirom na koliko se podataka operator primjenjuje razlikujemo dvije vrste operatora: unarni operatori primjenjuju se samo na jednu vrijednost (npr. operator ++, koji poveava vrijednost varijable za 1); binarni operatori primjenjuju se na dvije vrijednosti (npr. operator + za zbrajanje dvaju brojeva). Aritmetiki operatori U Javi je mogue koristiti sljedee aritmetike operatore: Operator + * / % ++ -+= -= *= /= %= Znaenje zbrajanje oduzimanje mnoenje dijeljenje ostatak cjelobrojnog dijeljenja poveava vrijednost varijable za 1 smanjuje vrijednost varijable za 1 poveavanje vrijednosti varijable za odreeni broj analogno kao += analogno kao += analogno kao += analogno kao += Tablica 2 5 Aritmetiki operatori

29

Primjer 2 8: Koja e biti vrijednost varijable x nakon djelovanja odgovarajuih operatora, ako je x cjelobrojna varijabla ija je vrijednost postavljena na 5? a) b) c) d) e) x++; x = x + 3; x = x / 2; x = x % 3; x *= 3;

Rjeenja: a) 6 b) 8 c) 2 (budui da je x cjelobrojna varijabla operator / se tumai kao operator cjelobrojnog dijeljenja) d) 2 (5 cjelobrojno podijeljeno s 3 je 1 i 2 je ostatak) e) 15 Relacijski operatori Relacijski operatori koristi se za odreivanje odnosa izmeu dviju vrijednosti. Relacijski operatori dani su sljedeom tablicom: Operator == != > >= < <= Znaenje jednako razliito vee vee ili jednako manje manje ili jednako Tablica 2 6 Relacijski operatori

Relacijski operatori == i != mogu biti upotrijebljeni nad svim tipovima podataka (neobjektnim i objektnim), dok operatori >, <, >=, <= mogu biti upotrijebljeni samo nad onim tipovima podataka koji imaju poredak, tzv. ordinalni ili redni tipovi podataka. Vrijednosti relacijskih operatora mogu biti true ili false. Primjer 2 9: Koje e biti vrijednosti sljedeih izraza? a) 3 <= 5 b) 'a' < 'A' c) 3 != 5 Rjeenja: a) true (3 je manje od 5) b) false (slovo 'a' se u Unicode tablici nalazi iza slova 'A') c) true (3 je razliito od 5)

30

Java i objektno orijentirano programiranje

Logiki operatori Logiki operatori definirani su nad logikim tipom podataka (boolean), vrijednosti na koje se ovi operatori primjenjuju i rezultati mogu biti samo vrijednosti true ili false. Najee koriteni logiki operatori dani su sljedeom tablicom: Operator ! && || Znaenje negacija logiki I logiki ili Tablica 2 7 Logiki operatori Djelovanje logikih operatora prikazano je u sljedeom tablicom: a b !a a && b a || b false false true false false false true true false true true false false false true true true false true true Tablica 2 8 Djelovanje logikih operatora Primjer 2 10: Koje e biti vrijednost varijable c nakon odgovarajuih operacija, ako je vrijednost varijable a = true i b = false? a) b) c) d) !a b && a !(a && b) a && (b || (!b))

Rjeenja: a) false b) false c) false d) true e) true

31

Prioritet operatora Promotrimo sljedei izraz: c = 2 + 3 * 5; nije sasvim jasno koju e vrijednost imati varijabla c nakon ovakvog pridruivanja. Hoe li se najprije izvriti zbrajanje pa nakon toga mnoenje ili e se najprije izvriti mnoenje pa nakon toga zbrajanje? Kao to postoji prioritet operatora u matematici, tako postoji i u Javi i tovie dosta su slini. Prioritet operatora dan je sljedeom tablicom: Prioritet 1 2 3 4 5 6 7 8 Operatori () ++, --, ! *, /, % +, <, <=, >, >= ==, != && || Tablica 2 9 Prioritet operatora

Openito se izrazi izvravaju od lijeva na desno. Primjer 2 11: Vrijednost izraza 2 + 3 * 4 e biti 14, najprije se izvrava mnoenje (3 * 4), a zatim zbrajanje (2 + 12)

Izraunavanje mjeovitih izraza Mjeoviti izrazi su oni koji u sebi sadre cjelobrojne i realne vrijednosti. Primjer takvog izraza je: 8 / 3 + 2.7 Primijetimo da nije svejedno hoemo li brojeva 8 i 3 podijeliti kao cijele brojeve ili kao realne. Pravila za izvravanje mjeovitih izraza: ako su oba operanda, na koje se odnosi operator istog tipa (oba su cijeli ili realni brojevi), operator e se izvriti kao operator nad tim tipom podataka ako operandi nisu istog tipa (jedan je cijeli a drugi realni broj), prilikom izraunavanja e se cijeli broj pretvoriti u realni Primjer 2 12: Kolika e biti vrijednost izraza 5 / 3 + 3.5

32

Java i objektno orijentirano programiranje Budui da su brojevi 5 i 3 oba cijeli brojevi, vrijednost operatora 5 /3 bit e 1, te je izraz poprimio oblik 1 + 3.5. Kako je 3.5 realan broj a 1 cijeli, broj jedan e isto postati realan i tada e izraz imati oblik 3.5 + 1.0 = 4.5 Konverzija tipova (casting) U prethodnom smo odjeljku nauili kako se izraunavaju mjeoviti izrazi. Meutim esto puta emo trebati neki tip podataka konvertirati u neki drugi (realni broj u cijeli ili obrnuto). Java omoguava konverziju tipova podataka pomou posebnog operatora i to na sljedei nain: (tip) (izraz); Ukoliko realni broj pretvaramo u cijeli, realnom e se broju jednostavno odbaciti decimale. Primjer 2 13: Izraz (int) (3.14); (float) (10); (float) (10) / 4; (float) (10 / 4); Vrijednost 3 10.0 = 10.0 / 4 = 2.5 = float (2) = 2.0

Osim konverzije cijelih brojeva u realne i obrnuto, mogue je konvertirati i znakove u cijele brojeve i obrnuto. Pretvaranje znakova u cijele brojeve i obrnuto temelji se na Unicode tablici gdje je svaki broj predstavljen odgovarajuim brojem (kodom). Tako je npr. (int) ('b') 98 ('b' je na 98. mjestu u Unicode tablici), (int ) ('8') je 56,... Analogno tome je (char) (98) 'b'.

33

Prvi programi
Sada, nakon to smo nauili osnovno identifikatorima, tipovima podataka, inicijalizaciji te operatorima, moemo zapoeti s pisanjem jednostavnih programa u Javi. Za nas e u ovom trenutku program biti jedna metoda unutar neke klase, koju emo pokretati direktno i prosljeivati joj vrijednosti preko dijalokog prozora (Slika 2 - 11). Svaki na "program" e u ovom trenutku imati sljedei oblik: public class ime_klase { public static tip ime_metode(parametri) { kod metode; return vrijednost; } } Primjer 2 14: Napiimo metodu kojoj emo prosljeivati duljine stranica pravokutnika (cijeli brojevi), a koja e vraati povrinu tog pravokutnika. Rjeenje: Budui da se radi o pravokutniku ije su stranice cijeli brojevi, povrina tog pravokutnika bit e isto tako cijeli broj. Budui da naa metoda vraa povrinu (cijeli broj), zaglavlje metode (prvi red) e biti: public static int povrsina (int a, int b) public i static emo za sada pisati u svim primjerima, a detaljno emo ih objasniti kasnije. int je tip podataka koji metoda vraa (cijeli broj) povrsina je ime metode int a, int b su popisi parametara koji se prosljeuju metodi (duljine stranica pravokutnika) Budui da je povrina pravokutnika jednaka umnoku duljina stranica, deklarirat emo varijablu P (cjelobrojnog tipa), u koju emo zapisati povrinu pravokutnika. int P; P = a * b; Na kraju e metoda vratiti povrinu, naredbom: return P; Dakle na program e imati sljedei oblik:
public class pravokutnik { public static int povrsina(int a, int b) { int P; P = a * b; return P; } }

34

Java i objektno orijentirano programiranje

Metodu emo nadalje pokrenuti na nain kao to je to opisano na poetku poglavlja. Primjer 2 15: Napiimo metodu koja e unositi duljine stranica trokuta i vraati povrinu tog trokuta. Povrinu trokuta, ije su stranice a, b i c raunat emo Heronovom formulom: a+b+c P = s (s a )(s b )(s c ) , pri emu je s = . 2 Drugi korijen iz realnog broja raunat emo naredbom Math.Sqrt (). Dakle, rjeenje e biti:
public static double povrsina(int a, int b, int c) { double P, s; s = (a + b + c) / 2; P = Math.sqrt(s * (s - a) * (s - b) * ( s - c)); return P; }

U prolom smo primjeru koristili naredbu Math.sqrt (). Ova naredba rauna drugi korijen iz realnog broja. Vrijednost koju ova naredba vraa je tipa double. Openito Math je gotova Javina klasa koja sadri metode za rad s matematikim funkcijama. Neke od metoda klase Math dane su u sljedeoj tablici: Metoda abs (x) ceil (x) Opis apsolutna vrijednost broja x najmanji cijeli broj koji je vei ili jednak od realnog broja x (vrijednost koju vraa je tipa double) exp (x) vraa vrijednost funkcije ex floor (x) najvei cijeli broj koji je manji ili jednak od realnog broja x (vrijednost koju vraa je tipa double) log (x) prirodni logaritam broja x max (x, y) vei od brojeva x i y min (x, y) manji od brojeva x i y random () vraa sluajan broj izmeu 0.0 i 1.0 round (x) cijeli broj koji je najblii realnom broju x (vrijednost koju vraa je tipa double) sqrt (x) drugi korijen iz broja x cos (x) kosinus kuta x (x je u radijanima) sin (x) sinus kuta x (x je u radijanima) tan (x) tangens kuta x (x je u radijanima) Tablica 2 10 Neke od metoda klase Math.

35

Zadaci za vjebu:
1. 2. 3. 4. 5. to je aplikacija, a to applet? Objasni postupak prevoenja Java programa. to je razvojno okruenje? to je BlueJ i koje su mu osnovne karakteristike? Zadana je klasa zad1 koja sadri jednu metodu poruka ():
public class zad1 { public static String poruka() { return "Dobro jutro"; } }

a) to e biti rezultat izvravanja metode poruka ()? b) Izmjeni metodu poruka () tako da vraa poruku "Dobar dan" 6. Zadana je klasa zad2 koja sadri jednu metodu potencija (x):
public class zad2 { public static int potencija(int x) { return x * x; } }

b) to e biti rezultat izvravanja metode potencija (x) za vrijednost parametra x = 3? c) Izmjeni metodu potencija (x) tako da vraa x * x * x 7. Zadana je klasa zad3 koja sadri jednu metodu pravokutnik (a, b):
public class zad3 { public static int pravokutnik(int a, int b) { return a * b; } }

b) to e biti rezultat izvravanja metode pravokutnik (a, b) za vrijednost parametara a = 7 i b = 3? c) Izmjeni metodu pravokutnik (a, b) tako da vraa opseg pravokutnika stranica duljina a i b 8. Zadana je klasa zad4 koja sadri jednu metodu pozdrav (ime):
public class zad4 { public static String pozdrav(String ime) {

36

Java i objektno orijentirano programiranje


return "Ja sam " + ime; } }

a) to e biti rezultat izvravanja metode pozdrav (ime) za vrijednost parametra ime = "Ana"? b) Izmjeni metodu pozdrav (ime) tako da npr. za vrijednost parametra ime = "Iva" vraa poruku "Iva, jesi li dobro?" 9. Zadana je klasa zad5 koja sadri jednu metodu izracunaj (x, y):
public class zad5 { public static String izracunaj(int x, int y) { int z = x + y; return "Zbroj je " + z; } }

a) to e biti rezultat izvravanja metode izracunaj (x, y) za parametre x = 3 i y = 5? b) Izmjeni metodu izracunaj (x, y) tako da rauna razliku brojeva x i y te ispisuje poruku "Razlika je " (operator oduzimanja je -) c) Izmjeni metodu izracunaj (x, y) tako da rauna umnoak brojeva x i y te ispisuje poruku "Umnoak je " (operator mnoenja je *) 10. Zadana je klasa zad6 koja sadri jednu metodu zbroj (x, y):
public class zad6 { public static String zbroj(int x, int y) { int z = x + y; return x + " + " + y + " = " + z; } }

a) to e biti rezultat izvravanja metode zbroj (x, y) za vrijednost parametara x = 7 i y = 11? b) Klasi zad6 dodaj metodu razlika (x, y) koja e vraati razliku brojeva x i y i to u obliku x y = razlika, npr. za x = 9 i y = 2 treba vratiti 9 2 = 7 c) Klasi zad6 dodaj metodu umnozak (x, y) koja e vraati umnoak brojeva x i y i to u obliku x * y = umnozak, npr. za x = 4 i y = 9 treba vratiti 4 * 9 = 36 11. Definiraj klasu zad7 koja e sadravati metodu sekunde (h, m, s), iji e parametri biti vrijeme u satima (h), minutama (m) i sekundama (s). Metoda treba vraati vrijeme izraeno u sekundama (1 sat ima 3600 sekundi, 1 minuta ima 60 sekundi). 12. to je sintaksa a to semantika programskog jezika? 13. to je identifikator? 14. to znai da je neki jezik case senisitve? 15. Koje su dvije osnove kategorije tipova podataka u Javi? Objasni razliku. 16. Nabroji neke jednostavne tipove podataka. 17. Koji su podtipovi cjelobrojnog tipa podataka?

37

18. Navedi realne tipove podataka u Javi. 19. Deklariraj varijable a, b, x i y tako da a i b budu cjelobrojnog a x i y realnog tipa. 20. Deklariraj cjelobrojnu varijablu a te joj prilikom deklaracije pridrui vrijednost 5. 21. to e pisati u varijabli a nakon sljedee naredbe: a. a++; b. a--; c. a += 4; d. a *= 2; e. a = a % 5; f. a /= 2; Ako varijabla a ima vrijednost 3; 20. Neka je a cjelobrojna varijabla. Napii naredbu koja e: g. vrijednost varijable a smanjiti za 5; h. vrijednost varijable a poveati za 1; i. vrijednost varijable a poveati 5 puta. 22. Odredi vrijednost sljedeih izraza: a. 2 < 3 && 3 <= 2 b. !(5 > 3 || !(5 > 4)) Odredi vrijednost sljedeih izraza, ako varijabla a ima vrijednost true a varijabla b vrijednost false: a. !a; b. !(a || b) c. (a || b) && !b d. (!b && !a) || (!a || !b) to e pisati u varijabli c nakon izvravanja sljedeih naredbi, ako je vrijednost varijable a jednaka 8, a varijable b 10: a) c = a + 2*b; b) c = 2 * (a + b); c) c = a % 3 * 4; Izraunajte vrijednosti sljedeih izraza: a. a * b; b. a * c; c. a / b; d. a / c; e. (int) a + c; f. (int) (a + c); g. a + (int) c + (int)(c * a) 26. Napii metodu iji e ulazni parametri biti duljine stranica pravokutnika, metoda treba vraati opseg pravokutnika. ulaz izlaz 10 2 3 27. Napii metodu iji e ulazni parametar biti dvoznamenkasti prirodan broj n. Metoda treba vraati apsolutnu vrijednost razlike znamenaka broja n.

23.

24.

25.

38

Java i objektno orijentirano programiranje

ulaz izlaz 4 48 28. Napii metodu iji e ulazni parametar biti troznamenkasti prirodan broj n. Metoda treba vraati broj koji se dobije okretanjem broja n. ulaz izlaz 123 321 29. Napii metodu iji e ulazni parametri biti realni i imaginarni dio dvaju kompleksnih brojeva. Metoda treba vraati: a) zbroj kompleksnih brojeva; ulaz izlaz 4 + 6i 1 2 3 4 b) umnoak kompleksnih brojeva; ulaz izlaz -5 + 10i 1 2 3 4 c) zbroj apsolutnih vrijednosti kompleksnih brojeva. ulaz izlaz 7.236 1 2 3 4 30. Napii metodu iji e parametri biti sati, minute i sekunde poetka te kraja filma. Metoda treba vraati trajanje filma (u satima, minutama i sekundama). Napomena: film e zapoeti i zavriti u istom danu. ulaz izlaz 19 10 00 1:55:11 21 05 11

39

3
Naredbe grananja
if, if/else naredba switch/case naredba

40

Java i objektno orijentirano programiranje

if, if/else naredba


Metode koje smo do sada pisali su dobivale parametre izvana, uvijek su obavile iste operacije nad parametrima i vraale rezultate. U praksi su takvi problemi izuzetno rijetki. Prvi sljedei korak nakon ovakvih problema su problemi kod kojih se ovisno o nekom uvjetu izvrava odreeni dio programa. U takvim sluajevima emo koristiti neku od naredbi grananja. U ovom emo se poglavlju detaljnije upoznati s naredbom if i svim njenim oblicima. Najjednostavniji oblik if naredbe je: if (uvjet) naredba; Shematski bi se ova naredba mogla prikazati kao:

uvjet
la

istina

naredba

Slika 3 1 Shematski prikaz naredbe grananja Ukoliko je uvjet istinit izvrava se naredba, ukoliko je uvjet laan ne dogaa se nita, tj. prelazi se na prvu sljedeu naredbu iza if. Ukoliko je naredba sloena naredba sloena, tj. sastoji se od vie jednostavnih naredbi, ona se navodi unutar vitiastih zagrada {}. Primjer 3 1: Ukoliko je vrijednost varijable n jednaka 65 varijabli, vrijednost varijable c e postati 'A'. if (n == 65) c = 'A'; Napomena: Ukoliko uvjet ne stavimo unutar zagrada, doi e do greke prilikom kompajliranja. Osim gore opisanog oblika if naredbe, esto puta se koristi i tzv. if/else oblik. Sintaksa takvog oblika if naredbe je: if (uvjet) naredba1; else naredba2; Shematski bi takvu naredbu prikazali na sljedei nain:

41

naredba2

la

uvjet

istina

naredba1

Slika 3 2 Shematski prikaz if/else naredbe Ukoliko je uvjet istinit izvrava se naredba1, inae se izvrava naredba2. Primjer 3 2: Napiimo metodu kojoj emo prosljeivati koeficijente kvadratne jednadbe a metoda e vraati true ukoliko jednadba ima realnih rjeenja, inae e vraati false. Rjeenje: Prisjetimo se da e jednadba imati realnih rjeenja ako joj je diskriminanta vea ili jednaka od 0. Diskriminanta kvadratne jednadbe ax 2 + bx + c = 0 dana je s D = b 2 4ac . Dakle rjeenje bi bilo:
public static boolean RRjesenje (int a, int b, int c) { int D; D = b * b 4 * a * c; if (D >= 0) return true; else return false; }

Primjer 3 4: Napiimo metodu koja e unositi iznos bruto plae u kunama. Procedura treba vraati iznos poreza na plau, ako je poznato da je do iznosa od 5000 kn porez 15%, za iznos od 5000 do 10000 je porez 25%, te je za iznos iznad 10000 porez 35%. Rjeenje:

42

Java i objektno orijentirano programiranje

switch/case naredba
esto puta kod grananja nailazimo na vie disjunktnih uvjeta. Koritenje if naredbe u takvim sluajevima moe biti nespretno. Osim if naredbe, Java nam, kao i veina ostalih programskih jezika, nudi i naredbu switch. Opi oblik ove naredbe je: switch (izraz) { case v_1: naredba_1; break; case v_2: naredba_2; break; ... case v_n: naredba_n; break; } Shematski prikaz switch naredbe je:

uvjet

Da v_1 Ne v_2 Ne ... Da v_n Da

naredba_1

naredba_2

naredba_n

Slika 3 3 Shematski prikaz switch naredbe Pri emu su: izraz bilo koji izraz ija je vrijednost ordinalnog tipa (najee cjelobrojni ili znakovni tip) v_1, v_2,... v_n vrijednosti odgovarajueg tipa (isti kao izraz) naredba_1, naredba_2,... naredba_n naredba koja se izvrava ukoliko vrijednost izraza odgovara odgovarajuoj vrijednosti.

43

Odnosno, ako je vrijednost izraza izraz jednaka v_1 izvrava se naredba_1, ukoliko je vrijednost izraz jednaka v_2 izvrava se naredba_2,... Naredba break openito slui za prekidanje nekog niza naredbi (najee izlazak iz petlje). Moda nije sasvim jasno koja je ovdje uloga naredbe break. Radi se o sljedeem. Ukoliko ne bismo stavili naredbu break nakon naredba_1, te ako bi vrijednost izraza izraz bila jednaka v_1, izvrila bi se naredba_1, ali i sve naredbe iza nje, naredba_2 itd. Stoga koristimo naredbu break da bismo, nakon to se odgovarajua naredba izvri, izali iz switch naredbe. Openito emo switch naredbu koristiti kada imamo vie od 2 uvjeta kod grananja. Koritenje switch naredbe uglavnom se moe zamijeniti if naredbom Napomena: Primijetimo izraz kod switch naredbe uvijek dolazi unutar zagrada (). "Tijelo" switch naredbe piemo unutar vitiastih zagrada {}. Prije nego zaponemo rjeavati sljedei primjer rei emo par rijei o jo jednom tipu podataka: String. O tipu podataka String detaljnije emo govoriti u nastavku. Na String emo u ovom trenutku gledati kao na sloeni tip podataka, ije su vrijednosti rijei niz od jednog ili vie znakova. Vrijednosti tipa String se piu unutar dvostrukih navodnika ("). Napomena: Primijetimo da se vrijednosti tipa String piu unutar dvostrukih navodnika ("), za razliku od tipa char, gdje se vrijednosti piu unutar jednostrukih navodnika ('). Deklaracija varijable tipa String identina je deklaracije bilo koje druge varijable nekog jednostavnog tipa (char, int,...). Primjer 3 5: Napiimo metodu iji e ulazni parametar biti jednoznamenkasti prirodan broj n. Metoda treba vraati broj n ispisan rijeima. Rjeenje: Dani problem emo za usporedbu rijeiti na dva naina: pomou if i pomou switch naredbe:
//rjeenje pomou if naredbe public static String broj1(int n) { String s = ""; if (n == 0) s = "Nula"; else if (n == 1) s = "Jedan"; else if (n == 2) s = "Dva"; else if (n == 3) s = "Tri"; else if (n == 4)

44

Java i objektno orijentirano programiranje


s = "etiri"; else if (n == 5) s = "Pet"; else if (n == 6) s = "est"; else if (n == 7) s = "Sedam"; else if (n == 8) s = "Osam"; else if (n == 9) s = "Devet"; return s; } //rjeenje pomou switch naredbe public static String broj2 (int n) { String s = ""; switch (n) { case 0: s = "Nula"; break; case 1: s = "Jedan"; break; case 2: s = "Dva"; break; case 3: s = "Tri"; break; case 4: s = "etiri"; break; case 5: s = "Pet"; break; case 6: s = "est"; break; case 7: s = "Sedam"; break; case 8: s = "Osam"; break; case 9: s = "Devet"; break; } return s; }

45

Zadaci za vjebu
1. Objasni if naredbu. 2. to e pisati u varijabli n nakon sljedeeg dijela programa:
int k = 3, n; if (k < 0) n = 3*k; else n = k * k;

3. to e pisati u varijabli n nakon izvravanja sljedeeg dijela programa:


int k = 5, n; if (k < 0) n = 2 * k + 3; else if (k >= 0 && k < 10) n = - Math.abs (k * k - 5 * k - 7); else n = k * k - k + 3;

4. Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati true ako je broj paran, inae e vraati false. ulaz izlaz true 4 5. Napii metodu iji e ulazni parametar biti prirodni brojevi n i m. Metoda treba vraati vei od brojeva n i m. ulaz izlaz 6 4 6 6. Za godinu emo rei da je prijestupna ako je djeljiva s 4 i nije djeljiva sa 100 ili je djeljiva s 400. Napii metodu iji e ulazni parametar biti godina n, a metoda e vraati odgovarajuu poruku ("Godina je prijestupna" odnosno "Godina nije prijestupna"). ulaz izlaz 2004 Godina je prijestupna 7. Napii metodu iji e ulazni parametri biti tri prirodna broja (a, b i c). Ukoliko uitani brojevi zadovoljavaju nejednakost trokuta (zbroj bilo koja dva broja je manji od treeg), metoda treba vraati opseg trokuta ije su duljine stranica a, b i c, odnosno poruku "Uneseni brojevi ne mogu biti duljine stranica trokuta". ulaz izlaz 6.0 3 4 5

46

Java i objektno orijentirano programiranje 8. Napii metodu iji e ulazni parametri biti tri prirodna broja (a, b i c). Ukoliko stranice zadovoljavaju nejednakost trokuta, metoda treba ispisati je li trokut jednakostranian, jednakokraan ili raznostranian. ulaz izlaz Trokut je jednakokraan 4 3 3 9. Napii metodu koja e unositi datum roenja neke osobe te dananji datum (datum se unosi kao tri broja dan, mjesec, godina). Metoda treba vraati tonu starost te osobe (u danima). ulaz izlaz 10308 6 1 1977 28 3 2005 10. to e pisati u varijabli n nakon izvravanja sljedeeg dijela programa:
int n = 0, k = 4; switch (k) { case 1: n = 5 break; case 2: n = 4 break; case 3: n = 3 break; case 4: n = 2 break; case 5: n = 1 break; }

* k; * k; * k; * k; * k;

11.

Napii metodu iji e ulazni parametri biti dva prirodna broja n i m te jednu od operacija +, -, * ili /. Metoda treba vraati prirodan broj koji se dobije primjenom operacije nad varijablama n i m. ulaz izlaz 8 3 5 +

12.

Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati i n , pri emu je i imaginarna jedinica za koju vrijedi: i 2 = 1 . ulaz izlaz i 5

47

13.

Napii metodu iji e ulazni parametri biti dvoznamenkasti prirodan broj n. Metoda treba vratiti broj n ispisan rijeima. ulaz izlaz dvadeset tri 23

14.

Napii metodu koja e unositi datum u 21 stoljeu (dan, mjesec i godina) i ispisivati na koji dan u tjednu dolazi taj datum. Napomena: Poznato je da je 1. sijenja 2001. bio ponedjeljak. ulaz izlaz srijeda 30 3 2005

48

Java i objektno orijentirano programiranje

4
Petlje
for petlja while petlja do/while petlja

49

for petlja
Petlje emo openito koristiti kada neki dio programa, niz naredbi, trebamo ponoviti vie puta. Openito for petlju koristimo kada unaprijed znamo koliko puta trebamo izvriti neki dio programa. U Javi for petlja ima neto openitiji oblik i moemo ju koristiti i u nekim sluajevima kada ne znamo unaprijed koliko puta trebamo izvriti neki dio programa. Opi oblik for petlje je: for (kon_var = poc_vrij; uvjet; promj_kon_var) naredba; ili dijagramom toka bi to izgledalo ovako:

kon_var = poc_vrij

uvjet Da naredba

Ne

... promj_kon_var Slika 4 1 Shematski prikaz for petlje pri emu je:
kon_var kontrolna varijabla; uvjet najee je oblika kon_var >(<, >=, <=, ==, !=) vrijednost uvjet izvravanja for petlje; promj_kon_var promjena vrijednosti kontrolne varijable kon_var. Najee je oblika kon_var++ odnosno kon_var--.

Izvravanje for petlje:


na samom poetku se kontrolnoj varijabli (kon_var) pridrui neka poetna vrijednost (poc_vrij) ako je uvjet istinit: 1. izvrava se naredba 2. mijenja se vrijednost kontrolne varijable (promj_kon_var)

50

Java i objektno orijentirano programiranje 3. vraamo se na poetak for petlje i provjeravamo uvjet Napomena: Ukoliko je naredba sloena naredba trebamo ju pisati unutar {}. Trebamo biti jako oprezni prilikom promjene vrijednosti kontrolne varijable (prom_kon_var), trebamo osigurati da nakon konanog broja koraka kontrolna varijabla (kon_var) poprimi takvu vrijednost koja vie nee zadovoljavati uvjet. Ukoliko to ne osiguramo ui emo u beskonanu petlju i morat emo program prekinuti nasilno. Primjer 4 1: Koliko e se puta izvriti sljedei dio programa:
... int n = 5, t = 0; for (int i = 0; i <= n; i++) t++; ...

Rjeenje: - pri ulasku u for petlju varijabli i e se pridruiti vrijednost 0 (i = 0). Budui da je i (0) uistinu <= od n (5) izvrit e se naredba (t++) te e se vrijednost varijable i poveati za 1 (i++) i iznosit e 1; - budui da je i (2) <= n (5) izvrit e se naredba (t++) te e se vrijednost varijable i poveati za 1 (i++); - i (2) je i dalje manje ili jednako od n (5) ponovo se izvrava naredba t++ te vrijednost varijable i postaje 3; - kako je i (3) <= n (5) izvrava se t++, a i postaje 4; - i (4) <= n (5), dakle, izvrava se t++ te i poprima vrijednost 5; - i (5) <= n (5), izvrava se t++, a i postaje 6; - budui da i (6) nije <= n (5) izlazimo iz for petlje i idemo na prvu sljedeu naredbu iza for petlje. Prebrojimo li koliko smo puta izvrili naredbu t++, dobit emo traeni broj izvravanja for petlje. U ovom sluaju je taj broj 6. Primjer 4 2: Napiimo metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati ukupni broj djelitelja broja n. Rjeenje:
public static int pr42 (int n) { int t = 0; for (int i = 1; i <= n; i++) if (n % i == 0) t++; return t; }

U oba prethodna primjera smo vrijednost kontrolne varijable poveavali za 1. U sljedeem emo primjeru vrijednost kontrolne varijable smanjivati za 1. Primjer 4 3:

51

Napiimo metodu iji e ulazni parametar biti dva prirodna broja n i m. Metoda treba vraati najmanji zajedniki viekratnik brojeva n i m. Rjeenje: Prisjetimo se, najmanji zajedniki viekratnik dvaju prirodnih brojeva (n i m) je najmanji prirodan broj koji se moe podijeliti s n i s m. Sigurno je da je jedan od viekratnika brojeva n i m njihov umnoak (n * m), no moda postoji i manji viekratnik od njega. Stoga emo pomou for petlje ii od broja n * m do nekog od brojeva n ili m (ili do 1), te emo vrijednost kontrolne varijable (i), kada bude djeljiva s n i s m zapisati u varijablu v. Kako u for petlji idemo od veeg broja prema manjem, na kraju e u varijabli v pisati najmanji broj koji se moe podijeliti s n i s m.
public static int pr43 (int n, int m) { int v = n * m; for (int i = n * m; i >= n; i--) if (i % n == 0 && i % m == 0) v = i; return v; }

Do sada smo u svim primjerima imali po jednu for petlju. esto emo nailaziti na probleme gdje e unutar jedne petlje biti imati jo jednu petlju, pa emo za takve petlje rei da su ugnijeene. Ilustrirajmo to na sljedeem primjeru: Primjer 4 4: Za prirodan broj n emo rei da je prost ako je djeljiv samo s 1 i sa samim sobom. Prvih nekoliko prostih brojeva su: 2, 3, 5, 7, 11, 13,... (broj 1 nije prost broj). Poznato je da prostih brojeva ima beskonano mnogo, no ne postoji nikakva egzaktna formula koja e nam rei koji je npr. n-ti prosti broj ili koliko ima prostih brojeva koji su manji od prirodnog broja n. Napii metodu iji e ulazni parametar biti prirodan broj m, a vraati e broj prostih brojeva koji su manji ili jednaki od m. Rjeenje: Jedan od naina na koji moemo provjeriti je li neki broj prost je da mu prebrojimo sve djelitelje. Ukoliko broj ima samo 2 djelitelja, bit e prost. Ovom emo metodom za velike brojeve imati jako puno dijeljenja, to moe znatno usporiti izvravanje programa. Jedan od teorema iz matematike kae da e broj biti prost ako nema niti jednog djelitelja izmeu dva i korijena iz broja za koji provjeravamo je li prost. Npr. elimo li provjeriti je li broj 113 prost, nije nuno dijeliti ga sa svim brojevima izmeu 1 i 113, ve e biti dovoljno provjeriti postoji li djelitelj broja 113 izmeu 2 i 113 11 . U ovom primjeru emo oito morati proi po svim brojevima koji izmeu 2 i m, te emo za svaki broj provjeravati je li prost i, u sluaju da je prost poveavati vrijednost neke varijable za 1. Dakle, oito emo imati ugnijeene petlje. Kontrolna varijabla (i) prve for petlje ii e po brojevima od 2 do m. Druga for petlja e za svaki takav broj (i) provjeriti je li prost i to e raditi tako da prebroji koliko broj i ima djelitelja izmeu 2 i i .
public static int pr44 (int n) { int p = 0; for (int i = 2; i <= n; i++) { int d = 0;

52

Java i objektno orijentirano programiranje


for (int j = 2; j <= Math.sqrt (i); j++) if (i % j == 0) d++; if (d == 0) p++; } return p; }

Rjeenje prolog primjera je ispravno. Meutim kod takvog rjeenja je dosta velika mogunost pogreke: zamijenimo kontrolne varijable (i, j), zaboravimo inicijalizirati broja na 0 (d),... Stoga emo u nastavku dati jo jedno rjeenje problema iz primjera 4 4. Ovo drugo rjeenje temelji se na pisanju jo jedne pomone metode. Pomona metoda, nazovimo ju prost, imat e jedan parametar, prirodan broj n te e vraati true ako je broj n prost, inae e vraati false. Metodu prost emo pozivati u svojoj metodi te emo na taj nain izbjei ulanane petlje. Openito emo u metodi pozvati drugu metodu tako da joj napiemo ime i proslijedimo odgovarajue parametre.
public static boolean prost (int n) { int d = 0; for (int i = 2; i <= Math.sqrt (n); i++) if (n % i == 0) d++; if (d == 0) return true; else return false; } public static int pr44a (int n) { int p = 0; for (int i = 2; i <= n; i++) { if (prost (i)) p++; } return p; }

Primijetimo da smo u obje metode koristili i kao varijablu. Moda nije sasvim jasno kako se ne "pomijeaju" varijable i iz tih dviju metoda. Radi se o tome da je varijabla i lokalna varijabla i u jednoj i u drugoj metodi. Lokalnu varijablu jedne metode vidi samo ta metoda. Dakle, metoda pr44a uope ne vidi varijablu i metode prost. Isto tako bi zbuniti mogao i parametar metode prost. Pri definiciji metode prost parametar je n, a u metodi pr44a metodu prost pozivamo s parametrom i. Pojednostavljeno objanjenje ovoga je injenica da je n tzv. formalni parametar metode prost. Prilikom poziva metode prost u varijabli i pie konkretan broj i taj broj se pri pozivu metode prost prepisuje u formalni parametar n, s kojim onda radi metoda prost.

53

while petlja
while petlju emo, slino kao i for petlju, koristiti u sluajevima kada dio programa trebamo izvriti vie puta. Za razliku od for petlje, koju koristimo uglavnom kada znamo koliko puta trebamo ponoviti neki niz naredbi, while petlju emo koristiti kada ne znamo unaprijed koliko puta trebamo izvriti neki niz naredbi. Opi oblik while petlje je: while (uvjet) naredba;

uvjet istinit naredba

laan

... Slika 4 2: Shematski prikaz while petlje Dok je uvjet istinit izvravat e se naredba. Ukoliko je naredba sloena naredba potrebno ju je staviti unutar {}. Slino kao i kod for petlje, unutar naredbe koja se nalazi u tijelu petlje trebamo osigurati da nakon konanog broja koraka uvjet postane laan. U suprotnom emo ui u beskonanu petlju. Primjer 4 5: to e pisati u varijabli s nakon izvravanja sljedeeg dijela programa? ...
int s = 0, i = 1, n = 4; while (s <= n) { s += i; i++; }

... Rjeenje: Na poetku programa oito varijabli s pridruujemo vrijednost 0, varijabli i pridruujemo 1, dok varijabli n pridruujemo vrijednost 4. - budui da je s (0) <= od n (4) s se poveava za 1 te sada iznosi 1, te se i poveava za 1 i sada iznosi 2; - s obzirom da je s (1) <= n (4) s se poveava za i (2) te sada poprima vrijednost 3, dok i postaje 3; - s (3) <= n (4) dakle, s se poveava za i (3) i postaje 6, a i postaje 4;

54

Java i objektno orijentirano programiranje - s (6) vie nije manje ili jednako od n (4), to znai da izlazimo iz while petlje Dakle, nakon petlje e u varijabli s pisati vrijednost 6. Primjer 4 6: Napiimo metodu iji e ulazni parametar biti dva prirodna broja n i m. Metoda treba raunati mjeru brojeva n i m (mjera brojeva n i m je najvei prirodan broj koji dijeli broj n i broj m). Rjeenje: Primjer emo rijeiti modificiranom metodom Euklidovog algoritma za mjeru dvaju brojeva. Ovakav modificirani Euklidov algoritam glasi ovako: - ako su n i m jednaki, onda je njihova mjera jednaka bilo kojem od njih (jednaki su); - ukoliko brojevi n i m nisu jednaki, njihova mjera ista je kao mjera brojeva: - manji od brojeva n i m; - razlike veeg i manjeg od brojeva n i m; Npr. ako je n = 27 a m = 18, Euklidov algoritam bi mogao ii ovako: - kako 27 i 18 nisu jednaki slijedi da je njihova mjera jednaka mjeri brojeva 18 (manji od brojeva 27 i 18) i 9 (razlika brojeva 27 i 18); - budui da 18 i 9 nisu jednaki, prema Euklidovom algoritmu je njihova mjera jednaka mjeri brojeva 9 (manji od brojeva 18 i 9) i 9 (razlika brojeva 18 i 9); - kako su brojevi 9 i 9 jednaki, dakle njihova mjera je 9, pa je onda i mjera brojeva 27 i 18 isto tako 9. Na osnovu izreenog lako moemo zakljuiti da dok brojevi ne postanu jednaki usporeujemo ih te na mjesto veeg zapisujemo razliku veeg i manjeg broja, dok manji broj ostaje nepromijenjen:
public static int pr46 (int n, int m) { while (n != m) if (n > m) n = n - m; else m = m - n; return n; }

Slino kao to moemo imati ulanane for petlje, moemo imati i ugnijeene while petlje, pa ak i vie, moemo ulanavati for petlju s while petljom i obrnuto. Primjer 4 7: Za prirodan broj n emo rei da je simetrian ako se jednako ita s obje strane (npr. 121, 56765,...). Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati n-ti po redu simetrini broj. Rjeenje: Prvih nekoliko simetrinih brojeva su: 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22,... Da bismo za neki broj provjerili je li simetrian trebamo ga okrenuti i provjeriti je li tako okrenut isti kao polazni broj. Broj k emo okrenuti tako da mu "skidamo" jednu po jednu znamenku i dodajemo na kraj drugog broja (m). Pod "skidanjem" znamenke podrazumijevamo da posljednju znamenku spremimo u privremenu varijablu z (z = k % 10), te broju k "prekriimo" posljednju znamenku (k = k / 10). Znamenku z emo dodati na kraj broja m tako da broj m pomnoimo s 10 i dodamo z (m = m * 10 + z). Znamenke broju k emo "skidati" sve dok k ne postane 0 (primijetimo da smo na taj nain zauvijek izgubili poetnu vrijednost broja k, stoga ju na samom poetku trebamo pospremiti u neku pomonu varijablu t).

55

Budui da u zadatku trebamo pronai n-ti po redu simetrini broj, varijabli k emo pridruivati vrijednosti 1, 2, 3,... i svaki puta kada se u varijabli k bude nalazio broj koji je simetrian vrijednost brojaa (b) emo poveati za 1. Stat emo kada vrijednost brojaa b bude bila jednaka n, te emo vratiti broj koji u tom trenutku pie u k.
public static int pr47 (int n) { int k = 0, b = 0, z, t, m; while (b < n) { k++; t = k; m = 0; //okreemo broj t while (t > 0) { z = t % 10; t /= 10; m = m * 10 + z; } if (m == k) b++; } return k; }

56

Java i objektno orijentirano programiranje

do/while petlja
do/while petlja gotovo je identina while petlji o kojoj smo govorili u prethodnom poglavlju. Jedina razlika je to se kod while petlje uvjet provjerava na poetku pa se naredba unutar while petlje ne mora izvriti niti jednom (ako je uvjet odmah laan), dok se kod do/while petlje uvjet provjerava na kraju pa se petlja, tj. naredba unutar petlje uvijek izvri najmanje jednom. Opi oblik do/while petlje je:

do naredba; while (uvjet); ...

naredba

uvjet istinit laan ... Slika 4 3: Shematski prikaz do/while petlje Primjer 4 8: to e pisati u varijabli t nakon izvravanja sljedeeg dijela programa:
... int t = 0, i = 5; do { t++; i += 5; } while (i < 12); ...

Rjeenje: Na poetku varijabli t pridruujemo vrijednost 0, dok varijabli i pridruujemo vrijednost 5. - ulaskom u do/while petlju vrijednost varijable t poveavamo za 1 (t++) i sada ona ima vrijednost 1, dok vrijednost varijable i poveavamo za 5 i sada ona iznosi 10. Budui da je i (10) < 12 vraamo se na poetak do/while petlje; - vrijednost varijable t poveavamo za 1 (t++) te ona sada iznosi 2, dok vrijednost varijable i poveavamo za 5 i ona sada iznosi 15. Budui da je i (15) vee od 12 izlazimo iz do/while petlje, dakle u varijabli t e pisati vrijednost 2. Primijetimo da bi u sluaju while petlje:

57

... int t = 0, i = 5; while (i < 12) { t++; i += 5; } ...

vrijednost varijable t nakon izvravanja petlje bila 1. Na samom kraju dajmo jo jedan primjer u kojem emo imati ugnijeene do/while i for petlju. Primjer 4 9: tedia je tijekom posljednjih nekoliko godina u banku stavljao odreene iznose. Prve godine je stavio iznos x. Svake sljedee godine je stavio y kuna vie nego prethodne godine. Na ulagane iznose nije dobivao nikakve kamate, a nakon n godina je raspolagao sa ukupno k kuna. Danas, dok o tome ponosno govori svojim prijateljima zanima ga koji je iznos u banku stavio prve godine i tu za njega zapoinju problemi. Napiimo metodu iji e ulazni parametri biti: - prirodan broj y razlika uloga izmeu svake dvije godine; - prirodan broj n broj godina koje je tedia stavljao novac u banku; - prirodan broj k iznos u kunama s kojim tedia raspolae. Metoda treba vraati prirodan broj, a koji e predstavljati iznos x koji je tedia uplatio prve godine. Rjeenje: Prije nego zaponemo rjeavati ovaj problem, simulirajmo ovaj problem na jednom konkretnom primjeru. Pretpostavimo da je tedia prve godine u banku uloio 100 kuna (x), svake sljedee je ulagao 100 kuna vie (y), dakle, nakon 5 (n) godina u banci je imao 100 + 200 + 300 + 400 + 500 = 1500 (k) kuna. Uz elementarno znanje matematike mogli bismo doi do formule prema kojoj bismo iz poznatih podataka (y, n i k) lako izraunali nepoznati podatak (x). Iako bi to rjeenje bilo neto elegantnije, mi zadatak neemo rijeiti na taj nain, ve emo ga rijeiti "pogaanjem" broja x. Budui da je traeni broj (x) prirodan broj, krenut emo od x = 1 i simulirati ulaganja. Ukoliko za dane y i n simulacijom dobijemo n, to e znaiti da je 1 traeni broj. Inae emo poveavati broj x za 1 sve dok simulacijom iz brojeva x, y i n ne dobijemo broj k.
public static int pr49 (int y, int n, int k) { int x = 0, s, p; do { x++; s = 0; p = x; //simuliramo rjeenje problema, tj. //raunamo koliko bi tedia imao nakon n godina //ako je prve godine u banku stavio x kuna a svake //sljedee godine je iznos poveavao za y for (int i = 1; i <= n; i++) { s += p;

58

Java i objektno orijentirano programiranje


p += y; } } while (s != k); return x; }

59

Zadaci za vjebu
1. 2. 3. 4. to je petlja? U kojim emo sluajevima koristiti for petlju? Objasni izvravanje for petlje. to e pisati u varijabli n nakon izvravanja sljedeeg dijela programa:
... int n = 1; for (int i = 1; i <= 5; i++) n *= i; ...

5. Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati true ako je n: a. prost za broj emo rei daje prost ako je djeljiv samo s 1 i sa samim sobom (npr. 2, 3, 5, 7,...); ulaz izlaz true 13 b. savren za broj emo rei da je savren ako je jednak zbroju svojih djelitelja, ne raunajui njega samog (npr. 6, 28,...). ulaz izlaz false 7 inae metoda treba vraati false. 6. Napii metodu iji e ulazni parametri biti dva prirodna broja n i m. Metoda treba vraati mjeru brojeva n i m. Mjera brojeva n i m je najvei zajedniki djelitelj brojeva n i m. ulaz izlaz 9 27 18 7. Napii metodu iji e ulazni parametri biti prva dva lana (a i b) te broj elemenata (n) a. aritmetikog niza b. geometrijskog niza metoda treba vraati zbroj prvih n elemenata danog niza. a. ulaz izlaz 25 1 3 5 b. ulaz izlaz 121 1 3 5
60

Java i objektno orijentirano programiranje

8.

Dan je pravokutnik povrine p. Napiite metodu koja e vraati opseg pravokutnika ija je povrina p, a opseg najmanji mogu. ulaz izlaz 22 30

9.

Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati n-ti po redu element Fibonaccijevog niza. Fibonaccijev niz je niz iji su prva dva elementa jednaka 1, a svaki sljedei element jednak je zbroju prethodna dva elementa Fibonacijevog niza. Prvih nekoliko elemenata Fibonacijevog niza su: 1, 1, 2, 3, 5, 8, 13, 21,... ulaz izlaz 233 13

10.

Pretpostavlja se da se svaki paran prirodan broj n moe prikazati kao zbroj dvaju prostih brojeva (broj je prost ako je djeljiv samo s 1 i sa samim sobom). Napii metodu iji e ulazni parametar biti paran prirodan broj n. Metoda treba vraati broj naina na koje se n moe prikazati kao zbroj dvaju prostih brojeva. ulaz izlaz 2 10

11.

Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba vraati broj naina na koje se prirodan broj n moe zapisati kao zbroj kvadrata 5 razliitih prirodnih brojeva (x1 , x2 , x3 , x 4 , x5 ) za koje vrijedi x1 x 2 x3 x4 x5 . ulaz izlaz objanjenje 3 2 ( 1)2 + ( 1)2 + 0 2 + 0 2 + 0 2 = 2

( 1)2 + 0 2 + 0 2 + 0 2 + 12 = 2
0 2 + 0 2 + 0 2 + 12 + 12 = 2

12. U kojim emo sluajevima koristiti while petlju? 13. Koja je razlika izmeu for i while petlje? 14. to e pisati u varijabli p nakon izvravanja sljedeeg dijela programa:
... int n = 5, p = n; while (n > 1) p *= n; ...

15. Napii metodu iji e ulazni parametri biti prirodni brojevi n i m. Metoda treba vraati mjeru brojeva n i m (najvei zajedniki djelitelj). Mjeru treba raunati Euklidovim algoritmom. Eulidov algoritam za traenje mjere dvaju prirodnih brojeba kae sljedee: ako su brojevi jednaki, ondaje mjera upravo taj broj, ukoliko brojevi nisu jednaki, mjera brojeva bit e jednaka mjeri sljedeih brojeva: raulici veeg i manjeg od brojeva i manjeg broja. Primjerice ako su zadani brojevi 24 i 18, budui da brojevi nisu jednaki, njihova je mjera jednaka mjeri brojeva 6 (24 - 18) i 18. Budui da brojevi i dalje nisu jednaki, mjera je jednaka mjeri brojeva 6 i 12 (18 - 6),...

61

ulaz izlaz 18 24 6 16. Napii metodu iji e ulazni parametar biti prirodan broj n. Metoda treba: a. zbrojiti sve znamenke broja n; ulaz izlaz 581 14 b. ispisati najveu znamenku broja n. ulaz izlaz 581 8 17. Napiite metodu iji e ulazni parametar biti prirodan broj n: a. broj zapisan u binarnom brojevnom sustavu. Metoda treba vraati broj n zapisan u dekadskom brojevnom sustavu; ulaz izlaz 1011 11 b. broj zapisan u dekadskom brojevnom sustavu. Metoda treba vraati zapis broja n u binarnom brojevnom sustavu ulaz izlaz 1100 12

62

Java i objektno orijentirano programiranje

5
Sloeni tipovi podataka
Niz String

63

Niz
esto emo prilikom programiranja trebati u varijable spremati i nekoliko desetaka pa ak i stotina podataka. Deklarirati 100 varijabli i onda jo njima uspjeno manipulirati bilo bi poprilino komplicirano. U takvim sluajevima u pomo nam stiu indeksirane varijable tzv. nizovi. Prisjetimo se matematike i npr. sustava linearnih jednadbi. Ako imamo sustav od npr. 3 linearne jednadbe s 3 nepoznanice, tada emo najee nepoznanice oznaavati s x, y i z. Meutim imamo li sustav od 5 jednadbi s 5 nepoznanica, nepoznanice emo najee oznaavati s x1, x2, x3, x4, i x5. Slino je i s nizovima kod programiranja. Jedina razlika je to elemente nizova neemo oznaavati s: x1, x2, ..., xn nego s: x[1], x[2],...x[n]. x[1] x[2] ... x[n]

Slika 5 1: Niz //ovdje moe npr. slika vlaka s vagonima na kojima pie x[1], x[2],..., x[n] Neke od prednosti koritenja su: unos/ispis elemenata mogu je pomou jedne petlje; ne deklariramo svaki element niza posebno, ve ih deklariramo sve istovremeno; lake manipuliranje podacima (sortiranje, pretraivanje,...); ... U Javi je mogue kreirati niz bilo kojeg tipa podataka (int, char, String,...), poslije emo vidjeti da je mogue kreirati ak i niz objekata. Elementi niza u Javi poinju se indeksirati od 0. To znai da prvi element niza ima indeks 0, drugi 1,... Npr. ako je x niz od n elemenata, tada e elementi toga niza biti: x[0], x[1], x[2],..., x[n-1]. Niz emo u Javi deklarirati na jedan od sljedeih naina: tip[] ime_niza; ili tip ime_niza[]; Primjer 5 1: Deklarirajmo niz a iji e elementi biti cijeli brojevi: Rjeenje: Kao to smo rekli niz moemo deklarirati na dva naina: int[] a; odnosno: int a[]; Mi emo od sada pa na dalje niz uvijek deklarirati na prvi nain: tip[] ime_niza;

64

Java i objektno orijentirano programiranje Prilikom deklaracije niza, kao i kod deklaracije ostalih jednostavnih tipova podataka, elementima niza moemo pridruiti inicijalne vrijednosti: tip[] ime_niza = {vr_1, vr_2, ..., vr_n};

Primjer 5 2: Deklarirajmo niz c iji e elementi biti znakovnog tipa, a inicijalno e vrijednosti elemenata niza biti samoglasnici: Rjeenje: char[] c = {'a', 'e', 'i', 'o', 'u'}; Nakon ovakve deklaracije niza vrijednosti elemenata niza bit e redom: c [0] = 'a'; c [1] = 'e'; c [2] = 'i'; c [3] = 'o'; c [4] = 'u'; Ukoliko deklariramo neki niz i nakon deklaracije prvom elementu niza pokuamo pridruiti neku vrijednost: int[] a; a [0] = 2; te pokuamo kompajlirati taj dio koda, doi e do greke. Kompajler e javiti sljedeu greku: variable a might not have been initialized a[0] = 2; U emu je problem? Izgleda sve korektno napisano. Da uistinu smo sve korektno napisali. Meutim, ako nismo elementima niza inicijalno pridruili vrijednosti, tada prije pridruivanja vrijednosti nekom elementu niza trebamo jo "rezervirati prostor" za taj niz, tj. trebamo alocirati memoriju. Memoriju za elemente nekog niza alocirat emo na sljedei nain: ime_niza = new tip[broj_elemenata]; pri emu je tip onaj isti tip podataka koji smo naveli kod deklaracije niza, dok je broj_elemenata maksimalni broj elemenata koje e niz sadravati. esto se deklaracija niza spaja s alociranjem prostora za niz, pa u tom sluaju deklaracija niza ima oblik: tip[] ime_niza = new tip[broj_elemenata];

65

Primjer 5 3: Deklarirajmo znakovni niz od 20 elemenata te elementima niza pridruimo sva velika slova engleske abecede. Rjeenje:
... char[] c; c = new char [26]; for (int i = 65; i <= 90; i++) c[i - 65] = (char) i; ...

Pokuamo li u prethodnom primjeru npr. 30-tom elementu niza pridruiti neku vrijednost, prilikom izvravanja programa doi e do sljedee greke: ArrayIndexOutOfBoundsException null Ulazni parametar metode isto tako moe biti i niz. U tom sluaju elemente niza piemo unutar vitiastih zagrada - {}, meusobno odvojene znakom zareza - , (isto kao kad inicijaliziramo elemente niza prilikom deklaracije niza). Broj elemenata nekog niza (za koje je alociran prostor) vratit e nam naredba: ime_niza.length; Primjer 5 4: Napiimo metodu iji e ulazni parametri biti niz a te prirodni broj n, n manji od broja elemenata niza. Metoda treba sortirati niz a te vratiti element niza a iji je indeks n. Rjeenje: Niz emo sortirati najjednostavnijom metodom razmjene koju ovdje neemo specijalno objanjavati. Princip sortiranja niza metodom razmjene je sljedei: - openito i-ti element niza (i ide od prvog do pretposljednjeg elementa niza) usporeujemo sa svim elementima iza njega. Ukoliko naiemo na element, s indeksom j, koji je manji od i-tog elementa i-tom i j-tom elementu niza zamjenjujemo vrijednosti.
public static int pr54 (int[] a, int n) { int tmp; for (int i = 0; i < a.length - 1; i++) for (int j = i + 1; j < a.length; j++) if (a [i] > a [j]) { tmp = a [i]; a [i] = a [j]; a [j] = tmp; } return a[n]; }

66

Java i objektno orijentirano programiranje

Viedimenzionalni nizovi Nizovi s kojima smo se upoznali u prethodnom poglavlju imaju jedan indeks te ih stoga zovemo jednodimenzionalni nizovi. Osim takvih jednodimenzionalnih nizova u praksi se vrlo esto koriste i viedimenzionalni, najee dvodimenzionalni nizovi. Dvodimenzionalni nizovi e imati dva indeksa i zvat emo ih matrice. Princip koritenja matrica analogan je principu koritenja jednodimenzionalnih nizova. Elementi matrice e imati dva indeksa, te e opi oblik elementa matrice biti: ime_niza [i][j]; Deklaracija matrice biti e sljedeeg oblika: tip[][] ime_niza; odnosno, deklaracija s inicijalizacijom:
tip[][] ime_niza = {{vr_11, vr_12,..., vr1m},...,{vr_n1,...,vr_nm}}

odnosno, deklaracija s alokacijom memorije: tip[][] ime_niza = new tip[broj_el1][broj_el2] Na matricu moemo gledati kao na tablicu od broj_el1 redaka i broj_el2 stupaca. ime_niza[0][0] ime_niza[0][1] ... ime_niza[0][broj_el2] ime_niza[1][0] ime_niza[1][1] ... ime_niza[1][broj_el2] ... ... ... ... ime_niza[broj_el1][0] ime_niza[broj_el1][1] ... ime_niza[broj_el1][broj_el2] Slika 5 2: Matrica Dimenzija matrice je broj redaka i stupaca te matrice. Openito emo dimenziju matrice koja ima n redaka i m stupaca oznaavati s n m . Primjer 5 5: Napii metodu iji e ulazni parametar biti dimenzija matrice (n i m) te prirodan broj k <= n*m. Metoda treba popuniti matricu prirodnim brojevima do n * m i to tako da redom popunjava elemente matrice poevi od gornjeg lijevog kuta do donjeg desnog kuta matrice. Npr. ako je unesena dimenzija matrice 4 3 , tada metoda treba kreirati sljedeu matricu: 1 4 7 10 2 5 8 11 3 6 9 12

Nadalje metoda treba vratiti zbroj svih susjeda broja k u matrici. Npr. susjedi broja 8 su: 4, 5, 6, 7, 9, 10, 11 i 12, pa je onda njihov zbroj jednak 64. Rjeenje:

67

//metoda kreira traenu matricu dimenzije nxm public static int[][] matrica (int n, int m) { int k = 1; int[][] a = new int[n][m]; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { a[i][j] = k; k++; } return a; } public static int pr55(int n, int m, int t) { int[][] a = matrica (n, m); int x = 0, y = 0, s = 0; //traimo poziciju broja t for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (a[i][j] == t) { x = i; y = j; } if (x > 0) { if (y > 0) s += a [x - 1][y - 1] + a [x][y - 1]; s += a [x - 1][y]; if (y < m - 1) s += a [x - 1][y + 1] + a [x][y + 1]; } if (x < n - 1) { if (y > 0) s += a [x + 1][y - 1]; s += a [x + 1][y]; if (y < m - 1) s += a [x + 1][y + 1]; } return s; }

Primjer 5 6: Svima nam je dobro poznata igra krii-krui. Napii metodu iji e ulazni parametar biti matrica koja predstavlja jednu odigranu igru krii-krui i ispisivati pobjednika (krii ili krui) odnosno da nema pobjednika ako u odigranoj igri nema pobjednika. Npr. kombinaciju: x o x o x x x o o emo unijeti kao: {{'x', 'o', 'x'},{'o', 'x', 'x'},{'x', 'o', 'o'}} i pobjednik je oito x. Rjeenje:
//metoda koja na osnovu uitane matrice vraa true ako je c pobjednik

68

Java i objektno orijentirano programiranje


public static boolean pobjednik (char[][] a, char c) { //provjeravamo postoji li redak sastavljen samo od znakova c for (int i = 0; i < 3; i++) if (a[i][0] == c && a[i][1] == c && a[i][2] == c) return true; //provjeravamo postoji li stupac sastavljen samo od znakova c for (int i = 0; i < 3; i++) if (a[0][i] == c && a[1][i] == c && a[2][i] == c) return true; //postoji li dijagonala sastavljena samo od znakova c //glavna dijagonala if (a[0][0] == c && a[1][1] == c && a[2][2] == c) return true; //sporedna dijagonala if (a[0][2] == c && a[1][1] == c && a[2][0] == c) return true; return p; } public static String pr56 (char[][] a) { if (pobjednik (a, 'x') && pobjednik (a, 'o')) return "Nerijeeno"; else if (pobjednik (a, 'x')) return "Pobjednik je x"; else if (pobjednik (a, 'o')) return "Pobjednik o"; else return "Nema pobjednika"; }

69

String
O tipu podataka String smo ve neto govorili u prethodnim poglavljima. Ovdje emo nastojati kroz nekoliko jednostavnih primjera u potpunosti usvojiti tip podataka String, ukazati na mjesta na kojima emo ga koristiti, prednosti koritenja ovog tipa podataka, a s druge strane emo dati uvod u sljedee poglavlje u kojem e biti rijei o klasama. Za razliku od jednostavnog tipa podataka char, koji moe sadravati samo jedan znak, koji se u tom sluaju navodi unutar jednostrukih navodnika ('), tip podataka String moe sadravati vie znakova, tj. u tip podataka String emo pohranjivati rijei pa ak i itave reenice, a takve rijei odnosno reenice emo u tom sluaju navoditi unutar dvostrukih navodnika ("). Za razliku od svih tipova podataka koje smo do sada nauili, nad kojima smo mogli izvravati neke jednostavnije operacije (najee matematike), tip podataka String je jedan znatno sloeniji tip podataka sa mnotvom radnji koje moemo nad njim izvravati. Takve sloene tipove podataka nad kojima su definirane mnoge radnje openito emo zvati klase. Dakle tip podataka String je u stvari jedna klasa u Javi. O klasama jo nismo do sada govorili, o njima emo vie govoriti u sljedeem poglavlju. Dok jo ne znamo puno o klasama, klase moemo zamiljati kao sloene tipove podataka. Nad takvim sloenim tipovima podataka moi emo izvravati odreene radnje, tzv. metode. Neke od "radnji" koje bi mogli izvravati nad rijeima (stringovima) bile bi: - prebrojati broj znakova u rijei; - provjeriti koji se znak nalazi na nekom mjestu u rijei; - ... Pa upravo su za takve nad stringovima definirane metode. No vratimo se na poetak. Varijablu u koju emo moi spremati rijei, odnosno varijablu tipa String deklarirat emo na sljedei nain: String ime_varijable; odnosno, deklaracija s inicijalizacijom: String ime_varijable = "vrijednost"; Najee radnje (metode) koje emo izvravati nad tipom podataka String su:
int length () vraa broj znakova u stringu boolean equals (String s) usporeuje dva

stringa i vraa true ako su jednaka, inae vraa

false
int indexOf (String s)

vraa poziciju prvog pojavljivanja stringa s u stringu u kojem se vraa poziciju zadnjeg pojavljivanja stringa s u stringu u svako pojavljivanje stringa s1 u stringu u

nalazimo
int lastIndexOf (String s)

kojem se nalazimo
void replaceAll (String s1, String s2)

kojem se nalazimo zamjenjuje sa stringom s2 vraa dio stringa od znaka s rednim brojem pos do znaka s rednim brojem kraj stringa u kojem se nalazimo String toUpperCase () sva mala slova stringa zamjenjuje s odgovarajuim velikim slovima, ostala slova ostavlja nepromijenjenim String toLowerCase () sva velika slova stringa zamjenjuje s odgovarajuim malim slovima, ostala slova ostavlja nepromijenjenim
String substring (int poc, int kraj)

70

Java i objektno orijentirano programiranje Ilustrirajmo sve reeno na nekoliko jednostavnih primjera: Primjer 5 7: Napiimo metodu iji e ulazni parametar biti ime i prezime neke osobe (ime i prezime su jedan string i meusobno su odvojeni tono jednim razmakom), a vraati e inicijale te osobe (prvo slovo imena i prvo slovo prezimena). Rjeenje:
public static String pr57 (String ime) { /*uzima prvo slovo imena, dodaje mu toku i razmak te sve to sprema u string s */ String s = ime.substring (0, 1) + ". "; //trai razmak u stringu int n = ime.indexOf (" "); /*na kraju stringa s dodaje prvi znak nakon razmaka te na kraju jo jednu toku */ s = s + ime.substring (n + 1, n + 2) + "."; return s; }

Napomena: Kod pokretanja metoda iji su ulazni parametri stringovi, stringove trebamo navesti unutar dvostrukih navodnika. Primjer 5 8: Napiimo metodu iji e ulazni parametar biti jedna rije. Metoda treba rastaviti rije na slogove (u ovom sluaju emo rije rastavljati na slogove tako da iza svakog samoglasnika stavimo znak -, osim u sluaju kada je zadnji znak samoglasnik, u tom sluaju iza njega neemo stavljati znak -). Rjeenje:
public static String pr58 (String rijec) { String s = ""; for (int i = 0; i < rijec.length() - 1; i++) { String z = rijec.substring (i, i + 1); s = s + z; z = z.toUpperCase (); if (z.equals ("A") || z.equals ("E") || z.equals ("I") (z.equals ("O")) || (z.equals ("U"))) s = s + "-"; } s = s + rijec.substring (rijec.length () - 1, rijec.length ()); return s; }

||

71

Zadaci za vjebu
1. Koja je uloga nizova u programiranju? 2. Deklariraj niz x iji e elemnti biti realni brojevi. 3. Napii metodu iji e ulazni parametar biti niz. Metoda treba vratiti najvei element unesenog niza. ulaz izlaz {12, 4, 5, 1, 9, 6} 1 4. Napii metodu iji e ulazni parametri biti niz a koeficijenti polinoma n-tog stupnja p ( x) = a 0 + a1 x + a 2 x 2 K + a n x n 1 , te prirodan broj x0 . Metoda treba vraati vrijednost polinoma u toki x0 , tj. p( x 0 ) = a0 + a1 x 0 + a 2 x0 K + a n x0
2 n 1

ulaz izlaz {-1, -2, 3, 2} 74 3

objanjenje Radi se o polinomu: p ( x) = 1 2 x + 3 x 2 + 2 x 3 i oito je p (3) = 1 2 3 + 3 3 2 + 2 33 = 74

5. Ivica se sa svojim drutvom eli igrati lovice, no prije samog poetka igre potrebno je odrediti tko e loviti. Ivica je kao najstariji zaduen odrediti tko e loviti. Iviin nain odreivanja onoga tko e loviti je sljedei: svi igrai, njih n, posloe se u krug, i to tako da svaki igra ima svoj broj i iza svakog broja dolazi njegov sljedebenik (iza n je 1). Potom netko kae jedan prirodan broj m i Ivica poinje izbacivati igrae iz kruga. Lovi onaj koji posljednji ostane u krugu. Postupak izbacivanja je sljedei: Ivica zapone odbrojavanje od igraa s brojem 1 i odbrojava m igraa. m-ti igra ispada iz igre, nakon toga nastavlja brojati od (m+1)-vog igraa.... Napiite metodu iji e ulazni parametri biti prirodni brojevi n i m, a metoda e vratiti redni broj igraa koji e loviti. ulaz 10 7 izlaz 9 objanjenje Igrai ispadaju sljedeim redom: 7, 4, 2, 1, 3, 6, 10, 5, 8

6. Napiite metodu iji e ulazni parametar biti matrica. Metoda treba raunati zbroj svih pozitivnih elemenata unesene matrice. ulaz izlaz {{-4, 7},{2, -2}} 9 7. Napiite metodu iji e ulazni parametar biti kvadratna matrica (ima isti broj redaka i stupaca) metoda treba vraati: a. zbroj elemenata na glavnoj dijagonali glavnu dijagonalu ine elementi kojima je oznaka stupca jednaka oznaki retka; ulaz izlaz {{4, 7, 5},{3, 2, 3},{6, 5, 1}} 7 b. umnoak elemenata na sporednoj dijagonali elementi sporedne dijagonale kvadratne matrice koja ima n redaka i n stupaca su: a 0,n 1 , a1,n 2 , K , a n 1, 0 .

72

Java i objektno orijentirano programiranje ulaz izlaz {{4, 7, 5},{3, 2, 3},{6, 5, 1}} 60 8. Navedi neke od metoda definirane nad stringovima. 9. to e pisati u varijabli n nakon izvravanja sljedeeg dijela programa:
... String s = "Programski jezik Java" int n = s.indexOf (" "); ...

10. Napii metodu iji e ulazni parametar biti rije. Metoda treba vraati broj znakova u unesenoj rijei. ulaz izlaz Stringovi u Javi su lagani 26 11. Napii metodu iji je ulazni parametar biti jedna rije. Metoda treba vratiti novu rije koja se iz ulazne dobiva tako da se iza svakog slova ulazne rijei doda razmak. ulaz izlaz Java J a v a 12. Napii metodu iji e ulazni parametar biti jedna rije. Metoda treba vraati true ako je rije palindrom, inae treba vraati false. Za rije emo rei da je palindrom ako se jednako ita s lijeva na desno i s desna na lijevo (npr. kisik, oko,...). ulaz izlaz kapak true 13. Napii metodu iji e ulazni parametar biti reenica (niz rijei odvojenih jednim ili vie razmaka). Metoda treba vraati broj rijei u reenici. ulaz Ova izlaz pet rijeci 5

recenica

ima

14. Tekst je mogue kompresirati tako da uzastopno pojavljivnaje nekog znaka zamijenimo znakom i brojem koji predstavlja broj uzastopnih pojavljivanja toga znaka (uvijek e se raditi o jednoznamenkastom broju). Napii metodu koja e: a. unositi kompresirani i vraati odgovarajui nekompresirani tekst; ulaz izlaz A1C2d4 ACCdddd b. unositi nekompresirani i vraati odgovarajui kompresirani tekst. ulaz izlaz ACCdddd A1C2d4

73

15. Jedan od naina ifriranja teksta je da sve znakove cikliki pomaknemo za nekoliko znakova. Napiite metodu iji e ulazni parametar biti tekst (samo velika slova engleske abecede) i pomak, a vraat e tekst koji dobijemo ifriranjem ulaznog teksta uz zadnai pomak. Napomena: Niti jedan znak ifriranog teksta ne smije izai izvan velikih slova engleske abecede. Znakovi se cikliki ponavljaju, nakon Z dolazi ponovo A. ulaz izlaz ZASTO BCUVQ 2 16. Ponekad se umjesto nekih naih slova (LJ,NJ,,,,,,D) piu zamjenski znakovi, i to prema sljedeoj tablici: Znak LJ Zamjena LJ NJ NJ C C= S= Z= DD DZ=

Napiite metodu iji e ulazni marametar biti rije zapisana zamjenskim znakovima a vraati e broj stvarnih slova u toj rijei. ulaz izlaz LJULJAC=KA 7 17. Teinu znaka u rijei moemo definirati kao broj pojavljivanja toga znaka u toj rijei. Teinu rijei definirati emo kao zbroj teina svih znakova od kojih se rije sastoji. Napiite metodu iji e ulazni parametar biti jedna rije (sastoji se samo od velikih slova engleske abecede). Metoda treba vraati teinu ulazne rijei. ulaz izlaz MASA 6 18. Napiite metodu iji e ulazni parametar biti string koji se moe sastojati od slova, znamenaka i specijalnih znakova. Metoda treba vratiti najmanji cijeli broj koji se nalazi u tom stringu (treba uzimati u obzir i predznake). ulaz izlaz a-123b42cc3 -123 19. Napii metodu iji e ulazni parametri biti dva velika prirodna broja (mogu imati do 200 znamenaka) metoda treba vratiti zbroj unesenih brojeva. ulaz izlaz 1234567891234567891 1234567891234567893 2

74

Java i objektno orijentirano programiranje

6
Objektno orijentirano programiranje
Drugaiji pristup programiranju Klasa i objekt Kreiranje objekta iz klase Nasljeivanje klasa

75

Drugaiji pristup programiranju


O vanosti i brzini razvoja informatike tehnologije te potrebe za informatikom, besmisleno je uope raspravljati. Da bi informatiari, ponajvie programeri mogli drati korak sa zahtjevnim potrebama trita, bilo je potrebno zamijeniti neke starije tradicionalne pristupe programiranju. Osnovna ideja, ovakvog novog programerskog pristupa je: to je vie mogue koristiti ve napisani kd u svojim programima. Kao to je poznato veina dananjih aplikacija ima gumbe, izbornike,... svaki puta iz poetka pisati sav kod za rad s takvim elementima programskog suelja, uistinu moe biti naporno. Dakle, ideja je da ili koristimo kd za takve elemente koji je ve netko definirao ili smo ga mi sami definirali, a onda mi samo mijenjamo npr. tekst na gumbu, veliinu gumba, akciju koja e se dogoditi klikom na gumb,... Ovakav pristup nam omoguava da nakon to jednom napiemo npr. funkciju koja e provjeravati je li broj prost, vie nikada ne moramo tu funkciju pisati, ak ju neemo morati niti kopirati u svoje nove programe, ve emo ju "zapakirati" i samo pozivati u svojim programima. Ovakav pristup programiranju je osobito prigodan za ispravljanje greaka ili bilo kakve izmjene. Npr. ako smo primijetili da naa funkcija koja provjerava je li broj prost ne radi dobro, neemo morati mijenjati kod svih programa u kojima smo koristili tu funkciju, jer smo ju tamo samo pozivali. Dovoljno e biti samo promijeniti definiciju te funkcije na jednom mjestu i automatski e ona ispravno raditi i u svim ostalim programima. Slino je i s gumbima, ukoliko u jednom trenutku dou u modu okrugli gumbi a ne vie pravokutni kao to su danas, nee biti potrebno mijenjati sve programe koje u sebi imaju pravokutne gumbe ve emo jednostavno izmijeniti gotovi kod koji smo koristili za kreiranje gumba i automatski e svi gumbi u svim programima, u kojima smo pozivali taj kod biti okrugli. Ovakav pristup programiranju znatno je olakao rad velikim programerskim kuama. Naime, veina dananjih programa kreirana je od nezavisnih dijelova koda koji se pozivaju u "glavnom programu". Ukoliko se ustanovi greka u programu, ona se ispravlja u tono odreenoj komponenti koda. Ispravljena komponenta koda poalje se korisniku, koji staru komponentu zamijeni novom i program radi ispravno. Upravo gore opisani nain programiranja osnova je objektno-orijentiranog programiranja.

76

Java i objektno orijentirano programiranje

Klasa i objekt
Motiv za objektno-orijentirano programiranje naveli smo u prolom naslovu, sama ideja objektno-orijentiranog programiranja potekla je iz naeg, realnog svijeta. Okrenemo se oko sebe vidjet emo neke objekte, npr. automobile, avione, zgrade, kue, motocikle, televizore,... Prilikom programiranja nerijetko emo u svojim programima koristiti upravo njih ili neke druge imaginarne objekte, kao to su trokut, krug, jednadba, broj,... Kaemo li npr. automobil, avion ili trokut, mislimo na itavu klasu automobila, aviona ili trokuta, tj. mislimo na sve automobile, avione ili trokute. Meutim kaemo li npr. crveni A3, izbor e biti ve malo smanjen, znat emo da su to samo crveni automobili marke Audi tip A3. Znamo li npr. jo i registarsku oznaku znat emo tono koji je to automobil, a ako radimo u policiji, znat emo sve i o vlasniku automobila, jainu motora, godinu proizvodnje,... Nakon to znamo sve te detalje, vie ne govorimo o itavoj klasi automobila ve o konkretnom automobilu tj. o objektu automobil. Upravo tako je i u programiranju. Klasa e biti svojevrstan predloak za objekt, ona sadri openita svojstva. Nakon to neku klasu detaljno opiemo ona postaje objekt odnosno instanca. Instanca je samo drugi naziv za objekt. Dakle objekt odnosno instanca su konkretizacija klase. Takva konkretizacija klase, tj. definiranje osnovnih svojstava klase nazivamo kreiranje (instanciranje) objekta. Primjer 6 1: Neka osnovna svojstva automobila bila bi: marka, tip, snaga, maksimalna brzina, snaga, boja, broj asije, registracijska oznaka. Ukoliko ne znamo sva navedena svojstva ili bar veinu njih, govorimo o klasi automobil. Meutim ako kaemo to je Mazda, 121, snaga je 38 kw, maksimalna brzina je 180 km/h plave je boje, klasu smo uvelike smanjili. Znamo li jo i broj asije ili registracijsku oznaku znat emo tono o kojem se automobilu na ulici radi i tada govorimo o tom automobilu kao objektu. Osnovna svojstva trokuta bila bi duljine stranica i mjere kutova. Kaemo li trokut mislim na bilo koji trokut koji postoji i u tom sluaju je trokut klasa. Meutim, kaemo li trokut ije su duljine stranica 3, 4 i 5 cm, znamo tono o kojem se trokutu radi i znamo sve o njemu te govorimo o objektu trokut ije su stranice 3, 4 i 5 cm. Do sada smo rekli da klase openito imaju neka svojstva. Kod automobila su to bili marka, tip,... Osim svojstava, nad klasama je mogue izvravati odreene radnje. Neke radnje kod automobila bi bile: upali motor, ubaci u prvu brzinu dodaj gas, pritisni spojku,... Slino je i u programiranju, to znai da e klase moi imati neka svojstva i neke radnje koje e se nad klasama moi izvravati tzv. metode. Svojstva e u stvari biti neke globalne varijable, dok e metode biti funkcije (metode) definirane unutar neke klase. Openito emo svojstva i metode zvati elementima klase. Openito je cilj klase da njenim svojstvima i metodama moemo pristupati iz drugih klasa. Npr. definiramo li klasu koja e izmeu ostalih sadravati metodu koja e provjeravati je li neki broj prost, tada bismo htjeli toj metodi pristupati iz drugih klasa. Openito, da bismo svojstvu ili metodi neke klase mogli pristupati iz druge klase, one trebaju biti deklarirane public (javne). Osim public, klasa moe imati i elemente (svojstva ili metode) koje e biti samo pomone za definiciju public metoda i ne trebaju se moi pozivati u drugim klasama. Za takve emo metode rei da su private. Npr. u klasi u kojoj se nalazi metoda koja provjerava je li neki broj prost, moe postojati metoda koja e brojati koliko neki broj ima djelitelja, ta metoda moe biti pomona za metodu koja provjerava je li neki broj prost, no nju ne moramo moi pozivati iz drugih klasa, stoga ona moe biti private metoda.
77

Sljedei vaan pojam kada govorimo o klasama je konstruktor klase. Konstruktor klase je metoda unutar klase, koja ima isto ime kao klasa a ne vraa nikakav tip. Konstruktor se izvrava prilikom kreiranja objekta. On ne vraa nikakvu vrijednost, a namjena mu je inicijaliziranje svojstava objekta, tj. postavljanje svojstava na neku poetnu vrijednost. Jedna klasa moe imati jedan ili vie konstruktora. Ve smo rekli da konstruktor ima isto ima kao klasa. Sama po sebi se nameu pitanje, koja je namjena vie konstruktora? Kako je mogue da dvije ili vie metoda imaju isto ime? Kako e klasa znati koju metodu treba izvriti? U stvari se radi o tome da ako klasa ima dva ista konstruktora, onda oni moraju imati razliiti broj parametara. Ve smo rekli da je namjena konstruktora inicijalizacija svojstava objekta. Mi objekt moemo kreirati bez da znamo vrijednosti svih svojstava, u tom sluaju e se svojstva postaviti na neke inicijalne vrijednosti. U tom sluaju emo vrijednosti svojstava definirati kada ih saznamo. Npr. ako imamo klasu auto, nije nuno da prilikom kreiranja objekta tipa auto znamo sva njegova svojstva. U tom sluaju emo svojstva inicijalizirati na neke poetne vrijednosti, npr. za maksimalna brzina e biti 100 km/h ako drugaije nije reeno,... Ukoliko prilikom kreiranja objekta znamo vrijednosti svih svojstava klase, moemo kreirati objekt s tim svojstvima. Upravo je to namjena vie konstruktora. U prvom sluaju emo pozvati konstruktor bez parametara, koji e svojstva inicijalizirati na neku poetnu vrijednost, najee 0 ako se radi o numerikim vrijednostima odnosno prazan string ako se radi o tekstualnim vrijednostima, to definira sam programer klase. U drugom sluaju emo pozvati konstruktor sa parametrima, koji e vrijednosti svojstava postaviti na vrijednosti koje smo proslijedili preko parametara. Openito je sluaj da klasa moe imati dvije ili vie metode koje se jednako zovu. U tom sluaju one moraju imati razliiti broj parametara ili parametri moraju biti razliitog tipa, a za takve metode kaemo da su preoptereene (overloadane) metode. Nakon to smo se upoznali s pojmom klase i svim vanijim pojmovima koji dolaze s klasom, vrijeme je da nauimo kako kreirati klasu. Klasu u Javi emo openito kreirati na sljedei nain: public class ime_klase { svojstva_i_metode; } Primjer 6 2: Definirajmo klasu Trokut, ija e svojstva biti duljine stranica trokuta (a, b i c) a metode e biti Opseg() i Povrsina() koje e vraati opseg i povrinu trokuta. Rjeenje: Ovdje emo oito imati tri svojstva (duljine stranica a, b i c), koja e biti public svojstva jer im trebamo moi pristupiti iz drugih klasa. Nadalje emo imati dvije isto tako public metode Opseg () i Povrsina () za raunanje opsega i povrine trokuta. Osim toga imat emo jednu private metodu Poluopseg () koja e vraati poluopseg trokuta, a koja nam je potrebna za raunanje povrine trokuta Heronovom formulom: P = s (s a ) (s b ) (s c ) , pri emu je s poluopseg: a+b+c ( ). Ovdje je logino imati najmanje dva konstruktora: 2 prvi konstruktor bez parametara, koji e vrijednosti parametara a, b i c postaviti na 0. Drugi konstruktor e imati tri parametra i inicijalizirati svojstva a, b i c na vrijednosti parametara. Ovdje

78

Java i objektno orijentirano programiranje ak ima smisla staviti i konstruktor koji e imati jedan parametar a odnosit e se na jednakostranine trokute i on e vrijednosti parametara a, b i c postaviti na vrijednost proslijeenog parametra. Konstruktor s dva parametra nema previe smisla, on bi se odnosio na jednakokrane trokute, no on nije spretan jer bi moglo doi do zbrke koji je parametar duljina osnovice jednakokranog trokuta a koji duljina kraka trokuta.
public class Trokut { public int a, b, c; public Trokut () { a = 0; b = 0; c = 0; } public Trokut(int x, int y, int z) { a = x; b = y; c = z; } public Trokut (int x) { a = x; b = x; c = x; } private double Poluopseg () { return (double)(a + b + c) / 2; } public double Povrsina () { double s = Poluopseg (); return Math.sqrt (s * (s - a) * (s - b) * (s - c)); } public int Opseg () { return a + b + c; } }

Primijetimo da smo kod metode Poluopseg () pisali return (double) (a + b + c) / 2. Da nismo pisali (double) poluopseg ne bi bio toan. Naime, kako su a, b i c cijeli brojevi rezultat bi bio cijeli broj pa bi npr. poluopseg trokuta s duljinama stranica 3, 3 i 3 bio 4 a ne 4.5. Stoga smo najprije zbroj pretvorili u double pa smo tek onda dijeliti i u tom sluaju e poluopseg biti double. Napomena: Da smo zaglavlje drugog konstruktora:
public Trokut(int x, int y, int z)

pisali kao
public Trokut(int a, int b, int c)

79

dolo bi do problema jer se svojstva klase i parametri metode zovu jednako. U tim sluajevima bi definicija ove metode trebala imati oblik:
public Trokut(int a, int b, int c) { this.a = a; this.b = b; this.c = c; }

u ovom sluaju znai da je u nastavku navedeno svojstvo ili metoda klase. Dakle, interpretacija ovoga bi bila svojstvu a klase u kojoj se nalazim (Trokut) pridrui vrijednost parametra a i tu ne bi bilo nikakvih problema. this moemo pisati openito ispred elemenata klase, no ako nemamo ovakvog mijeanja parametara metoda s elemenata klase, to nije potrebno.
this

80

Java i objektno orijentirano programiranje

Kreiranje objekta iz klase


Kao to smo ve rekli, osnovna namjena klase je koristiti je u drugim klasama, odnosno svojim programima. Nakon to smo nauili kreirati vlastitu klasu, vrijeme je da pokaemo kako tu klasu pozivati u drugim klasama, te kako pozivati definirati njena svojstva i pozivati njene metode. Na klasu moemo gledati kao na jedan novi tip podataka, koji e imati neke vrijednosti i nad kojim emo moi izvravati neke operacije (pozivati metode). Kao i svaki drugi tip podataka, klasu trebamo deklarirati. Opi oblik deklaracije objekta iji e tip biti neka klasa je:
ime_klase ime_objekta;

Na ovaj nain smo u stvari samo najavili da emo koristiti objekt ime_objekta, koji e biti tipa ime_klase. Taj objekt jo zapravo ne postoji. S takvim objektom ne moemo jo nita raditi. Da bismo mogli neto raditi nad tim objektom (npr. izvravati metode koje smo definirali u pripadnoj klasi) moramo ga instancirati, tj. zaista ga stvoriti. Objekt emo instancirati na sljedei nain:
ime_objekta = new ime_klase ([parametri]);

Prisjetimo se, kada smo govorili o klasama, rekli smo da klasa moe imati jedan ili vie konstruktora i to smo nazivali preoptereenje konstruktora, preoptereeni konstruktori su se razlikovali po broju parametara, odnosnu tipu parametara. Prilikom instanciranja klase, mi u stvari izvravamo odreeni konstruktor i to onaj iji broj i tip parametara odgovaraju broju i tipu parametara koje smo naveli prilikom instanciranja klase. esto emo posljednje dvije naredbe ujediniti te emo istovremeno deklarirati i kreirati objekt. To emo napraviti sljedeom naredbom:
ime_klase ime_objekta = new ime_klase ([parametri]);

Primjer 6 3: Kolike e biti duljine stranica trokuta nakon sljedeih naredbi: a) Trokut t = new Trokut (); b) Trokut t = new Trokut (3, 4, 5); c) Trokut t = new Trokut (2); ako je Trokut klasa koju smo kreirali u primjeru 4 2. Rjeenje: Oito smo u svakom od primjera kreiranjem objekta t koji je tipa Trokut pozivali drugi konstruktor klase Trokut. Stoga e duljine stranica biti: a) a = 0, b = 0, c = 0; u ovom sluaju se izvrava prvi konstruktor (bez parametara), koji duljine stranica postavlja na 0.

81

b) a = 3, b = 4, c = 5; izvrava se drugi konstruktor (s tri parametra), prvi proslijeeni parametar bit e duljina stranice a, drugi duljina stranice b, dok e trei proslijeeni parametar biti duljina stranice c. c) a = 2, b = 2, c = 2; izvrava se trei konstruktor, koji e duljine svih stranica postaviti na jedinu proslijeenu vrijednost, koja je u ovom sluaju 2. Pristup elementima klase Upravo smo nauili kako kreirati objekt iz neke klase. to emo sada s tim objektom? Ve prije smo prije rekli da svaka klasa ima svoja svojstva i metode tj. neke radnje koje se nad njom mogu izvravati. Pa jedino to emo mi raditi s objektima je mijenjati im svojstva i izvravati radnje nad njima (pozivati metode). To znai da npr. kada smo jednom definirali klasu Trokut, ija su svojstva duljine stranica trokuta a metode raunaju opseg i povrinu, tada vie nikada neemo morati u svojim programima pisati formulu za raunanje povrine trokuta. Jednostavno emo kreirati objekt iz klase Trokut, postaviti mu duljine stranica i jednostavno pozivati metodu Povrsina (), koja nam vraa povrinu tog trokuta. Dakle, slobodno moemo zaboraviti na Heronovu formulu Ukoliko ikada itko zakljui da Heronova formula za raunanje povrine trokuta nije tona i pojavi se neka nova formula za raunanje povrine trokuta (to nije vjerojatno), jednostavno emo izmijeniti svoju metodu Povrsina () u klasi Trokut i svi programi e automatski raunati povrinu trokuta prema novoj formuli. Sada kada smo uvidjeli smisao objekta, postavlja se pitanje kako pristupiti elementima objekta (svojstvima i metodama)? pa pristupat emo im prema sljedeem principu:
ime_objekta.element;

Primjer 6 4: Kreirajmo objekt t koji e biti instanca klase Trokut koju smo kreirali u primjeru 4 2, pri emu e duljine stranica biti postavljene na 3, 4 i 5, a zatim u varijablu p spremimo povrinu tog trokuta. Rjeenje: Najprije kreirajmo objekt t, koji e biti instanca klase Trokut i ije e duljine stranica biti 3, 4 i 5. Prvi nain na koji moemo ovo rijeiti je da duljine stranica proslijedimo konstruktoru odmah prilikom kreiranja objekta:
Trokut t = new Trokut (3, 4, 5);

Isto ovo mogli smo napraviti tako da kreiramo objekt t iz klase Trokut, ali ovaj puta bez parametara. U tom e sluaju vrijednosti svojstava a, b i c biti postavljene na 0, a zatim postavimo vrijednosti svojstava na vrijednosti 3, 4 i 5, to bi izgledalo ovako:
Trokut t = new Trokut (); t.a = 3; t.b = 4; t.c = 5;

U prvom e se sluaju prilikom kreiranja objekta t izvravati drugi konstruktor, dok e se u drugom sluaju izvravati prvi konstruktor. Nakon to smo kreirali objekt tipa Trokut, trebamo jo u varijablu p spremiti povrinu tog trokuta. To emo napraviti pozivanjem metode Povrsina () nad objektom t, na sljedei nain:
double p = t.Povrsina ();

82

Java i objektno orijentirano programiranje Napiemo li npr.: Trokut t = new Trokut (3, 4, 5); U memoriji e se alocirati prostor za objekt Trokut te e se vrijednosti svojstava (stranice a, b i c postaviti na vrijednosti 3, 4 i 5) a u varijablu t e biti pohranjena adresa objekta u memoriji.
varijabla a t b c 3 4 5 objekt

Openito nad objektima nije mogue izvravati standardne operacije npr. +, -, ==,... Razmislimo li malo, to uistinu ima smisla. to bi znailo t + j ako su t i j dvije instance klase Trokut? to bi znailo zbrojiti dva trokuta? Operator pridruivanja (=) nad objektima je mogue pozivati, samo on ne radi uvijek ono to bismo moda oekivali. Pretpostavimo da smo kreirali dvije instance klase Trokut, t i j. Kao na sljedeoj slici:

a t b c

3 4 5 j

a b c

8 8 8

Izvravanjem izraza: t = j, dogodit e se sljedee:

a t b c

3 4 5 j

a b c

8 8 8

To znai da smo samo promijenili referencu i sada t i j pokazuju na isti objekt. Izvravanjem izraza: t.a = 4 svojstvo a (duljina stranice a) objekta j e takoer imati vrijednost 4.

83

Nasljeivanje klasa
Nasljeivanje je vrlo est pojam u objektno orijentiranom programiranju. Kao i kod samog objektno orijentiranog programiranja, osnovna ideja nasljeivanja je izbjei viestruko pisanje istih dijelova koda. Ideja je vrlo jednostavna: imamo jednu osnovnu klasu s osnovnim svojstvima i metodama koje ju opisuju, a onda po potrebi kreiramo nove klase koje ju "nadopunjuju" s nekim dodatnim svojstvima i metodama. Za takve klase koje "nadopunjuju" osnovnu klasu rei emo da ju nasljeuju. Ilustrirajmo nasljeivanje na jednom jednostavnom primjeru: pretpostavimo da elimo organizirati svoju kolekciju DVD-a i elimo napraviti program koji e nam to omoguiti. Oito emo imati dvije vrste DVD-a: s filmovima i s glazbom. Dakle kreirat emo dvije klase s pripadnim svojstvima i metodama:

84

Glazba
naslov SVOJSTVA SVOJSTVA velicina komentar izvodac brojPjesama dodajNaslov () vratiNaslov () dodajKomentar () METODE METODE vratiKomentar () vratiVelicinu () dodajIzvodaca () vratiIzvodaca () dodajBrojPjesama () vratiBrojPjesama ()

Film
naslov velicina komentar trajanje reziser dodajNaslov () vratiNaslov () dodajKomentar () vratiKomentar () vratiVelicinu () dodajTrajanje () vratiTrajanje () dodajRezisera () vratiRezisera ()

Kao to moemo primijetiti, neka svojstva i metode se nalaze u obje klase i stoga i moramo ih dva puta definirati. Problem moemo rijeiti tako da elemente koji se pojavljuju u obje klase definiramo u jednoj posebnoj klasi DVD: DVD
SVOJSTVA METODE naslov velicina komentar dodajNaslov () vratiNaslov () dodajKomentar () vratiKomentar () vratiVelicinu ()

Sad kada imamo definiranu klasu DVD, moemo kreirati klase Film i Glazba koje nasljeuju klasu DVD. Nasljeivanjem klase DVD klase Film i Glazba automatski nasljeuju i sva svojstva i metode klase DVD. Dakle sva ta svojstva i metode ne trebamo jo jednom definirati. Openito pretpostavimo da imamo neku klasu A, koja ima svoja svojstva i metode. Klasu A moe naslijediti klasa B, koja e u tom sluaju imati sva svojstva i metode kao i klasa A, ali moe imati i jo neka svoja dodatna svojstva i metode. U tom sluaju je A nadklasa klase B, dok emo za B rei da je podklasa od A.

Kreiranjem instance klase B moi emo pozivati sve koje smo definirali u klasi B, ali i one definirane u klasi A, dok emo kreiranjem instance klase A moi pozivati samo elemente klase A. Podklasa tako takoer moe biti nadklasa nekoj drugoj klasi i na taj nain je mogue izgraditi hijerarhiju klasa. klasa A

klasa B klasa C

Klasu B koja e naslijediti klasu A kreirat emo na sljedei nain:


class B extends A { definicija_klase; {

Kod ovakve hijerarhije moe se dogoditi da je metoda s istim imenom kreirana u dvije klase koje su na razliitoj razini u hijerarhiji. Npr. pretpostavimo da je u klasi A definirana metoda test () i metoda s istim imenom je definirana i u klasi B, koja nasljeuje klasu A. klasa A
... public int test() { ... } ...

klasa B
... public int test() { ... } ...

Kako klasa B nasljeuje klasu A ona nasljeuje i njenu metodu test (), a isto tako ona ima i svoju metodu test (). Kreiramo instancu klase B te pozovemo metodu test (), nije sasvim jasno koja metoda test () e se izvriti. U ovakvim sluajevima izvrit e se metoda test () koja je definirana u klasi B i to se zove prekoraenje (override) metoda. Openito smo mogli imati klasu C, koja nasljeuje klasu B (klasa C nema metodu test ()). Pozivanjem metode test () nad instancom klase C izvrit e se metoda test () iz klase B. Dakle, pravilo je takvo da se izvrava metoda iz prve nadklase.
86

Java i objektno orijentirano programiranje

Primjer 6 5: Kreirajmo klasu Cetverokut, ija e svojstva biti duljine stranica (a, b, c, d) etverokuta, dok e jedina metoda biti Opseg (), koja e vraati opseg etverokuta. Nadalje kreirajmo klasu Pravokutnik koja nasljeuje klasu Cetverokut te ima jo metode Povrsina (), koja rauna povrinu pravokutnika i Dijagonala (), koja vraa duljinu dijagonale pravokutnika. Rjeenje:
public class Cetverokut { public int a, b, c, d; public Cetverokut() { a = b = c = d = 0; } public Cetverokut (int a, int b, int c, int d) { this.a = a; this.b = b; this.c = c; this.d = d; } public int Opseg () { return a + b + c + d; } } public class Pravokutnik extends Cetverokut { public Pravokutnik () { a = b = c = d = 0; } public Pravokutnik (int a, int b) { this.a = a; this.b = b; this.c = a; this.d = b; } public int Povrsina () { return a * b; } public double Dijagonala () { return Math.sqrt (a * a + b * b); } }

87

Napomena: Svaka klasa moe nasljeivati samo jednu klasu, tj. klasa moe imati samo jednu nadklasu. S druge strane neku klasu moe nasljeivati bilo koja klasa, tj. klasa moe biti podklasa.

88

Java i objektno orijentirano programiranje

Zadaci za vjebu
1. Objasni razliku izmeu klase i objekta. 2. Navedi nekoliko primjera klasa iz stvarnog ivota, navedite nekoliko njihovih svojstava i metoda te objasnite to bi bio pripadni objekt. 3. to su po strukturi metode, a to svojstva? 4. to je konstruktor klase? 5. to znai preoptereenje (overloadanje) metoda? 6. Definriaj klasu krug, ije e svojstvo biti polumjer kruga (r), osim toga imat e seljedee metode: public double povrsina () koja e vraati povrinu kruga; public double oseg () koja e vraati opseg kruga. Potom napii novu klasu u kojoj e kreirati instancu klase krug i pozivati njene metode. 7. Definiraj klasu osoba ija e svojstva biti ime, prezime i starost osobe. Nad klasom treba definirati i sljedee metode: public String ispis () vraa ime i prezime osobe; public String inicijali () vraa inicijale osobe; public boolean stariji (osoba o) vraa true ako je trenutna osoba starija od osobe o, inae vraa false; Potom napii novu klasu u kojoj e kreirati instancu osoba krug i pozivati njene metode. 8. Definiraj klasu razlomak ija e svojstva biti brojnik i nazivnik nekog razlomka, osim tpoga imat e i sljedee metode: public razlomak krati () krati razlomak; public razlomak zbroj (razlomak r) vraa zbroj trenutnog razlomka i proslijeenog; public razlomak razlika (razlomak r) vraa razliku trenutnog razlomka i proslijeenog; public razlomak umnozak (razlomak r) vraa umoak trenutnog razlomka s proslijeenim; public razlomak kvocijent (razlomak r) vraa kvocijent trenutnog razlomka s proslijeenim; public String ispis () vraa zapis razlomka kao String (npr. 3/4). Potom napii novu klasu u kojoj e kreirati instancu klase razlomak i pozivati njene metode. 9. Objasni pojam nasljeivanje klasa. 10. Navedi nekoliko primjera nasljeivanja klasa iz svakodnevnog ivota. 11. Definiraj klasu trokut ija e svojstva biti duljine stranica trokuta (a, b, c) a imat e i dvije metode: public double opseg () vraa opseg trokuta public double povrsina () vraa povrinu trokuta Nadalje definiraj klasu jednakokracan koja nasljeuje klasu trokut, ima jo jedan dodatni konstruktor (koji ima samo jedan parametar) te ima jo metodu: public double visina () vraa visinu jednakostraninog trokuta Potom napii novu klasu u kojoj e kreirati instance klasa trokut i jednakokracan i pozivati njihove metode.

89

7
Programi u Javi
Klasa i program Metoda main Izvravanje Java programa iz komandnog prompta

90

Java i objektno orijentirano programiranje

Klasa i program
Sve to smo do sada radili svodilo se je na pisanje metoda, koje smo pozivali iz suelja BlueJ razvojnog okruenja. Pomou tog okruenja smo mogli metodi proslijediti parametre i na kraju vidjeti to metoda vraa. Nadalje smo nauili kako kreirati itave klase. Iz tih klasa smo kreirali objekte i nad njima izvravali metode, ali sve na razini metoda koje smo izvravali iz BlueJ razvojnog okruenja. Cilj programiranja je napraviti program koji e se moi samostalno izvravati na raunalu korisnika. Konkretno, htjeli bismo napisati program koji e se moi izvravati izvan BlueJ razvojnog okruenja. Program u Javi je isto tako jedna klasa. Da bi neka klasa postala program treba imati jo jednu metodu koju nazivamo main. Dakle, da bi neka klasa bila program koji emo moi izvravati neovisno o BlueJ razvojnom okruenju, ta klasa treba imati metodu main. Kada elimo pokrenuti program napisan u Javi prvo se trai metoda main i izvrava se. Ukoliko elimo pokrenuti klasu koja nema metodu main, doi e do pogreke i klasa se naravno nee pokrenuti. Za one koji su programirali u Pascalu, main je u stvari ekvivalent glavnom programu u Pascalu. U Pascalu smo isto tako mogli definirati svoje funkcije i procedure (metode), koje smo pozivali u glavnom programu. Pokretanjem programa se je u stvari izvravao glavni program. Da nismo imali glavnom programa, isto tako bi dolo do greke.

91

Metoda main
Ve smo rekli da e neka klasa biti program ako izmeu ostalih ima metodu main. Opi oblik definicije metode main je:
public static void main (String[] s) { definicija_metode; }

Ova metoda je izuzetno vana stoga emo ju detaljno objasniti. Osobito je bitno zaglavlje metode (prvi red), stoga emo objasniti znaenje jedne po jedne rijei unutar konteksta metode main. Rije s kojom zapoinje definicija metode main je public. O njoj smo ve govorili. Prisjetimo se: public openito znai da je neki element klase javan i moe mu se pristupiti i iz drugih klasa. Osim to moe biti public, elementi klase mogu biti jo i private i protected. Ukoliko je neki element private, tada tom elementu ne moemo pristupiti izvan klase u kojoj se taj element nalazi. Negdje izmeu public i private elemenata su protected elementi. Ako je neki objekt protected, tada takvom elementu moemo pristupiti u klasi koja nasljeuje dotinu klasu, ali ne i u ostalim klasama. U kontekstu metode main, bitno je da je ona public iz razloga to nju pokreemo prvu prilikom pokretanja klase. Nju pokree Java Virtual Machine. Sljedea rije u nizu je static. Da je neka metoda static znai da ju je mogue pozivati na razini klase. Prisjetimo se, kada smo htjeli pozvati metodu Povrsina () klase Trokut, morali smo kreirati instancu klase Trokut i nad tom instancom pozvati metodu Povrsina ().
Trokut t = new Trokut (a, b, c); double p = t.Povrsina ();

a nismo mogli pisati


double p = Trokut.Povrsina ();

s druge strane imamo klasu Math i npr. metodu sqrt () koja je definirana nad tom klasom. elimo li raunati drugi korijen nekog broja, ne moramo kreirati instancu klase Math i nad njom pozivati metodu sqrt (), ve metodu sqrt () pozivamo na razini klase Math.
double x = Math.sqrt (7);

U prvom sluaju metoda Povrsina () nije bila static i stoga smo ju morali pozivati na razini objekta koji je bio tipa Trokut. U drugom sluaju je metoda sqrt () static metoda i ona se moe pozivati na razini klase.
void znai return.

da metoda nita ne vraa. Na kraju metode koja je tipa void nije potrebno pisati

main je ime metode.

92

Java i objektno orijentirano programiranje

String [] s se odnosi na parametre metode. Metoda main kao parametre ima niz stringova. Primjer 7 1: Napiimo program koji e zbrajati dva prirodna broja i ispisivati njihov zbroj. Rjeenje: Budui da trebamo napisati program koji e zbrajati dva prirodna broja, napisat emo klasu koja e morati sadravati metodu main. Brojeve emo unijeti kao parametre metode main.
public class Zbroj { public static void main (String[] s) { int a = Integer.parseInt(s[0]); int b = Integer.parseInt(s[1]); System.out.println( a + b ); } }

U s obzirom da su parametri metode main stringovi, trebamo ih pretvoriti u cijele brojeve i to smo napravili naredbom Integer.parseInt (). Rezultat smo ispisali naredbom System.out.println (). Nakon to smo definirali klasu zbroj te ju uspjeno kompajlirali, preostaje nam jo pokrenuti program. Program emo u BlueJ razvojnom okruenju pokrenuti pozivanjem metode main.

Nakon pozivanja metode main otvorit e nam se okvir gdje emo unijeti parametre koje prosljeujemo metoda main. Budui da je parametar niz stringova, brojeve koje elimo zbrojiti zapisat emo unutar vitiastih zagrada, unutar navodnika, meusobno odvojene zarezom:

Klikom na gumb OK izvrit e se program i rjeenje e biti ispisano u posebnom okviru:

93

94

Java i objektno orijentirano programiranje

Izvravanje Java programa iz komandnog prompta


U prolom primjeru smo napravili program, meutim ponovo smo ga pozvali iz BlueJ razvojnog okruenja. Na samom poetku ovog poglavlja rekli smo da nam je cilj pisati programe koji e se moi izvravati neovisno o BlueJ razvojnom okruenju. U nastavku emo pokazati kako napisani program pokrenuti neovisno o BlueJ okruenju. Prethodni program je bio primjer jednog programa pisan za operativni sustav DOS, tzv. konzolni program. Da bismo pokrenuli ovaj program pokrenut emo DOS-ov komandni ekran. To moemo napraviti tako da kliknemo na Start pa na Run, gdje upiemo cmd te kliknemo na gumb OK:

Otvorit e nam se prozor u kojem zadajemo naredbe upisivanjem. Premjestit emo se u mapu u kojoj se nalazi klasa Zbroj, koju smo kreirati u primjeru 5 1. te emo upisati: java Zbroj 2 3. Pritiskom na tipku enter na ekranu e se pojaviti 5 (zbroj brojeva 2 i 3).

Primijetimo da smo program pokretali naredbom: java Zbroj 2 3. Java ovdje znai da pozivamo Javin interpreter, zbroj je ime klase (dokument s nastavkom class Zbroj.class) dok su 2 i 3 parametri koje prosljeujemo programu odnosno metodi main. Napomena: Da bismo mogli pokrenuti program iz komandnog prompta, on mora biti kompajliran tj. mora postojati dokument s nastavkom .class. Program kompajliramo u BlueJ-u.

95

Zadaci za vjebu
1. 2. 3. 4. to mora imati neka klasa da bismo ju mogli izvravati kao program? Zato metoda main mora biti public i static? Neke od klasa koje si kreirao u prolim poglavljima pretvori u programe te ih izvri. Definiraj komandnu aplikaciju, koja e se moi pokretati iz komandnog prompta a aplikacija treba unositi prirodan broj n i : a. ispisivati kvadrate svih prirodnih brojeva do n; b. zbrajati sve prirodne brojeve do n; c. ispisivati rastav broja n na proste faktore.

96

Java i objektno orijentirano programiranje

8
Elementi grafikog korisnikog suelja
O grafikom korisnikom suelju Prozor i njegovi dijelovi Okviri za tekst i gumbi

97

O grafikom korisnikom suelju


Posljednji program koji smo napisali pokretali smo iz komandne linije operativnog sustava DOS. Parametre smo programu prosljeivali tako da smo ih napisali neposredno iza imena programa. Dananji programi se najee ne pokreu iz komandne linije, a nain komunikacije ovjeka s programom je pomou mnotva razliitih elemenata (gumbi, okviri za tekst, padajue liste, izbornici,...).

U ovom poglavlju emo nauiti kako kreirati program koji e s korisnikom komunicirati preko grafikog korisnikog suelja. Osnovni element svakog takvog programa bit e prozor. Na njega emo doslovno lijepiti razliite elemente, kao to su: okviri za tekst, gumbi, izbornici, labele, gumbi za odabir,... Svaki od tih elemenata, pa i sam prozor su u stvari klase. I pojedini element emo dodavati tako da napravimo instancu odgovarajue klase te mu definiramo neka svojstva. Kao to znamo, na neke radnje unutar takvog korisnikog suelja se dogaaju neke akcije. Npr. klikom na gumb 7 u programu kalkulator e se na displayu kalkulatora pojaviti broj 7. Openito se takva reakcija zove dogaaj i svaki dogaaj unutar programa treba isprogramirati. Tono trebamo rei koji e biti odgovor na neku radnju.

98

Java i objektno orijentirano programiranje

Prozor i njegovi dijelovi


Ve smo rekli da su prozor i openito svi elementi grafikog korisnikog suelja u stvari klase. Te klase nisu inicijalno ukljuene u Javi, ve ih moramo posebno pozvati. Klase za definiranje elemenata grafikog korisnikog suelja smjetene su u paketu koji se naziva javax.swing. Openito emo paket u klasu ukljuiti naredbom:
import ime_paketa.*;

Dakle, paket koji sadri klase za generiranje elemenata grafikog korisnikog suelja pozvat emo naredbom:
import javax.swing.*;

znak * na kraju znai da ukljuujemo sve pakete koji se nalaze u paketu javax.swing. Klasa koja e u Javi kreirati prozor je JFrame. Kao i svaka druga klasa i ova ima svoja svojstva i metode. Sama po sebi se namee potreba da prozoru definiramo veliinu (irinu i visinu), naslov,... Pa upravo su te metode i definirane nad klasom JFrame. Klasa JFrame ima dva konstruktora:
JFrame () kreira prozor bez ikakvih elemenata JFrame (String s) kreira prozor u ijoj e

naslovnoj traci biti pisati string koji smo

proslijedili kao parametar. Najee metode koje emo mi koristiti nad prozorom su:
public void setSize (int s, int v) definira irinu i visinu prozora public void setTitle (String s) definira naslov prozora public void setVisible (boolean b) postavlja prozor u programu. Ukoliko

je vrijednost

varijable b postavljena na true, prozor e biti vidljiv. definira akciju koja se dogaa klikom na gumb close ( ). Mi emo uvijek kao parametar ove metode pisati svojstvo EXIT_ON_CLOSE klase JFrame. public Container getContentPane () vraa sredinji dio prozora (Container), na koji emo dodavati elemente grafikog korisnikog suelja (gumbe,...).
public void setDefaultCloseOperation (int n)

Primjer 8 1: Napiimo program koji e na ekranu crtati prozor u ijoj e naslovnoj traci pisati "Jedan obian prozor", dok e mu irina biti 400 a visina 300 piksela. Rjeenje: Budui da trebamo napisati program koji e crtati prozor na ekranu, u konstruktoru emo napraviti prozor, definirati mu sve elemente i postaviti ga vidljivim, a onda emo u metodi main kreirati instancu klasu koja e (zbog definicije konstruktora) iscrtati prozor na ekranu.
import javax.swing.*; public class Prozor

99

{ private JFrame p = new JFrame (); public Prozor() { p.setTitle ("Jedan obian prozor"); p.setSize (400, 300); p.setDefaultCloseOperation (p.EXIT_ON_CLOSE); p.setVisible (true); } public static void main (String[] s) { Prozor pr = new Prozor (); } }

Pokretanjem metode main na ekranu e se pojaviti prozor kao na slici:

Prozor isto tako moemo kreirati i tako da kreiramo klasu koja nasljeuje klasu JFrame. U tom sluaju neemo morati kreirati instancu klase JFrame, to e nam omoguiti direktno pozivanje svojstava i metoda klase JFrame. U tom sluaju e rjeenje prolog primjera imati sljedei oblik:
import javax.swing.*; public class Prozor extends JFrame { public Prozor() { setTitle ("Jedan obian prozor"); setSize (400, 300); setDefaultCloseOperation (EXIT_ON_CLOSE); setVisible (true); } public static void main (String[] s) { Prozor pr = new Prozor (); } }

Mi emo u daljnjim primjerima uglavnom kreirati prozore nasljeivanjem klase JFrame.


100

Java i objektno orijentirano programiranje

Okviri za tekst i gumbi


U prolom primjeru smo nauili kako kreirati jedan obian prozor. Nadalje emo prozorima dodavati dodatne komponente. Ve smo rekli da su elementi grafikog korisnikog suelja u stvari klase. Okviri za tekst Okvir za tekst kreiramo klasom JTextField. Instancu klase JTextField najee emo kreirati koristei konstruktor bez parametara, a sva potrebna svojstva definirat emo koristei metode. Neke od najee koritenih metoda u za rad s okvirom za tekst su:
public void setSize (int s, int v) definira veliinu okvira za tekst public void setLocation (int x, int y) definira mjesto, unutar Containera,

na kojem e se nalaziti okvir za tekst (koordinate gornjeg lijevog vrha okvira za tekst) public void setText (String s) postavlja tekst u okvir za tekst public String getText () vraa tekst koji je upisan u okvir za tekst public void setEditable (boolean b) ukoliko je b postavljen na true tekst unutar okvira za tekst e se moi mijenjati. Ukoliko je b postavljen na false sadraj okvira za tekst nee biti mogue mijenjati. Gornja klasa omoguavala nam je kreiranje okvira za unos teksta. Osim to se moe unositi tekst se isto tako moe i ispisivati na prozoru. Na prozoru emo tekst ispisivati unutar posebnih elemenata grafikog korisnikog suelja, tzv. labela. Klasa koja e nam kreirati takve labele je JLabel. Instancu klase JLabel emo isto tako najee kreirati gez konstruktora. Neke od metoda ove klase su:
public void setSize (int s, int v) definira veliinu labele public void setLocation (int x, int y) definira mjesto,

unutar Containera, na kojem

e se nalaziti labela (koordinate gornjeg lijevog vrha okvira za tekst) public void setText (String s) postavlja tekst u labelu Gumbi Gumb emo kreirati klasom JButton. Slino kao i kod okvira za tekst, instancu klase JButton emo uglavnom kreirati koristei konstruktor bez parametara, a dodatna svojstva emo definirati pomou metoda. Metode koje emo najee koristiti s gumbima su:
public void setSize (int s, int v) definira veliinu gumba public void setLocation (int x, int y) definira mjesto, unutar

Containera, na kojem e se nalaziti gumb (koordinate gornjeg lijevog vrha gumba) public void setText (String s) postavlja tekst na gumb public void setEnabled (boolean b) ukoliko je vrijednost varijable b true gumb e biti aktivan, inae gumb nee biti aktivan.
101

Elemente kao to su gumbi ili okviri za tekst ne moemo dodavati direktno na prozor koji smo kreirali u prethodnom primjeru. Komponente emo dodavati na jedan poseban dio prozora koji nazivamo Container. Container je opet jedna posebna klasa. Slino kao i klasa JFrame, i ova klasa se nalazi u jednom posebnom paketu: java.awt. Slino kao i kod paketa javax.swing, ovaj paket emo uitavati naredbom:
import java.awt.*;

Instanci klase Container emo pridruiti sredinji dio prozora metodom getContentPane ().

prozor

Container

Prije nego to ponemo dodavati elemente na Container moramo definirati izgled Containera. Izgled Containera emo definirati metodom setLayout (LayoutManager m) koja je definirana u klasi Container. Ovdje se neemo uputati u objanjavanje LayoutManagera. U osnovi se radi o obliku Contaniera. Npr. podruje Containera moe biti tablica i elemente jednostavno redom dodajemo u elije tablice. Prvi element dodajemo u prvu eliju prvog reda, sljedei u drugu eliju prvog retka,... posljednji element dodajemo u posljednju (desnu) eliju posljednjeg retka tablice. Podruje Containera koje e imati oblik tablice od 3 retka i 4 stupca definirat emo na sljedei nain:
c.setLayout (new GridLayout (3, 4)),

pri emu je c instanca klase Container.

102

Java i objektno orijentirano programiranje

Mi emo ponekad elemente stavljati na odreene koordinate Contaienera, jer e nam tako biti lake. U tom emo sluaju podruje Containera definirati na sljedei nain:
c.setLayout (null);

Ovime smo u stvari rekli da je nae podruje prazna ploa i za svaki element emo rei na koje koordinate te ploe dolazi.

I na kraju emo jo samo nauiti kako gotovi element dodati na Container. To emo napraviti metodom add klase Container. Opi oblik klase add je:
public void add (Object o);

Primjer 8 2: Napiimo program koji e na ekranu nacrtati prozor. Prozor treba imati dva okvira za tekst, jedan ispod drugoga, ispod njih treba imati gumb na kojem pie Zbroji te ispod gumba jo jedan okvir za tekst.

103

Rjeenje:
import javax.swing.*; import java.awt.*; public class Zbrajanje extends { private final int sirina = private final int visina = private Container c; private JTextField t1, t2, private JButton b; JFrame 220; 200; t3;

public Zbrajanje() { setTitle ("Zbrajanje"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null); //prvi okvir za tekst t1 = new JTextField (); t1.setSize (200, 25); t1.setLocation (5, 5); c.add (t1); //drugi okvir za tekst t2 = new JTextField (); t2.setSize (200, 25); t2.setLocation (5, 45); c.add (t2); //gumb b = new JButton (); b.setText ("Zbroji"); b.setSize (200, 25); b.setLocation (5, 85); c.add (b); //trei okvir za tekst t3 = new JTextField (); t3.setSize (200, 25); t3.setLocation (5, 125); c.add (t3); setVisible (true); } public static void main (String[] s) { Zbrajanje z = new Zbrajanje (); } }

Pokretanjem metode main, na ekranu e se pojaviti sljedei prozor:

104

Java i objektno orijentirano programiranje

105

Zadaci za vjebu
1. 2. 3. 4. 5. 6. 7. 8. to je grafiko korisnikko suelje? Koji paket moramo ukljuiti u program da bismo mogli raditi s prozorima? Koja klasa omoguava crtanje prozora na ekranu? to je container? Koja klasa omoguava kreiranje gumba na prozoru? Koja klasa omoguava kreiranje okvira za tekst na prozoru? Definiraj prozor koji e oko sredine imati jedan gumb na kojem e pisati OK. Definiraj prozor koji e imati sljedei oblik (nije potrebno voditi rauna oboji teksta na gumbima):

106

Java i objektno orijentirano programiranje

9
Dogaaji
Dogaaji

107

Dogaaji
U primjeru iz prethodnog poglavlja smo kreirali jedno korisniko suelje, u ije okvire za tekst moemo unositi tekst, brojeve ili bilo to drugo. Nekako smo navikli da se klikom na gumb dogodi neka oekivana akcija. Ovdje bi nekako bilo za oekivati da se klikom na gumb Zbroji zbroje brojevi koji piu u prvom i drugom okviru za tekst te da se rjeenje upie u posljednji okvir za tekst. Meutim klikom na gumb Zbroji ne dogaa se nita. Zato? Pa vrlo jednostavno nismo rekli to se treba dogoditi kada kliknemo na gumb. Openito, klikom na gumb kreira se jedan dogaaj. Taj dogaaj alje poruku drugom objektu, koji emo nazvati listener. Listener raspolae sa svim podacima o dogaaju (npr. zna koji je gumb pritisnut ako ih je vie,...). Kada primi poruku o dogaaju listener izvrava neku radnju, tj. pokree odgovarajuu metodu koju smo mu definirali. Java ima nekoliko razliitih klasa za praenje razliitih tipova dogaaja. Mi emo se u ovom trenutku fokusirati na dogaaje koji su povezani sa sueljem. Takve dogaaje zvat emo akcije. Rad s dogaajima vezanim uz suelje omoguava nam klasa ActionListener, koja sadri samo zaglavlje metode actionPerformed. Tijelo metode actionPerformed emo definirati u vlastitoj klasi. Unutar tijela metode actionPerformed emo staviti kd koji e se izvriti kao reakcija na neki dogaaj. Openito emo klase koje sadre samo zaglavlja metoda zvati interface. Dakle, ActionListener je zapravo interface, ija bi definicija mogla imati sljedei oblik:
public interface ActionListener

{
public void actionPeroformed (ActionEvent

e)

} S obzirom da metoda actionPerformed nema tijela, dakle nije definirana u interfaceu, nije mogue kreirati instancu interfacea ActionListener, no kako ga trebamo u svojoj klasi, ipak ga trebamo nekako u nju ukljuiti. Openito emo koritenje interfacea u klasi najaviti na sljedei nain:
public class ime_paketa implements ime_interfacea;

Za nau klasu Zbrajanje bi u tom sluaju zaglavlje imalo sljedei oblik:


public class Zbrajanje extends JFrame implements ActionListener

Budui da se interface nalazi u posebnom paketu java.awt.event, morat emo i taj paket ukljuiti u klasu u kojoj emo obraivati dogaaje. Nadalje trebamo "registrirati" elemente na kojima elimo pratiti dogaaje. To emo napraviti izvravanjem metode:
addActionListener (Object o)

objektom. Kao to moemo primijetiti kao parametar metode dolazi neki objekt. Radi se o tome da se moe kreirati posebna klasa koja e obraivati dogaaje i u tom sluaju se kao parametar navodi instanca te klase. Mi emo dogaaje uvijek obraivati u klasi u kojoj e se dogaaj i dogoditi, stoga emo kao parametar uvijek pisati this. Dakle, naa metoda addActionListener uvijek e imati oblik:
addActionListener

nad

odreenim

108

Java i objektno orijentirano programiranje

ime_objekta.addActionListener (this)

Mi emo za sada samo pratiti dogaaje na gumbima, iako je mogue pratiti dogaaje i na ostalim elementima suelja, no o tome emo govoriti neto kasnije. Na kraju trebamo definirati metodu actionPerformed, unutar koje emo definirati akcije za sve dogaaje koje pratimo. Zaglavlje metode actionPerformed je:
actionPerformed (ActionEvent e)

Parametar e metode actionPerformed ima sve informacije o dogaajima, pa izmeu ostaloga zna i nad kojim elementom je dogaaj izvren. Metoda koja e nam vratiti ime objekta nad kojim je izvren dogaaj je getSource () i pozvat emo ju nad objektom tipa ActionEvent. Ponovimo jo jednom. Za obraivanje dogaaja trebamo napraviti sljedee korake: 1. ukljuiti paket java.awt.event 2. implementirati interface ActionListener u svojoj klasi. To emo napraviti tako da u zaglavlju klase dodamo jo implements ActionListener. Npr. public class Zbrajanje extends JFrame implements ActionListener 3. registrirati listener na elementu grafikog korisnikog suelja metodom this u ovom sluaju znai da je listener implementiran u klasi u kojoj se upravo nalazimo, i svi nai primjeri e izgledati tako. 4. definirati metodu actionPerformed, koja e sadravati kd koji e se izvriti kao reakcija na neki dogaaj. Primjer 9 1: Izmijenimo Primjer 8 2, tako da se klikom na gumb Zbroji u trei okvir za tekst upie zbroj brojeva koji su upisani u prva dva okvira za tekst. Rjeenje:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Zbrajanje extends { private final int sirina = private final int visina = private Container c; private JTextField t1, t2, private JButton b; addActionListener (Objekt o). Npr. b.addActionListener (this).

JFrame implements ActionListener 220; 200; t3;

public Zbrajanje() { setTitle ("Zbrajanje"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null); t1 = new JTextField (); t1.setSize (200, 25);

109

t1.setLocation (5, 5); c.add (t1); t2 = new JTextField (); t2.setSize (200, 25); t2.setLocation (5, 45); c.add (t2); b = new JButton (); b.setText ("Zbroji"); b.setSize (200, 25); b.setLocation (5, 85); //najavljujemo praenje dogaaja nad gumbom b b.addActionListener (this); c.add (b); t3 = new JTextField (); t3.setSize (200, 25); t3.setLocation (5, 125); c.add (t3); setVisible (true); } //metoda koja uzima sadraj prvog i drugog okvira za tekst //te ih zbraja i zbroj postavlja u trei okvir za tekst public void zbroji () { int a = Integer.parseInt (t1.getText ()); int b = Integer.parseInt (t2.getText ()); int c = a + b; t3.setText ("" + c); } //definicija metode actionPerformed na bilo koji dogaaj //koji se prati e se izvriti metoda zbroji () public void actionPerformed (ActionEvent e) { zbroji (); } public static void main (String[] s) { Zbrajanje z = new Zbrajanje (); } }

Primijetimo da smo u prolom primjeru pratili samo jedan dogaaj i to onaj nad gumbom b, stoga smo rekli da se na bilo koji dogaaj izvri metoda zbroji (). Meutim esto emo unutar programa morati pratiti vie dogaaja i u tom sluaju uglavnom neemo uvijek izvravati istu metodu, stoga emo morati provjeriti nad kojim elementom je dogaaj izvren i ovisno o elementu emo izvriti odgovarajuu metodu. Naziv objekta nad kojim je izvrena akcija dobit emo metodom getSource () koju pozivamo nad objektom tipa ActionEvent. Dakle, naa metoda actionPerformed iz prethodnog primjera mogla bi imati i sljedei oblik:
public void actionPerformed (ActionEvent e) {

110

Java i objektno orijentirano programiranje


if (e.getSource () == b) zbroji (); }

111

Zadaci za vjebu
1. to sve moramo napraviti kako bismo mogli pratiti dogaaje na nekom elementu prozora? 2. to je interface? 3. Napii program koji e na ekranu crtati prozor kao na slici. Klikom na gumb Mijenjaj se iznos duljine u centimetrima treba pretvoriti u iznos duljine u inchima (1 inch = 2.54 cm).

4. Napii program koji e crtati prozor kao na slici. Klikom na gumb Kodiraj se tekst iz gornjeg okvira za tekst treba kodirati i tako kodiran prepisati u donji okvir za tekst. Tekst emo kodirati tako da svaki znak zamijenimo znakom iji je ASCII kd za jedan vei od ASCII kda odgovarajueg znaka. Klikom na gumb Dekodiraj se tekst iz donjeg okvira za tekst treba dekodirati i tako dekodiran prepisati u gornji okvir za tekst.

5. Napii program koji e crtati prozor kao na slici. Klikom na gumb OK gumb se treba pomaknuti u sluajnom smjeru za 10 pixela. Napomena: pri pomicanju gumba treba voditi rauna da niti jedan dio gumba ne izae izvan okvira prozora.

112

Java i objektno orijentirano programiranje 6. Napii program koji e crtati ekran i na njemu jedan gumb. Kada se program uita na gumbu treba pisati tekst Broj: 0. Svakim klikom na gumb tekst na gumbu se treba izmijeniti i to tako da se izmijeni broj pokraj teksta Broj (nakon prvog klika na gumbu treba pisati Broj: 1, nakon drugog Broj: 2,...)

7. Napii program koji e na ekranu crtati prozor i dva gumba (Gumb 1 i Gumb 2). Na poetku e biti aktivan samo prvi gumb (Gumb 1), klikom na prvi gumb on postaje neaktivan a aktivan postaje drugi gumb. Klikom na drugi gumb on postaje neaktivan a aktivan postaje ponovo prvi gumb,...

113

10
Iznimke
to je iznimka? Hvatanje iznimki u Javi Procesiranje iznimki

114

Java i objektno orijentirano programiranje

to je iznimka?
Napisali smo program provjerili ga za neke svoje podatke i sve radi kako treba, testiramo program ponovo, kad gle, sada ne radi, izbacuje greku. U emu je problem? Razloga zato je program maloprije radio a sada vie ne radi je puno. Neki od eih su: program ita podatke iz datoteke, koju smo u meuvremenu izbrisali ili preimenovali; umjesto broja smo unijeli znak; podaci su takvi da se u nekom trenutku pojavljuje dijeljenje s nulom; ... Sve gore navedene situacije u stvari nisu greke, ve specifine situacije za koje na program ne radi ispravno tzv. iznimke. Kako takvih iznimnih situacija moe biti jako puno i teko ih je sve predvidjeti, Java nudi mogunost automatskog praenja iznimaka. Jednostavno emo u kodu doati do znanja da je neki dio programa problematian i da bi se u njemu mogla pojaviti iznimka. Ukoliko se iznimka ne pojavi, nikome nita, program e se izvriti kako smo i htjeli i to je u stvari oekivano ponaanje. Meutim, ako se iznimka pojavi, program nee stati s radom, kao inae, ve mo mi rei to treba napraviti u takvoj situaciji. Najee e to biti poruka korisniku da se je pojavila greka, pokuaj ispravljanja greke predvianjem onoga to je korisnik programa htio napraviti,...

Hvatanje iznimki u Javi


U programu moemo specificirati da pratimo samo odreenu vrstu iznimki, npr. pratimo samo iznimke koje mogu uslijediti zbog unosa pogrenog tipa podatka, iznimke vezane uz pristup fileovima, iznimke vezane uz formate brojeva,... Dio koda koji bi mogao prouzroiti iznimku u programu stavljamo u blok try. Nakon try bloka slijedi catch blok, kojih moe biti vie. U bloku catch specificiramo vrstu iznimke koju pratimo. Iza posljednjeg catch bloka opcionalno dolazi blok finally. Unutar bloka finally stavljamo dio programa koji se izvrava uvijek, bez obzira je li dolo do greke ili nije. Finally blok je opcionalan, meutim ako nismo stavili niti jedan catch blok, nakon try moramo staviti finally blok.
try { //naredbe koje bi mogle prouzrokovati iznimke } catch (VrstaIznimke1 iz1) { /* dio koda koji se izvrava ako se je pojavila iznimka tipa VrstaIznimke1 */ } ... finally { /* dio programa koji se uvijek izvrava, bez obzira je li dolo do iznimke ili ne */ }

115

Ukoliko se u nekoj od naredbi unutar bloka try pojavi iznimka prelazi se na prvi catch blok, ukoliko taj catch blok "nadlean" za praenje iznimke koja se je pojavila u bloku try izvrava se kod unutar tog catch bloka, inae se prijelazi na sljedei catch blok,... Na kraju se uvijek (bez obzira je lise iznimka pojavila ili ne) prelazi na finally blok, ukoliko on postoji. Ukoliko iza bloka try ne postoji blok catch, tada se odmah prelazi na blok finally, koji u tom sluaju morapostojati. Ve smo rekli da postoji nekoliko vrsta iznimki koje moemo pratiti i tada naziv te iznimke navodimo kod catch bloka. Vrste iznimki definirane su posebnim klasama. Osnovna klasa koja nam omoguava praenje svih iznimaka u programu je klasa Exception. Sve ostale klase za praenje iznimki nasljeuju klasu Exception. Kao i svaka druga klasa, Exception, pa onda i sve druge klase za praenje iznimaka imaju svoje metode. Najee koritene metode su: Opis vraa opis iznimke vraa vrstu iznimke, odnosno naziv klase koja je stvorila iznimku printStackTrace () koristi se kod nasljeivanja klasa a koristi se kada se eli pratiti u kojim su se klasama i metodama greke pojavljivale Tablica 10 1 Metode klase Exception Kao to smo ve rekli, osim genralne klase Exception, koja prati sve iznimke koji se mogu pojaviti, postoji i niz drugih klasa za praenje odreenog tipa iznimki, a koje nasljeuju klasu Exception. Neke od klasa za praenje iznimaka dane su u sljedeoj tablici: Klasa iznimaka Opis ArithmeticException Aritmetike greke kao dijeljenje s 0,... FileNotFoundException Rad s fileom koji ne postoji StringIndexOutOfBoundsException Indeks u stringu ne postoji NumberFormatException Nedozvoljeni format broja Tablica 10 2 Najee klase za praenje iznimaka Koritenje klasa za automatsko praenje iznimaka uvelike olakava posao programera. U programima je bitno voditi rauna da pratite pravu vrstu iznimki, kako neke vrste iznimki ne bi prole neprimjeene, to bi u tom sluaju prouzroilo prekid u radu programa. Hvatanje apsolutno svih iznimaka koritenjem klase Exception je mogue ali nije ba preporuljivo. Primjer 10 1: Napiimo program koji e na ekranu nacrtati prozor. Prozor treba imati dva okvira za tekst, jedan ispod drugoga, ispod njih treba imati gumb na kojem pie Zbroji te ispod gumba jo jedan okvir za tekst. Klikom na gumb Zbroji u trei okvir za tekst upie zbroj brojeva koji su upisani u prva dva okvira za tekst. U sluaju da neto od unesenog nije broj, u trei okvir za tekst treba ispisati odgovarajuu poruku. Rjeenje:
import javax.swing.*; import java.awt.*;

Metoda getMessage () toString ()

116

Java i objektno orijentirano programiranje


import java.awt.event.*; public class Zbrajanje extends { private final int sirina = private final int visina = private Container c; private JTextField t1, t2, private JButton b;

JFrame implements ActionListener 220; 200; t3;

public Zbrajanje() { setTitle ("Zbrajanje"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null); t1 = new JTextField (); t1.setSize (200, 25); t1.setLocation (5, 5); c.add (t1); t2 = new JTextField (); t2.setSize (200, 25); t2.setLocation (5, 45); c.add (t2); b = new JButton (); b.setText ("Zbroji"); b.setSize (200, 25); b.setLocation (5, 85); b.addActionListener (this); c.add (b); t3 = new JTextField (); t3.setSize (200, 25); t3.setLocation (5, 125); c.add (t3); setVisible (true); } public void zbroji () { try { int a = Integer.parseInt (t1.getText ()); int b = Integer.parseInt (t2.getText ()); int c = a + b; t3.setText ("" + c); } catch (NumberFormatException e) { t3.setText ("Pogrean format broja"); } } public void actionPerformed (ActionEvent e) { zbroji ();

117

} public static void main (String[] s) { Zbrajanje z = new Zbrajanje (); } }

Procesiranje iznimki
Kako se u stvari prate iznimke u programu? Kada se unutar try bloka neke metode dogodi iznimka, neki dio metode se ne moe korektno izvriti, kontrola programa se preusmjeri na catch blok. Promotrimo to na prethodnom primjeru. Metoda zbroji () imala je sljedei oblik:
public void zbroji () { try { int a = Integer.parseInt (t1.getText ()); int b = Integer.parseInt (t2.getText ()); int c = a + b; t3.setText ("" + c); } catch (NumberFormatException e) { t3.setText ("Pogrean format broja"); } }

Ukoliko korisnik u okvir za tekst t1 unese vrijednost koja nije cijeli broj. Naredba: Integer.parseInt (t1.getText ()); nee se moi uspjeno izvriti. te e se preskoiti sve druge naredbe unutar try bloka i izvravanje programa e se nastaviti u catch bloku, tj. izvrit e se naredba: t3.setText ("Pogrean format broja"); to je u stvari u pozadini toga. Pria ide otprilike ovako. Programer koji je programirao metodu parseInt () klase Integer, pretpostavio je da bi se esto moglo dogoditi da parametar ove metode ne bude string koji se sastoji samo od znamenaka. U tom e se sluaju dogoditi nekoliko stvari: kreirati e se objekt iz neke od klasa za rad s iznimkama (u ovom sluaju je to specijalno klasa NubmerFormatException); izvravanje metode (u naem sluaju zbroji ()) na tom mjestu prestaje te se trai mjesto za nastavak izvravanja. To mjesto je blok catch. Postavlja se pitanje, a moemo li mi, poput programera koji je programirao metodu parseInt (), kod svojih metoda na ovakav nain preusmjeravati izvravanje programa i vraati poruke o grekama? Naravno da moemo i to na sljedei nain: Pretpostavimo da imamo metodu inicijali (), iji je parametar tipa string, koji predstavlja ime i prezime neke osobe, odvojene jednim razmakom, a metoda vraa inicijale te osobe (prvo slovo imena i prvo slovo prezimena) Metoda inicijali (), unutar svoje klase bi mogla izgledati ovako:
public class Inicijali

118

Java i objektno orijentirano programiranje


{ public static String inicijali (String ime) { int n = ime.indexOf (" "); return ime.substring (0, 1) + ". " + ime.substring (n + 1, n + 2) + "."; } }

Budui da je metoda inicjali () static, moe se pozivati bez da se kreira objekt klase Inicijali, pa stoga klasa Inicijali ne mora imati konstruktor. Napiimo sada odgovarajui program i testirajmo ovu metodu: Primjer 10 2: Napiimo program koji e crtati korisniko suelje kao na slici. Klikom na gum Inicijali, u drugi okvir za tekst trebaju se ispisati inicijali osobe ije je ime i prezime uneseno u prvi tekstualni okvir.

Rjeenje:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TestInicijali extends JFrame implements ActionListener { private Container c; private JButton b1; private JTextField t1, t2; public TestInicijali() { setTitle ("Inicijali"); setSize (300, 120); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (new GridLayout(3, 1)); t1 = new JTextField (); c.add (t1); b1 = new JButton (); b1.setText ("Inicijali"); b1.addActionListener (this); c.add (b1); t2 = new JTextField (); c.add (t2);

119

setVisible (true); } public void actionPerformed (ActionEvent e) { t2.setText (Inicijali.inicijali (t1.getText ())); } public static void main (String[] s) { TestInicijali ti = new TestInicijali (); } }

Pokrenemo li program i upiemo npr. u prvi okvir za tekst Ivan Markovi, program e raditi dobro, no meutim upiemo li samo Ivan, program nee raditi dobro, a ako upiemo Ivan i na kraju stavimo jo jedan razmak, potpuno e se sruiti. To ruenje programa nam se ne svia. Greka je u tome to se mi u svojom metodi inicijali () na jednom mjestu referenciramo na prvi znak iza razmaka, no to ako razmak uope ne postoji? to ako nema znaka nakon prvog razmaka? To su izuzetne situacije i u njima bi program trebao javiti greku, pa ispravimo svoju metodu inicijali () tako da radi korektno:
public class Inicijali { public static String inicijali (String ime) throws Exception { int n = ime.indexOf (" "); if (n == -1 || n == ime.length () - 1) throw new Exception ("Podaci nisu potpuni"); else return ime.substring (0, 1) + ". " + ime.substring (n + 1, n + 2) + "."; } }

Kao to moemo primijetiti dodali smo u metodi provjeravanje uvjeta. Ukoliko nema razmaka ili je jedini razmak na posljendjem mjestu, izvravanje metode koja poziva metodu inicijali () e se prekinuti, kreirat e se objekt Exception te e se izvravanje metode nastaviti u bloku catch. String koji prosljeujemo konstruktoru klase Exception u stvari e biti tekst poruke koju e objekt tipa exception vratiti metodom getMessage (), odnosno tekst prvog reda koji vraa metoda printStackTrace (). Primijetimo da smo izmijenili i zaglavlje metode inicijali (), u nastavku smo dodali throws Exception, to u osnovi znai da metoda sve iznimke prosljeuje klasi Exception. Umjesto Exception mogla se je ovdje nai i neka druga klasa nakoju bi prosljeivali izvravanje programa u sluaju greke. Nakon to smo ovako izmijenili metodu inicijali, moramo izmijeniti i metodu actionPerformed () koja poziva metodu inicijali (). Naime, u metodi actionPerformed () dio koda u kojem se nalazi poziv metode inicijali trebamo staviti u try blok. Tako izmijenjena metoda actionPerformed () sada ima oblik:
public void actionPerformed (ActionEvent e) { try { t2.setText (Inicijali.inicijali (t1.getText ()));

120

Java i objektno orijentirano programiranje


} catch (Exception e1) { t2.setText (e1.getMessage ()); } }

Pokrenemo li sada program i u prvi okvir za tekst upiemo samo Ivan i razmak, program se ovaj puta nee sruiti, ve e u drugom okviru za tekst pisati poruka: Podaci nisu potpuni

121

Zadaci za vjebu
1. 2. 3. 4. 5. Objasni iznimke. Navedi neke primjere koji mogu izazvati iznimku. Kako procesiramo iznimke u Javi? Navedi neke klase iznimaka u Javi. Napii program koji e crtati prozor kao na slici. Klikom na gumb Novi broj treba generirati i na labelu ispisati sluajan broj iz zadanog intervala.

6. Napii program koji e crtati prozor kao na slici. Klikom na gumb Raunaj na labelu se treba ispisati nova cijena koja se dobije uveavanjem poetne cijene za zadani postotak.

7. Napii program koji e crtati prozor kao na slici. Klikom na gumb Raunaj u okvir za tekst se treba ispisati iznos anuiteta kredita za upisani iznos kredita, kamatnu stopu te broj mjeseci. Iznos anuiteta se rauna prema sljedeoj formuli:
Cr n (r 1) p , pri emu je: r = 1 + , p godinja kamatna stopa, C iznos kredita i n n 1200 r 1 broj mjeseci otplate. a=

122

Java i objektno orijentirano programiranje

8. Napii program koji e crtati prozor kao na slici. Klikom na gumb Mijenjaj boja teksta Tekst se treba promijeniti. Novu boja teksta e biti boja ije se RGB komponente unose u postavljene okvire za tekst.

9. Napii program koji e crtati prozor kao na slici. U lijevom gornjem dijelu prozora ispisuje se zadatak. Zadatak se sastoji od dva broja i jedne od operacija (+, - ili *). Unosom broja u okvir za tekst i klikom na gumb Dalje treba provjeriti ispravnost rjeenja i ovisno o tonom odgovoru izmijeniti broj tonih i broj ukupnih bodova (tono/ukupno) i generirati novi zadatak. Klikom na gumb Kraj treba zavriti rad s programom.

123

11
Sloeniji elementi grafikog korisnikog suelja
Kvadratii za odabir opcija Kruii za odabir opcija Podruja za tekst Trake za pomicanje Padajue liste Izbornici

124

Java i objektno orijentirano programiranje U 6. poglavlju smo se upoznali s osnovnim elementima korisnikog suelja (gumbi, Labele i okviri za tekst), osim navedenih, u programima esto susreemo i niz drugih elemenata korisnikog suelja, a o najeima emo govoriti u ovom poglavlju. S obzirom da smo se ve susretali s elementima grafikog korisnikog suelja, ovdje se neemo puno zadravati na pojedinom elementu.

Kvadratii za odabir opcija


Kvadratie za odabir opcija koristimo kada u programu trebamo odabratu jednu, vie ili niti jednu od ponuenih opcija. Nakon to pojedinu opciju odaberemo pojavi se kvaica u kvadratiu ispred nje.

Slika 11 1: Primjer kvadratia za odabir opcija Kvadrati za odabir kreirat emo koristei klasu JCheckBox. Najee metode koje emo koristiti pri radu s kvadratiima za odabir opcija su: definira veliinu kvadratia i podruja za tekst koje se ispisuje pokraj kvadratia. Kvadrati je uvijek iste veliine, bez obzira na definiranu veliinu. public void setLocation (int x, int y) definira poziciju kvadratia za odabir na Containeru. public void setText (String s) definira tekst koji e se pojaviti pokraju kvadratia za tekst public String getText () vraa tekst koji je upisan pokraj kvadratia za odabir public void setEnabled (boolean b) ukoliko je b postavljen na true kvadrati e biti aktivan i moi e se oznaiti (odznaiti), inae e biti neaktivan i neemo nad njim napraviti nikakvu radnju. public void setSelected (boolean b) ukoliko je b true kvadrati e biti oznaen, inae nee biti oznaen. Inicijalno kvadrati nee biti oznaen. public void addActionListener (Object o) dodaje listener na kvadratiu za odabir.
public void setSize (int s, int v)

Primjer 11 1: Dio programa koji e na ekranu iscrtati gumbe kao na slici 11 1. Rjeenje:
... private JCheckBox nog, kos, ruk, atl; ... nog = new JCheckBox (); nog.setText ("Nogomet"); nog.setSize (80, 25); nog.setLocation (10, 10); c.add (nog);

125

kos = new JCheckBox (); kos.setText ("Koarka"); kos.setSize (80, 25); kos.setLocation (10, 40); c.add (kos); ruk = new JCheckBox (); ruk.setText ("Rukomet"); ruk.setSize (80, 25); ruk.setLocation (10, 70); ruk.setEnabled (false); c.add (ruk); atl = new JCheckBox (); atl.setText ("Atletika"); atl.setSize (80, 25); atl.setLocation (10, 100); atl.setSelected (true); c.add (atl); ...

Kruii za odabir opcija


Osim kvadratia o kojima smo upravo govorili za odabir moemo koristiti i kruie. Kruie emo u pravilu koristiti u sluajevima kada emo trebati od ponuenih opcija odabrati tono jednu.

Slika 11 2: Primjer kruia za odabir opcija Kruie za odabir kreirat emo koristei klasu JRadioButton. Najee metode koje emo koristiti pri radu s kruiima za odabir su: definira veliinu kruia i podruja za tekst koje se ispisuje pokraj njega. Krui je uvijek iste veliine, bez obzira na definiranu veliinu. public void setLocation (int x, int y) definira poziciju kruia na Containeru. public void setText (String s) definira tekst koji e se ispisati pokraj kruia za odabir. public String getText () vraa tekst koji je upisan pokraj kruia za odabir public void setEnabled (boolean b) ukoliko je b postavljen na true krui e biti aktivan i moi e se oznaiti (odznaiti), inae e biti neaktivan i neemo nad njim napraviti nikakvu radnju. public void setSelected (boolean b) ukoliko je b true krui e biti oznaen, inae nee biti oznaen. Inicijalno krui nee biti oznaen. public void addActionListener (Object o) dodaje listener na krui za odabir.
public void setSize (int s, int v)

Primjer 11 2: Dio programa koji e na ekranu iscrtati gumbe kao na slici 11 2. Rjeenje:
...

126

Java i objektno orijentirano programiranje


private JRadioButton m, z; ... m = new JRadioButton (); m.setText ("Muki"); m.setSize (80, 25); m.setLocation (10, 10); m.setSelected (true); c.add (m); z = new JRadioButton (); z.setText ("enski"); z.setSize (80, 25); z.setLocation (10, 40); c.add (z); ...

Pokusamo li u gornjem primjeru oznaiti samo enski spol, nee nam ba poi za rukom, to god napraviti bit e oznaen i Muki spol. Najee to nee biti ono to elimo. Najee emo htjeti oznaiti samo jedan od gumbova. Kako to ne bismo morali programirati moemo koristiti jedan poseban element kojim emo grupirati gumbe i na taj nain omoguiti oznaavanje samo jednog od gumba. Radi se o elementu koji nee biti vidljiv na samom prozoru, a kreirat emo ga koristei klasu ButtonGroup. Jedina metoda klase ButtonGroup koju emo koristiti je:
public void add (Object o)

dodaje gumb na grupu gumba, pri emu je o krui ili

pravokutnik za odabir. Primjer 11 3: Izmijenimo prethodni primjer tako da gumbe grupiramo te na taj nain omoguimo da u svakom trenutku moe biti oznaen samo jedan gumb. Rjeenje:
... private JRadioButton m, z; private ButtonGroup b; ... m = new JRadioButton (); m.setText ("Muki"); m.setSize (80, 25); m.setLocation (10, 10); m.setSelected (true); c.add (m); z = new JRadioButton (); z.setText ("enski"); z.setSize (80, 25); z.setLocation (10, 40); c.add (z); b = new ButtonGroup (); b.add (m); b.add (z); ...

127

Podruja za tekst
Do sada smo se upoznali s okvirom za tekst. Za razliku od okvira za tekst, koji emo koristiti za unos manje koliine teksta (ime, prezime, naslov,...), za unos vee koliine teksta koristit emo tzv podruja za tekst.

Slika 11 3: Primjer podruja za tekst Podruje za tekst kreirat emo pomou klase JTextArea. Najee metode koje emo koristiti pri radu s klasom JTextArea su:
public void setSize (int s, int v) definira veliinu podruja za public void setLocation (int x, int y) definira poziciju

tekst. podruja za tekst na

Containeru.
public void setText (String s) definira tekst koji e biti upisan u podruju za tekst. public String getText () vraa tekst koji je upisan u podruje za tekst. public void setEditable (boolean b) ukoliko je b postavljen na true u podruje za tekst

e se moi unositi tekst te ga mijenjati, inae e podruje za tekst biti neaktivno i neemo na njemu moi nitanapraviti. public void addActionListener (Object o) dodaje listener na podruje za tekst.

128

Java i objektno orijentirano programiranje

Trake za pomicanje
Napravimo li podruje za tekst na nain na koji smo to nauili u prethodnom primjeru malo emo se iznenaditi. Naviknuli smo da kada se jednom podruje za tekst popuni, pojavljuju se trake za pomicanje teksta gore dolje odnosno lijevo desno. Ovdje ih medutim nema. Da bi se trake za pomicanje teksta pojavile oko podruja za tekst, moramo ih eksplicitno postaviti. Kao i za bilo koji drugi element grafikog korisnikog suelja i za njih postoji posebna klasa koja ih generira. Klasa koja e generirati trake za pomak je JScrollPane (objekt o), pri emu je o objekt oko kojega postavljamo trake za pomicanje. Najee metode koje emo koristiti pri radu s klasom JScrollPane su:
public void setSize (int s, int v) definira veliinu traka za pomicanje. public void setLocation (int x, int y) definira poziciju podruja

za tekst na

Containeru. Primjer 11 4: Kreirajmo podruje za tekst oko kojega e se nalaziti trake za pomak. Rjeenje:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class poglavlje11 extends JFrame { private final int sirina = 220; private final int visina = 200; private Container c; private JScrollPane p; private JTextArea ta; public poglavlje11() { setTitle ("Editor"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (new GridLayout (1, 1)); ta = new JTextArea (); p = new JScrollPane (ta); c.add (p); setVisible (true); } public static void main (String[] s) { poglavlje11 z = new poglavlje11 (); } }

129

Primjetimo da kada oko nekog elementa dodajemo trake za pomicanje, onda taj element ne trebamo posebno dodavatai na Container, ve ga dodajemo automatski s trakama za pomicanje.

Padajue liste
Padajue liste emo koristiti kada trebamo odabrati jednu od opcija. Opcije se pojavljuju klikom na gumb s desne strane padajue liste.

Slika 11 4: Primjer padajue liste Padajuu listu na ekranu generirat e klasa JOptionPane. Opcije padajue liste mogue je dodati automatski pri kreiranju instance klase JOptionPane. Odnosno, jedan od konstruktora klase JOptionPane ima prametar tipa Object[ ], a koji predstavlja opcije koje e se inicijalno pojaviti nakon kreiranja instance klase JOptionPane. Mi emo najee u padajuu listu dodavati tekst kao opcije pa e umjesto Object [ ] pisati String [ ]. Isto tako klasa JOptionPane ima jos i niz drugih metoda. Neke od njih su:
public void setSize (int s, int v) definira veliinu padajue liste. public void setLocation (int x, int y) definira poziciju padajue liste na Containeru. public void setSelectedIndex (int n) opcija s rednim brojem n e biti inicijalno

oznaena.
public public public public void setSelectedItem (Object o) opcija s e biti inicijalno oznaena int getSelectedIndex () vraa redni broj oznaene opcije. object getSelectedItem () vraa oznaenu opciju. void setEnabled (boolean b) ukoliko je b postavljen na true padajua

lista e biti

aktivna, inae e biti neaktivan i neemo nad njom moi napraviti nikakvu radnju. public void addItem (object o) dodaje opciju o na padajuu listu. public void addActionListener (Object o) dodaje listener na padajuu listu. Primjer 11 5: Dio programa koji e kreirati padajuu listu ije e stavke biti nazivi prvih 5 mjeseci u godini. Rjeenje: ...
private JComboBox cb; private String[] mjeseci = {"Sijeanj", "Svibanj"}; ... cb = new JComboBox (mjeseci); cb.setLocation (10, 150); "Veljaa", "Oujak", "Travanj",

130

Java i objektno orijentirano programiranje


cb.setSize (100, 25); cb.setSelectedIndex (3); cb.addActionListener (this); cb.addItem ("..."); c.add (cb); ...

Izbornici
Izbornike moemo vidjeti u gotovo svim desktop aplikacijama. Pogodni su jer zauzimaju vrlo malo prostora pri vrhu prozora te na taj nain poveavaju podruje radne povrine programa. Za kreiranje izbornika koristit emo nekoliko klasa:
JMenuBar za kreiranje izbornike trake, koja se nalazi pri vrhu prozora JMenu za kreiranje glavnih izbornika na izbornikoj traci (File, Edit,...) JMenuItem za krieranje podstavki unutar glavnih izbornika (npr. unutar izbornika File najee se nalazi podstavke Save, Open,...)

Izborniku traku stavljamo direktno na prozor (JFrame) i za to koristimo metodu setJMenuBar klase JFrame. Konstruktor klase JMenu ima jedan parametar i to je tekst koji e se ispisati na glavnom izborniku. Glavne izbornike na izborniku traku dodajemo metodom add klase JMenuBar. Podstavke unutar glavnog izbornika kreirat emo kreirajui instancu klase JMenuItem. Jedan od konstruktota klase JMenuItem kao parametar ima string koji u stvari predstavlja tekst koji e biti ispisan na podstavci. Podstavku emo na glavni izbornik dodati metodom add klase JMenu. Obino se odabirom neke stavke unuta izbornika dogodi neka akcija, stoga emo nad stavkaka unutar izbornika pozivati metode addActionListener, na nain kao to smo to radili nad drugim elementima. Glavni izbornici i stavke unutar glavnih izbornika bit e poslagani onim redosljedom kako ih dodajemo odgovarajuim add metodama. Primjer 11 6: Unutar prozora kreirajmo izborniku traku koja e sadravati dva glavna izbornika: Dokument i Ureivanje. Unutar izbornika Dokument trebaju se nalaziti stavke: Novi, Spremi, Otvori i Kraj; unutar izbornika Ureivanje trebaju se nalaziti stavke: Oznai sve, Izrei, Kopiraj i Zalijepi.

Rjeenje:
... mb = new JMenuBar (); setJMenuBar (mb); dokument = new JMenu ("Dokument"); mb.add (dokument); uredivanje = new JMenu ("Ureivanje");

131

mb.add (uredivanje); novi = new JMenuItem ("Novi"); dokument.add (novi); spremi = new JMenuItem ("Spremi"); dokument.add (spremi); otvori = new JMenuItem ("Otvori"); dokument.add (otvori); kraj = new JMenuItem ("Kraj"); dokument.add (kraj); oznaci = new JMenuItem ("Oznaci sve"); uredivanje.add (oznaci); kopiraj = new JMenuItem ("Kopiraj"); uredivanje.add (kopiraj); izrezi = new JMenuItem ("Izrezi"); uredivanje.add (izrezi); zalijepi = new JMenuItem ("Zalijepi"); uredivanje.add (zalijepi); ...

132

Java i objektno orijentirano programiranje

133

12
Unos i ispis podataka
Streamovi Standardni ulaz i izlaz Tekstualne datoteke

134

Java i objektno orijentirano programiranje

Streamovi
Jedna od osnovnih pretpostavki programa je da na osnvu ulaznih podataka u konanom broju koraka daju ispravne izlazne rezultate. Unositi podatke u program te prikazivati rezultate mogue je na razliite naine. Mi smo u poetku podatke unosili prosljeivanjem vrijednosti parametara metodama kroz BlueJ razvojno okruenje. U posljednjem smo poglavlju nauili kako kreirati grafiko korisniko suelje u Javi, te smo programima vrijednosti prosljeivali kroz elemente grafikog korisnikog suelja (najee okvire za tekst). Rezultate obrade smo isto tako prikazivali kroz elemente BlueJ razvojnog okruenja ili na nekom elementu grafikog korisnikog suelja. U praksi je unos podataka i prikaz rezultata obrade preko elemenata grafikog korisnikog suelja uistinu vrlo est. Ne tako davno, dok jo nisu postojali moderni operativni sustavi s grafikim korisnikim sueljima programi su se pokretali iz tzv. komandnog prompta. Na isti su se nain prosljeivali i ulazni podaci takvim programima (slika 12 1). Rezultati su se takoer ispisivali u komandoj liniji. Takve programe moemo pisati i danas i zovemo ih konzolnim programima.

Slika 12 1: Program s tekstualnim korisnikim sueljem Meutim isto tako se nerijetko podaci, koji su predmet obrade uzimaju iz prethodno definiranih dokumenata ili tablica baza podataka. Rezultati obrade se isto tako mogu pohranjivati u datoteke ili baze podataka i kao takvi mogu posluiti kao ulazni podaci za neke druge programe,... Podatke je isto tako mogue dobivati iz nekog specijalnog mjernog ureaja (termometar,...) s drugih raunala koristei raunalne mree,... U nastavku emo se baviti konzolnim programima koji s podacima manipuliraju pomou komandnog prompta, odnosno programima koji podatke unose iz datoteka ili rezultate obrade spremaju u datoteke. Neto kasnije emo dati i primjere kako razmjenjivati podatke s drugim raunalima putem raunalne mree te kako komunicirati s bazama podataka. Za unos odnosno ispis podataka najee se koriste streamovi. Stream predstavlja bilo koji izvor s kojeg moemo uzimati ili na koji moemo stavljati podatke. U javi postoje dva osnovna tipa streamova streama:
bajtovni stream znakovni stream 135

Bajtovni streamovi Bajtovni streamovi nam omoguavaju jednostavan unos odnosno ispis bajtova. Rad s bajtovnim streamovima omoguavaju nam dvije osnove klase: InputStream za unos bajtova OutputStream za ispis bajtova Klasa InputStream i sve klase koje ju nasljeuju ima metodu read () koja uitava sljedei bajt s ulaza. S obzirom da read () uzima bajt s ulaza, ova metoda vraa tip podataka integer. Isto tako klasa OutputStream i sve klase koje ju nasljeuju ima metodu write () za ispis jednog bajta. Znakovni streamovi Znakovne streamove koristimo za unos i ispis znakova. Za rad s znakovnim streamovima definirane su dvije klase:
Reader Writer

Osim ovih dviju osnovnih klasa definirano je jo i niz drugih klasa koje ih nasljeuje. Klasa Reader i sve klase koje ju nasljeuju imaju metodu read () za unos jednog znaka. Isto tako klasa Writer i sve klase koje ju nasljeuju imaju metodu write () za ispis jednog znaka. Sve navedene klase za rad sa streamovima nalaze se u paketu java.io.*, te se moraju ukljuiti u progam naredbom import.

Standardni ulaz i izlaz


Svi programi u Javi inicijalno imaju ukljen paket System. Unutar tog paketa izmeu ostaloga nalaze se tri stream varijable koje su nam trenutno bitne. Radi se o svojstvima: in, out, err. Sva tri svojstva definirana su kao public i static, to znai da im moemo pristupati direktno bez kreiranja objekta tipa System. System.in se odnosi na standardni ulaz koji je u principu tipkovnica. System.out je standardni izlazni stream, inicijalno je to konzola (komandna linija). System.err je standardni stream za rad s grekama, inicijalno je to i ovdje konzola. System.in je tipa InputStream, dok su System.out i System.err tipa PrintStream. Kao to moemo primijetiti radi se o bajtovnim streamovima koji se najee koriste za unos podataka s konzole i ispis na konzolu. Uitavati podatke bajt po bajt nas nee previe usreiti. U tom trenutku u pomo dolazi klasa BufferedReader. Pojednostavljeno reeno, klasa BufferedReader moguava unoenje itavih linija teksta s ekrana, to e nam uvalike olakati unos podataka. Konstruktor klase BufferedReader je oblika BufferedReader (Reader r). Kao to znamo, na System.in je tipa InputStream, a ne Reader, meutim i za to se je netko pobrinuo. System.in emo transformirati u Reader koristei InputStreamReader. Pojednostavljeno reeno, elimo li kreirati objekt koji e nam omoguiti itanje linija teksta sa standardnog ulaza, to emo napraviti na sljedei nain:

136

Java i objektno orijentirano programiranje


BufferedReader br = new BufferedReader (new InputStreamReader (System.in))

Izvravanjem navedenog dijela koda bit e kreiran objekt br koji e biti znakovni stream, a omoguit e nam unos podataka sa standardnog ulaza. Za unos jednog reda teksta sa standardnog ulaza koristit emo metodu readLine () klase BufferedReader. Ispis podataka na standardni izlaz znatno je jednostavniji. Ispis nam omoguavaju metode: public void print (String s) ispisuje string s na standardni izlaz i toku umetanja (kursor) ostavlja u istom redu, tako da sljedei ispis zapoinje neposredno iza ispisanog stringa public void println (String s) ispisuje string s na standardni izlaz i toku umetanja (kursor) premjeta u novi red, tako da sljedei ispis zapoinje u novom redu. Primjer 12 1: Napiimo konzolni program koji e unositi dva broja sa standardnog ulaza i ispisivati njihov zbroj na standardni izlaz. Rjeenje:
import java.io.*; public class Zbroj { public static void main (String[] s) { try { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); String tmp; System.out.print ("Unesi prvi broj: "); tmp = br.readLine (); int a = Integer.parseInt (tmp); System.out.print ("Unesi drugi broj: "); tmp = br.readLine (); int b = Integer.parseInt (tmp); int c = a + b; System.out.println ("Zbroj brojeva " + a + " i " + b + " je " + c); } catch (Exception e) { System.out.println (e.getMessage ()); } } }

Dani program emo izvriti na sljedei nain: pokrenut emo komandni prompt, najlake emo to napraviti tako da kliknemo na gumb Start, te odaberemo Run. U okvir koji se pojavi upiemo cmd te kliknemo na gumb OK, otvorit e se komandni prompt, kao na slici 12 2.

137

Slika 12 2: Komandni prompt premjestimo se na disk i u mapu gdje nam se nalazi klasa Zbroj, npr, ako se nalazi u D:\Java pisat emo: >d: >cd Java upisat emo: >java Zbroj Napomena: Ovdje je bitno voditi rauna o velikim i malim slovima kod imena klase. Ako se npr. klasa zove Zbroj, a mi smo upisali npr. java zbroj, doi e do greke.
unosit emo podatke kako se od nas trai

Slika 12 3: Izvravanje programa Zbroj iz komandnog prompta

138

Java i objektno orijentirano programiranje

Tekstualne datoteke
U nastavku emo nauiti kako rezultate obrade, odnosno podatke openito spremiti u datoteke te ih naknadno proitati i s njima raditi. Za itanje i pisanje podataka u datoteke postoji nekoliko klasa, mi emo koristiti sljedee:
FileReader za uitavanje podataka iz datoteke FileWriter za spremanje podataka u datoteku.

itanje podataka iz datoteka Kao to smo ve rekli za itanje podataka iz tekstualnih datoteka koristit emo klasu FileReader. Prilikom kreiranja instance klase FileReader kao parametar konstruktora moemo proslijediti puni naziv datoteke iz koje emo itati podatke (ukljuujui i put do datoteke). U tom sluaju e kreiranje instance klase FileReader imati sljedei oblik:
FileReader fin = new FileReader ("naziv_datoteke")

npr. ako je datoteka spremljena na disku D pod nazivom podaci.txt, tada e konstruktor imati oblik:
FileReader fin = new FileReader ("d:\\podaci.txt");

Napomena: Primijetimo da smo kod naziva datoteke koristili \\ a ne \ koji inae koristimo za oznaavanje puta do neke mape. Razlog tome jest injenica da se znak \ koristi za oznaavanje posebnih znakova (vidi poglavlje 2.). Da bismo mogli itati podatke iz neke datoteke ta datoteka uistinu mora postojati na definiranoj lokaciji. Ukoliko datoteka ne postoji pojavit e se odgovarajua greka. Kako bismo izbjegli pojavljivanje greaka dio programa koji ita podatke iz datoteke uvijek emo staviti u try/catch blok. FileReader je znakovni stream, te emo stoga za itanje jednog znaka koristit metodu read (). Svaki puta kada se pozove, metoda read () iz datoteke proita sljedei znak i vraa njegovu odgovarajuu cjelobrojnu vrijednost (kd). Kd znaka emo konvertirati u znak tako da napravimo konverziju cjelobrojnog tipa (int) u znakovni (char), odnosno da napravimo cast tipova. Primjer 12 2: Napiimo program koji e kreirati prozor s jednim okvirom za tekst. Uitavanjem programa se u okvir za tekst treba prepisati tekst iz tekstualne datoteke tekst.txt. Rjeenje:
import javax.swing.*; import java.awt.*; import java.io.*; public class Prijepis extends JFrame { private final int sirina = 220;

139

private final int visina = 100; private Container c; private JTextField t; public Prijepis() { setTitle ("Prijepis"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null); String s = ""; int i; try { FileReader fin = new FileReader ("d:\\tekst.txt"); do { i = fin.read (); s = s + (char) i; } while (i != -1); } catch (Exception e) { s = ("Dokument ne postoji"); } t = new JTextField (); t.setSize (200, 25); t.setLocation (5, 20); t.setText (s); c.add (t); setVisible (true); } public static void main (String[] s) { Prijepis p = new Prijepis (); } }

Ukoliko smo u tekstualni dokument text.txt upisali sljedei sadraj:

pokretanjem programa emo na ekranu dobiti sljedee:

140

Java i objektno orijentirano programiranje

itanje teksta iz ulazne datoteke znak po znak nije neto to e nas uiniti sretnim, puno vie bi nas usreila mogunost itanja rijei po rijei ili itavog retka iz datoteke. U tu svrhu emo i ovdje koristiti klasu BufferedReader i njenu metodu readLine (), koja vraa string koji sadri uitani redak iz datoteke. Slino kao kod standardnog unosa, konstruktoru klase BufferedReader proslijedit emo parametar koji je tipa FileReader a predstavlja dokument iz kojeg emo itati podatke. Primjer 12 3: Izmijenimo prethodni primjer (12 2) tako da proita cijeli redak te proitani string zapie u odgovarajui okvir za tekst. Rjeenje:
import javax.swing.*; import java.awt.*; import java.io.*; public class Prijepis extends JFrame { private final int sirina = 220; private final int visina = 100; private Container c; private JTextField t; public Prijepis() { setTitle ("Prijepis"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null); String s = ""; try { FileReader fin = new FileReader ("d:\\tekst.txt"); BufferedReader redak = new BufferedReader (fin); s = redak.readLine (); } catch (Exception e) { s = ("Dokument ne postoji"); } t = new JTextField (); t.setSize (200, 25); t.setLocation (5, 20); t.setText (s); c.add (t); setVisible (true); } public static void main (String[] s) {

141

Prijepis p = new Prijepis (); } }

Napomena: Budui da objekt fin, koji je instanca klase FileReader koristimo samo kao parametar konstruktora klase BufferedReader, ovdje smo, kao to smo to radili kod standardnog unosa, mogli izostaviti njegovo kreiranje. Stoga smo dio programa:
FileReader fin = new FileReader ("d:\\tekst.txt"); BufferedReader redak = new BufferedReader (fin);

mogli zamijeniti sa:


BufferedReader redak = new BufferedReader (new FileReader ("d:\\tekst.txt" ));

Spremanje podataka u datoteke Za spremanje podataka u tekstualne dokumente koristit emo klasu FileWriter. Slino kao i kod uitavanja podataka i ovdje emo koristiti jo jednu pomonu klasu PrintWriter. Za upis podataka u tekstualne datoteke, slino kao i za upsis na standardni izlaz, koristit emo metode print (String s) i println (String s). Jedan od konstruktora klase PrintWriter ima parametar tipa FileWriter, koji predstavlja dokument u koji upisujemo podatke. Za razliku od itanja dokumenata gdje je neophodno morao postojati dokument iz kojeg itamo podatke, prilikom pisanja podataka dokument ne mora nuno postojati i u tom e se sluaju kreirati automatski, tj. kreirat emo ga kreiranjem instance klase FileWriter. Da bismo podatke koje smo upisali u dokument uistinu i spremili u taj dokument moramo pozvati metodu close () nad objektom tipa PrintWriter. Primjer 12 4: Izmijenimo prethodni primjer (12 3) tako da mu dodamo jo jedan gumb Spremi klikom na koji e se tekst iz tekstualnog okvira spremiti u tekstualni dokument. Rjeenje:
import javax.swing.*; import java.awt.*; import java.io.*; import java.awt.event.*; public class Prijepis extends JFrame implements ActionListener { private final int sirina = 220; private final int visina = 150; private Container c; private JTextField t; private JButton b; public Prijepis() { setTitle ("Prijepis"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE);

142

Java i objektno orijentirano programiranje

c = getContentPane (); c.setLayout (null); String s = ""; try { FileReader fin = new FileReader ("d:\\tekst.txt"); BufferedReader redak = new BufferedReader (fin); s = redak.readLine (); } catch (Exception e) { s = ("Dokument ne postoji"); } t = new JTextField (); t.setSize (200, 25); t.setLocation (5, 20); t.setText (s); c.add (t); b = new JButton (); b.setText ("Spremi"); b.setSize (200, 25); b.setLocation (5, 50); b.addActionListener (this); c.add (b); setVisible (true); } public void actionPerformed (ActionEvent e) { if (e.getSource () == b) spremi (); } public void spremi () { try { FileWriter fout= new FileWriter ("d:\\tekst.txt"); PrintWriter pw = new PrintWriter (fout); pw.print (t.getText ()); pw.close(); } catch (Exception e) { t.setText ("Ne mogu spremiti dokument"); } } public static void main (String[] s) { Prijepis p = new Prijepis (); } }

Napomena: Slino kao i kod upisivanja podataka u dokument, sljedei dio koda:
FileWriter fout = new FileWriter ("d:\\tekst.txt");

143

PrintWriter pw = new PrintWriter (fout);

mogli smo zamijeniti sa:


PrintWriter pw = new PrintWriter (new FileWriter ("d:\\tekst.txt" ));

144

Java i objektno orijentirano programiranje

13
Dijaloki prozori
Dijaloki prozori za otvaranje/spremanje dokumenata Poruke, potvrde i jednostavan unos Klasa Color i odabir boja Klasa Font

145

Dijaloke prozore svakodnevno susreemo u radu s raunalom. Npr. elimo li spremiti neki dokument u Wordu otvorit e nam se dijaloki prozor:

Slika 13 1: Prozor za spremanje dokumenata u OS Windows Nadalje, elimo li npr. izai iz Worda, a da prije toga nismo spremili napisani dokument otvorit e nam se dijaloki prozor:

Slika 13 2: Dijaloki prozor MS Worda Dijaloki prozori su u stvari ve gotovi prozori za neke esto koritene radnje (spremanje dokumenata, otvaranje dokumenata, ispisivanje kratkih poruka,...).

146

Java i objektno orijentirano programiranje

Dijaloki prozori za otvaranje/spremanje dokumenata


Dijaloke prozore za otvaranje i spremanje dokumenata kreirat emo posebnom klasom JFileChooser. Metode klase JFileChooser, koje emo najvie koristiti su: public int showOpenDialog (Component c) otvara dijaloki prozor za otvaranje dokumenta. Parametar c odnosi se na matinu komponentu dijalokog prozora i mi emo tu uvijek pisati this. Vrijednost koju vraa ova metoda je neka od cjelobrojnih konstanti klase JFileChooser: - JFileChooser.CANCEL_OPTION ako je pritisnut gumb Cancel - JFileChooser.APPROVE_OPTION ako je pritisnut gumb OK - JFileChooser.ERROR_OPTION ako je dolo do greke public int showSaveDialog (Component c) otvara dijaloki prozor za spremanje dokumenta. public File getSelectedFile () vraa odabrani dokument. File je posebna klasa u Javi. Dvije metode klase File koje emo najee koristiti su: public String getName () vraa naziv dokumenta public String getPath () vraa puno ime dokumenta ukljuujui i put do dokumenta. Primjer 13 1: Napiimo program koji e kreirati prozor s tri okvira za tekst i dva gumba. U okvire za tekst e se unositi ime, prezime te starost osobe, dok e na gumbima pisati Spremi i Otvori. Klikom na gumb Spremi treba se otvoriti dijaloki prozor u kojem e se odabrati ime dokumenta pod kojim e se spremiti podaci, a klikom na gumb Save dijalokog prozora podaci e se spremiti u odabrani dokument (svaki podatak u svoj red). Klikom na gumb Otvori treba se otvoriti dijaloki prozor za odabir dokumenta, a odabirom dokumenta e se podaci iz prva tri njegova reda upisati u odgovarajue okvire za tekst na prozoru. Rjeenje:
import javax.swing.*; import java.awt.*; import java.io.*; import java.awt.event.*; public class SOPodaci extends JFrame implements ActionListener { private final int sirina = 280; private final int visina = 210; private Container c; private JTextField t1, t2, t3; private JLabel l1, l2, l3; private JButton b1, b2; public SOPodaci() { setTitle ("Podaci"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null);

147

l1 = new JLabel (); l1.setText ("Ime"); l1.setSize (100, 25); l1.setLocation (5, 5); c.add (l1); t1 = new JTextField (); t1.setSize (150, 25); t1.setLocation (110, 5); c.add (t1); l2 = new JLabel (); l2.setText ("Prezime"); l2.setSize (100, 25); l2.setLocation (5, 40); c.add (l2); t2 = new JTextField (); t2.setSize (150, 25); t2.setLocation (110, 40); c.add (t2); l3 = new JLabel (); l3.setText ("Starost"); l3.setSize (100, 25); l3.setLocation (5, 75); c.add (l3); t3 = new JTextField (); t3.setSize (150, 25); t3.setLocation (110, 75); c.add (t3); b1 = new JButton (); b1.setText ("Otvori"); b1.setLocation (5, 120); b1.setSize (125, 25); b1.addActionListener (this); c.add (b1); b2 = new JButton (); b2.setText ("Spremi"); b2.setLocation (135, 120); b2.setSize (125, 25); b2.addActionListener (this); c.add (b2); setVisible (true); } public void actionPerformed (ActionEvent e) { if (e.getSource () == b1) otvori (); else spremi (); } public void spremi () {

148

Java i objektno orijentirano programiranje


try { JFileChooser fc = new JFileChooser (); if (fc.showSaveDialog (this) == JFileChooser.APPROVE_OPTION) { String fname =fc.getSelectedFile ().getPath(); FileWriter fout = new FileWriter (fname); PrintWriter pw = new PrintWriter (fout); pw.println (t1.getText ()); pw.println (t2.getText ()); pw.println (t3.getText ()); pw.close(); } } catch (Exception e) { } } public void otvori () { try { JFileChooser fc = new JFileChooser (); if (fc.showOpenDialog (this) == JFileChooser.APPROVE_OPTION) { String fname = fc.getSelectedFile().getPath(); FileReader fin = new FileReader (fname); BufferedReader redak = new BufferedReader (fin); t1.setText (redak.readLine ()); t2.setText (redak.readLine ()); t3.setText (redak.readLine ()); } } catch (Exception e) { } } public static void main (String[] s) { SOPodaci p = new SOPodaci (); } }

Poruke, potvrde i jednostavan unos


Kreiranje dijalokih prozora koji e korisniku omoguiti unos vrijednosti, ispisati poruke upozorenja,... omoguit e nam metode klase JOptionPane. Klasa JOptionPane ima ukupno etiri metode za prikaz dijalokih prozora:

showMessageDialog showConfirmDialog showInputDialog showOptionDialog

Sve navedene metode su static metode, to znai da emo ih pozivati na razini klase JOptionPane.

149

Navedene metode dolaze s nekoliko opcionalnih parametara:


roditeljska komponenta naziv prozora koji iz kojeg se otvara dijaloki prozor, mi emo najee kao ovaj parametar koristiti this; poruka tekst poruke koja e biti ispisana na prozoru; naslov tekst koji e se ispisati na naslovnoj traci prozora; opcije jedna od sljedeih kombinacije gumba: o DEFAULT_OPTION o YES_NO_OPTION o YES_NO_CANCEL_OPTION o OK_CANCEL_OPTION sliica poruke jedna od sljedeih sliica:

o o o

- QUESTION_MESSAGE - INFORMATION_MESSAGE - WARNING_MESSAGE

o - ERROR_MESSGE niz objekata najee se radi o stringovima koji su u stvari tekstovi na gumbima kod nekih vrsta dijalokih prozora; oznaeni objekt jedan od objekata, iz prijanjih parametara, koji e biti inicijalno oznaen. Nazivi parametara opcija i sliica prozora su u stvari cjelobrojne konstante klase JOptionPane. Kao i same metode, ove parametre emo pozivati direktno iz klase, dakle ispred imena parametra pisat emo JOptionPane. Metoda showMessageDialog ShowMessageDialog metodu koristit emo kada za kreiranje najjednostavnijeg oblika dijalokog prozora, u sluajevima kada korisniku elimo prikazati prozor s jednostavnom porukom (obavijest, upozorenje, poruka o greci,...). Na prozoru se uvijek nalazi samo jedan gumb i to je gumb OK. Metodu moemo pozvati na vie najina, najee koriteni su: void showMessageDialog Object poruka); ili void showMessageDialog (Component roditeljska_komponenta, Object poruka, String naslov, int opcije, int sliica_poruke); Kao to je i za pretpostaviti u prvom emo sluaju dobiti prozor kojem emo specificirati samo poruku, dok e sliica i naslov biti inicijalni. Naslov e u tom sluaju biti Message, dok e sliica poruke biti . (Component roditeljska_komponenta,

Npr. izvravanjem metode:

150

Java i objektno orijentirano programiranje

JOptionPane.showMessageDialog (this, "Ja sam dijaloski prozor");

na ekranu e biti prikazan sljedei prozor:

Primijetimo da smo isti prozor na ekranu mogli dobiti i na sljedei nain:


JOptionPane.showMessageDialog (this, "Ja sam dijaloski prozor", "Message", JOptionPane.INFORMATION_MESSAGE);

Metoda showConfirmDialog Metodu showConfirmDialog koristimo u sluajevima kada elimo da korisnik potvrdi ili poniti neku akciju. Npr. kod brisanja dokumenta u operativnom sustavu Windows pojavit e se sljedei gumb:

Slika 13 3: Dijaloki prozor Confirm Ovdje se radi o tzv. Confirm prozoru. Ukoliko korisnik klikne na gumb Yes dokument e biti izbrisan, inae, ukoliko klikne na gumb No dijaloki prozor e se zatvoriti a dokument nee biti izbrisan. Kao i metoda showMessageDialog i showConfirmDialog moe dolaziti s razliitim brojem parametara, najee varijante poziva ove metode su: int showConfirmDialog Object poruka); ili int showMessageDialog (Component roditeljska_komponenta, Object poruka, String naslov, int opcije); ili (Component roditeljska_komponenta,

151

int showMessageDialog (Component roditeljska_komponenta, Object poruka, String naslov, int opcije, int sliica_poruke); Inicijalni naslov ovog dijalokog prozora je: Select an option; inicijalna sliica poruke je: e, ako drugaije nije odreeno na prozoru biti tri gumba: Yes, No i Cancel. , dok

Budui da ovaj dijaloki prozor nudi korisniku da odabere jednu od opcija, klikom na odgovarajui gumb, razumno je postaviti si pitanje: a kako emo znati na koji je gumb korisnik kliknuo? U tu svrhu metoda showMessageDialog vraa cjelobrojnu vrijednost koja je u stvari oznaka gumba na koji je korisnik kliknuo. Ve smo prije rekli da je svaka kombinacija gumba koja se moe pojaviti na prozoru (YES_NO_OPTION,...) u stvari cjelobrojna konstanta. Isto tako postoje cjelobrojne konstante za gumbe: OK Yes No Cancel OK_OPTION 0 YES_OPTION 0 NO_OPTION 1 CANCEL_OPTION 2 Tablica 13 1: Gumbi i odgovarajue konstante

To znai da emo metodu showConfirmDialog u programima pozivati npr. na sljedei nain:


int n = JOptionPane.showConfirmDialog (this, "Jeste li sigurni?"); if (n == JOptionPane.YES_OPTION) //kod ako je pritisnut gumb OK else if (n == JOptionPane.NO_OPTION) //kod ako je pritisnut gumb NO else //kod ako je pritisnut gumb Cancel

Metoda showInputDialog Metodu showInputDialog koristit emo kada od korisnika traimo unos neke jednostavne vrijednosti. Za razliku od svih dosadanjih dijalokih prozora, ovaj prozor ima jo i okvir za unos teksta.

Slika 13 4: Dijaloki prozor input

152

Java i objektno orijentirano programiranje Kao i sve prijanje, metoda showInputDialog je preoptereene (overloadana) te dolazi u vie varijanti, najee su: String showInputDialog (Component roditeljska_komponenta, Object poruka); String showInputDialog (Component roditeljska_komponenta, Object poruka, String naslov, int sliica_poruke); String showInputDialog (Component roditeljska_komponenta, Object poruka, String tekst); pri emu je tekst inicijalna poruka koja e se pojaviti u okviru za tekst Hm, a to je s tekstom koji smo unijeli u okvir za tekst? Imalo bi smisla nekako doi do njega. U tu svrhu metoda showInputDialog vraa string i taj string je u stvari tekst koji je unesen u okvir za tekst. Stoga emo ovu metodu najee koristiti na sljedei nain:
String poruka = JOptionPane.showInputDialog tekueg rauna:"); (this, "Unesite broj svog

Metoda showOptionDialog Ova metoda programeru omoguava prilagoavanje izgleda prozora. Tako je mogue na gumbe dodati vlastiti tekst, izmijeniti sliicu prozora,... Jedina varijanta poziva ove metode je: int showOptionDialog (Component roditeljska_komponenta, Object poruka, String naslov, int opcije, int sliica_poruke, ImageIcon proizvoljna_sliica, Object[] proizvoljne_opcije, Object inicijalna_opcija); Prvih est parametara su standardni parametri i susreli smo ih kod prethodnih vrsta dijalokih prozora, dok preostala 3 redom predstavljaju:

proizvoljna sliica ukoliko nam niti jedna od postojeih sliica poruke (QUESTION_MESSAGE, ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE) ne odgovara, moemo kao sliicu poruke postaviti neku svoju proizvoljnu sliicu. Slica je u stvari objekt tipa ImageIcon. Jedan od konstruktora klase ImageIcon ima parametar ime slike, koju elimo dodijeliti objetku. Ime slike obuhvaa itav put do slike, npr. D:\Java\slika.jpg; proizvoljne opcije na ovaj nain je mogue definirati vlastiti tekst na gumbima. Proizvoljne opcije su u stvari niz objakata, koji su u stvari stringovi koji predstavljaju tekstove koji e biti ispisani na gumbima i to onim redom kako su poslagani u nizu. Gumbova e na dijalokom prozoru biti onoliko koliko ima proizvoljnih opcija; inicijalna opcija predstavlja proizvoljnu opciju koja e biti inicijalno oznaena.

Metoda showOptionDialog vraa redni broj gumba na kojeg je korisnik kliknuo.

153

Npr. izvravanjem sljedeeg dijela koda:


String [] tmp = {"Da", "Ne", "Ne znam"}; ImageIcon ic = new ImageIcon ("bluej-icon.gif"); int n = JOptionPane.showOptionDialog (this, "Jeste li sigurni?", "Dijaloki prozor", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, ic, tmp, tmp[1]);

rezultirat e sljedeim dijalokim prozorom:

Slika 13 5: Prilagoeni dijaloki prozor Kao to moemo primijetiti tekstovi na gumbima su definirani u nizu tmp koji ima tri elementa: stringove Da, Ne i Ne znam. Sliicu poruke smo definirali u objektu ic, koji je instanca klase ImageIcon. Sliica se nalazi u direktoriju u kojem se nalazi i aplikacija, stoga pri njenom kreiranju nije potrebno navoditi put do nje. Posljednji parametar metode showOptionDialog je tmp[1], to znai da e inicijalno biti oznaen drugi gumb (gumb na kojem pie Ne). Klikne li korisnik na gumb Da metoda e vratiti 0, klikom na Ne vratit e 1, dok e klikom na Ne znam metoda vratiti 2. Klikne li korisnik na gumb Close (u gornjem desnom vrhu prozora), metoda e vratiti -1.

Klasa Color i odabir boja


Svaka boju na ekranu mogue je dobiti kombinacijom triju osnovnih boja: crvene, zelene i plave. Mijeanjem odreenih koliina ovih triju boja moemo dobiti milijune razliitih nijansi boja. Koliina svake od ovih triju boja je cijeli broj izmeu 0 i 255. Za sada emo predstavljati boju kao trojku brojeva (r, g, b), pri emu je: r koliina crvene boje; g koliina zelene boje; dok je b koliina plave boje. U tom sluaju e npr. (255, 0, 0) biti crvena boja (maksimalno crvene, nita zelene, nita plave), (255, 255, 0) uta boja (kombinacija crvene i zelene), (0, 0, 0) crna boja, (255, 255, 255) bijela boja,... Za rad s bojama Java posjeduje klasu Color. Jedan od konstruktora klase Color je oblika: public Color (int r, int g, int b) kreira instancu boje s koliinom crvene boje r, zelene g i koliinom plave boje b. Primjerice, sljedeom naredbom:

154

Java i objektno orijentirano programiranje


Color col = new Color (0, 0, 255);

bit e kreiran objekt col koji e prestavljati plavu boju. Na ovaj nain kreiran objekt (instanca) boje moe se dodati veini elemenata grafikog korisnikog suelja (gumbima, labelama, okviru,...) kao pozadinska boja ili kao boja teksta, u tu svrhu veina elemenata grafikog korisnikog suelja ima sljedee dvije metode: void setForeground (Color c) definira boju teksta na elementu void setBackground (Color c) definira boju pozadine elementa Osim na ovaj nain, neke je boje mogue definirati i implicitno, navoenjem imena boje. U stvari se radi o static konstantama definiranim u klasi Color. Definiranjem boje na ovaj nain nije potrebno kreirati instancu klase Color ve je boju mogue definirati s Color.konstanta, pri emu je konstanta jedna od sljedeih konstanti: Color.black (0, 0, 0) Color.blue (0, 0, 255) Color.green (0, 255, 0) Color.cyan (0, 255, 255) Color.darkGray (64, 64, 64) Color.gray (128, 128, 128) Color.lightGray (192, 192, 192) Color.red (255, 0, 0) Color.magenta (255, 0, 255) Color.pink (255, 175, 175) Color.orange (255, 200, 0) Color.yellow (255, 255, 0) Color.white (255, 255, 255) Tablica 13 2: Predefinirane konstante za neke boje elimo li npr. zadati da je boja teksta na gumbu crvena, to moemo napraviti na sljedei nain:
... private JButton b; ... Color col = new Color (255, 0, 0); b.setForeground (col); ...

ili
... private JButton b; ... b.setForeground (Color.red); ...

Kombinacijom koliina crvene, zelene i plave boje, uistinu je mogue dobiti milijune boja, no na ovja nain dobiti ba onu boju koju elimo, nije niti malo jednostavno. U tu svrhu postoji dijaloki prozor za odabir boja. Klasa koja omoguava kreiranje ovakvog dijalokog prozora je JColorChooser. U osnovi nam treba samo jedna metoda ove klase, metoda showDialog,.

155

showDialog je static metoda klase JColorChooser, to znai da se poziva na razini klase. Metoda showDialog e kreirati dijaloki prozor za odabir boja i vratit e objekt tipa Color, koji predstavlja odabranu boju. Opi oblik metode showDialog je sljedei: void showDialog (Component roditeljska_komponenta, naslov, Color inicijalna_boja); Primjerice, izvravanjem dijela programa:
Color c = JColorChooser.showDialog(this, "Odaberite boju", new Color (0, 0, 0));

Object

na ekranu e se pojaviti dijaloki prozor:

Slika 13 6: Dijaloki prozor za odabir boja Kao to moemo primijetiti: u naslovnoj traci prozora je tekst "Odaberite boju", koji smo definirali kao drugi parametar metode showDialog, dok je inicijalno odabrana crna boja, to je definirano treim parametrom (new Color (0, 0, 0)), koji u stvari predstavlja crnu boju.

Klasa Font
Upravo smo nauili kako raditi s bojama, kako definirati boju teksta i pozadine na elementima GUI-a,... Razumno je zapitati se: kako definirati oblik ili veliinu znakova na nekom elementu? Naravno, programeri Jave su se pobrinuli i za to. Postoji posebna klasa Font kojom je mogue definirati veliinu, stil i oblik znakova. Konstruktor klase Font je sljedeeg oblika:
156

Java i objektno orijentirano programiranje

public Font (String oblik, int stil, int veliina); oblik je neki od naziva fontova: Arial, Courier, Garamond,... stil znakova moe biti bold, italic, plain ili kombinacija bold + italic. Za stilove su definirane posebne cjelobrojne konstante u klasi Font:

BOLD ITALIC NORMAL

Navedene konstante su static, to znai da ih moemo pozivati na razini klase. elimo li da nam znakovi budu podebljani i nakoeni, pisat emo: Font.BOLD + Font.ITALIC. veliina je prirodan broj koji predstavlja veliinu znakova u pixelima. Npr. font ija e veliina biti 20, stil bold a oblik znakova Arial definirat emo na sljedei nain:
Font f = new Font ("Arial", Font.BOLD, 20);

Font nad nekim elementom GUI-a definirat emo metodom setFont. public void setFont (Font f);

157

1. Napii program koji e na ekranu crtati prozor kao na slici. Na poetku program treba "zamisliti" sluajan prirodan broj do 100. Unosom broja u okvir za tekst i klikom na gumb OK treba se pojaviti dijaloki prozor s porukom da je traeni broj vei ili manji od unesenog, odnosno s porukom u kojem je pokuaju broj pogoen.

2. Napii program koji e na ekranu iscrtavati prozor koji e se sastojati od dva gumba (O programu i Izmijeni podatke) te jedne labele: a) Prilikom uitavanja programa se u labelu treba ispisati tekst: Ovo je x. pokretanje programa, pri emu je x broj koji se uitava iz tekstualnog dokumenta (brojac.txt) i prilikom svakog pokretanja programa se poveava za 1. b) Klikom na gumb O programu u dijalokom prozoru se trebaju ispisati podaci o autoru programa te verziji, a koji se nalaze u dokumentu podaci.txt. Ukoliko dokument ne postoji treba ispisati odgovarajuu greku u dijalokom prozoru. c) Klikom na gumb Izmijeni podatke trebaju se otvoriti dva dijaloka okvira za unos teksta (Autor i Verzija) te ukoliko su u dijaloke okvire uneseni podaci oni se trebaju spremiti u dokument podaci.txt. Ukoliko podaci nisu uneseni treba ispisati poruku o greki.

158

Java i objektno orijentirano programiranje

14
Klasa Graphics
Metode klase Graphics Crtanje grafova funkcija

159

Crtanje jednostavnih grafikih elemenata, kao to su linije, elipse, pravokutnici,... omoguit e nam metode klase Graph. Klasa Graph sadrana je u paketu java.awt.*. Sve to emo na prozoru crtati crtat emo u jednoj posebnoj metodi ije je zaglavlje oblika:
public void paint (Graphics g)

Kao to moemo primijetiti ova metoda ima kao parametar objekt g tipa Graphics, koji moemo zamisliti kao pozadinu na kojoj emo crtati. Nad objektom tipa Graphics emo pozivati odgovarajue metode za crtanje te emo na taj nain dobivati eljene slike. Metodu paint () nije potrebno eksplicitno pozivati nigdje u programu. Program sam prilikom pokretanja trai postoji li metoda paint (), te ukoliko postoji izvrava ju. Prostor za crtanje zauzima cijelu povrinu ekrana. Prostor za crtanje sastoji se od mnotva pixela (tokica). Svaki pixel ima svoje koordinate. Pixel koji se nalazi u gornjem lijevom vrhu prozora ima koordinate (0, 0), dok pixel u donjem desnom kutu ima koordinate (sirina_prozora 1, visina_prozora - 1). Na prozoru na kojem crtamo mogue je imati i sve ostale elemente grafikog korisnikog suelja. Jedini problem je to ne moemo odijeliti prozor na dio za elemente grafikog suelja i na dio za crtanje. Stoga nam se moe dogoditi da npr. linije prelaze preko gumba,... Stoga je najbolje, ukoliko je izvedivo, na prozoru na kojem crtamo ne koristiti ostale elemente grafikog korisnikog suelja. Svaki dogaaj na prozoru (resize, minimize,...) uzrokovat e ponovno izvravanje metode paint (). Isto tako je metodu paint () mogue pozvati i u svakom drugom trenutku, npr. kao odgovor na neki dogaaj na nekom od elemenata grafikog korisnikog suelja, ako ih ipak imamo na prozoru. U tom sluaju emo metodu paint () pozvati naredbom repaint (). Napomena: repaint () nikada neemo pozivati u samoj metodi paint (). To bi u stvari znailo da u metodi pozivamo samu metodu i tu bi uli u beskonano pozivanje.

160

Java i objektno orijentirano programiranje

Metode klase Graphics


Najee metode za crtanje su:
public void drawLine (int x1, int y1, int x2, int y2)

Ova metoda crta liniju od toke (x1, y1) do (x2, y2) ekrana.
public void drawRect (int x, int y, int s, int v)

Crta pravokutnik iji je gornji lijevi vrh u toki ekrana s koordinatama (x, y) dok mu je irina s a visina v.

(x, y)

s v

Slika 14 1: Pravokutnik nacrtan metodom drawLine (x, y, s, v)


public void drawOval (int x, int y, int s, int v)

Crta elipsu unutar nevidljivog pravokutnika kojem je gornji lijevi vrh u toki s koordinatama (x, y), dok mu je irina s a visina v.
(x, y) s v

Slika 14 2: Metoda drawOval ()


public void drawArc (int x, int y, int s, int v, int pk, int zk)

Crta dio luka elipse s poetnim kutom pk do kuta zk.

161

Slika 14 3: Metoda drawArc ()


public void drawPolygon (int[] x, int[] y, int n)

Crta poligon iji su vrhovi toke s koordinatama (x[0], y[0]), (x[1], y[1]),... (x[n - 1], y [n - 1]) , pri emu je n broj vrhova poligona.
(x[0], y[0])

(x[1], y[1])

(x[3], y[3])

(x[2], y[2])

Slika 14 4: Metoda drawPolygon () Navedene metode, osim drawLine () crtaju samo rub odgovarajueg lika. Analogno njima postoje metode koje crtaju odgovarajue likove ispunjene bojom: public void fillRect (int x, int y, int s, int v) crta ispunjeni pravokutnik public void fillOval (int x, int y, int s, int v) crta ispunjenu elipsu public void fillArc (int x, int y, int s, int v, int pk, int zk) crta ispunjeni dio elipse public void fillPolygon (int[] x, int[] y, int n) crta ispunjeni poligon Rekli smo kako crtati likove te kako crtati ispunjene likove, bilo bi zgodno znati kako definirati boju takvih likova. Boju bilo kojeg lika koji emo crtati definirat emo neposredno prije crtanja lika metodom:
public void setColor (Color b)

Postoji jo jedna metoda klase Graphics, koju do sada nismo spomenuli, a koju emo esto koristiti u svojim programima. Radi se o metodi:
public void drawString (String s, int x, int y)

Kao to je i za pretpostaviti, ova e metoda "crtati" string s na grafikom ekranu. Moemo zamisliti da je string zapisan unutar nevidljivog pravokutnika i u tom sluaju gornji lijevi vrh tog pravokutnika ima koordinate (x, y).
162

Java i objektno orijentirano programiranje


(x, y)

Ovo je neki tekst


Slika 14 5: Metoda drawString () Tekstu koji na ovaj nain ispisujemo, slino kao i tekstu koji ispisujemo na ostalim elementima grafikog korisnikog suelja mogue je definirati oblik, veliinu,... metodom setFont (Font f). Primjer 14 1: Napiimo program koji e na ekranu nacrtati olimpijske krugove.

Rjeenje: Na prvi pogled bismo se mogli zapitati: Kakav je problem ovo nacrtati? Uistinu kada bismo htjeli napraviti 5 krunica u odgovarajuim bojama, na odgovarajuim mjestima, uistinu ne bi bilo nikakvih problema. Meutim elimo li uistinu napraviti sliku to vie nalik na gornju susrest emo se s nekoliko problema: kao to moemo primijetiti ne radi se o krunicama ve o tzv. krunim vijencima (prstenima); kruni vijenci se meusobno isprepliu; ... Kako napraviti kruni vijenac u nekoj boji? Znamo da klasa Graphics nema niti jednu metodu kojom bismo to eksplicitno napravili. Dakle trebamo smisliti neki drugi nain. Pa vrlo jednostavno: elimo li npr. napraviti crveni kruni vijenac, jednostavno emo nacrtati crveni krug, a zatim emo napraviti njemu koncentrian bijeli krug neto manjeg radijusa. To bi bilo sasvim uredu, meutim imajmo na umu da se nai krugovi isprepliu i da emo na taj nain bijelim krugom obrisati i dio nekog drugog kruga. Dakle, ova ideja nam nije dobra. Drugi, ispravniji nain bio bi sljedei: krunicu moemo dobiti i kao pravilni n-terokut gdje je n dovoljno velik. Ve ako stavimo da je n npr. 230, dobiveni 230-kut e biti potpuno nalik na krunicu. Zato n-terokut? Pa stoga to znamo da klasa Graph ima metodu fillPoly () koja crta ispunjeni n-terokut. Mi bismo dakle htjeli napraviti n-terokut koji e u stvari izgledati kao kruni vijenac.

163

Da bismo nacrtali ovakav n-terokut, metodom fillPoly () trebaju nam koordinate vrhova n.terokuta, a za to e nam trebati malo matematike:
(x, y)

r * sin ()

(xs, ys) r * cos ()

Dakle, ako je (xs, ys) "sredite" n-terokuta, tada emo vrhove dobivati tako da mijenjamo veliinu kuta , te e toka (x, y) koja je vrh n-terokuta u tom sluaju imati koordinate: x = xs + r * cos () y = ys r * sin () Sada samo u stanju nacrtati n-terokut, meutim, zaboravili smo na jo jedan problem, a to je injenica da se kruni vijenci preklapaju. Upravo zbog toga neemo moi sliku napraviti pomou itavih krunih vijenaca. Stoga emo napisati metodu koja e pomou n-terokuta crtati samo dio krunog vijenca.

164

Java i objektno orijentirano programiranje

Metoda koja e crtati dio krunog vijenca, sa sreditem u toki (xs, ys), radijusom vee krunice r1, te radijusom manje krunice r2 od kuta pk do kuta zk je:
public void drawVijenac (Graphics g, int xs, int ys, int r1, int pk, int zk) { int[] x = new int [500]; int[] y = new int [500]; int i = 0, k = pk; //koordinate vrhova "veeg" n-terokuta while (k <= zk) { x [i] = (int) (xs + Math.cos (k / 180.0 * Math.PI) * y [i] = (int) (ys - Math.sin (k / 180.0 * Math.PI) * i++; k += 2; } //koordinate vrhova "manjeg" n-terokuta k-=2; while (k >= pk) { x [i] = (int) (xs + Math.cos (k / 180.0 * Math.PI) * y [i] = (int) (ys - Math.sin (k / 180.0 * Math.PI) * i++; k -= 2; } g.fillPolygon (x, y, i); } r2, int

r1); r1);

r2); r2);

Nakon to smo napisali ovu metodu, samo crtanje traene slike bit e jednostavno:
import java.awt.*; import javax.swing.*; public class Olympic extends JFrame { public Olympic() { setTitle ("Olimpijski krugovi"); setSize (550, 350); setDefaultCloseOperation (EXIT_ON_CLOSE); setBackground (Color.white); setVisible (true); }

public void drawVijenac (Graphics g, int xs, int ys, int r1, int r2, int pk, int zk) { int[] x = new int [500]; int[] y = new int [500]; int i = 0, k = pk; while (k <= zk)

165

{ x [i] = (int) (xs + Math.cos (k / 180.0 * Math.PI) * r1); y [i] = (int) (ys - Math.sin (k / 180.0 * Math.PI) * r1); i++; k += 2; } k-=2; while (k >= pk) { x [i] = (int) (xs + Math.cos (k / 180.0 * Math.PI) * r2); y [i] = (int) (ys - Math.sin (k / 180.0 * Math.PI) * r2); i++; k -= 2; } g.fillPolygon (x, y, i); } public void paint (Graphics g) { g.setColor (Color.blue); drawVijenac (g, 150, 150, 52, g.setColor (Color.yellow); drawVijenac (g, 205, 200, 52, g.setColor (Color.blue); drawVijenac (g, 150, 150, 52, g.setColor (Color.black); drawVijenac (g, 260, 150, 52, g.setColor (Color.yellow); drawVijenac (g, 205, 200, 52, g.setColor (Color.green); drawVijenac (g, 315, 200, 52, g.setColor (Color.black); drawVijenac (g, 260, 150, 52, g.setColor (Color.red); drawVijenac (g, 370, 150, 52, g.setColor (Color.green); drawVijenac (g, 315, 200, 52, }

44, 0, 360); 44, 0, 360); 44, -20, 20); 44, 0, 360); 44, 70, 90); 44, 0, 360); 44, -20, 20); 44, 0, 360); 44, 70, 90);

public static void main (String[] s) { Olympic ol = new Olympic (); } }

Napomena: Primijetimo da je metoda drawVijenac () kao parametar izmeu ostaloga imala i objekt tipa Graphics. Naime, radi se o injenici objekt g, instanca klase Graphics postoji samo u metodi paint (). Da bismo mu mogli pristupiti iz neke druge metode, moramo ga toj metodi proslijediti kao parametar. Jeste li znali: Olimpijski krugove kao simbol olimpijskih igara kreirao je Baron Pierre de Coubertin 1913 godine. Pet krugova simboliziraju pet kontinenata na modernim olimpijskim igrama: Azija, Europa, Oceanija, Sjeverna Amerika i Juna Amerika. Zastava svake zemlje, s nekog od kontinenata, ima najmanje jednu od boja olimpijskih krugova. Boje krugova idui od lijeva na desno su: plava, uta, crna, zelena i crvena.

166

Java i objektno orijentirano programiranje

Crtanje grafova funkcija


Sa grafom funkcije po prvi se puta susreemo ve u matematici viih razreda osnovne kole. U nastavku emo nauiti kako crtati grafove funkcija u Javi. Kao to znamo, graf funkcije f u pravokutnom koordinatnom sustavu je skup toaka (x, f (x)), pri emu je x bilo koja toka domene, dok je f (x) vrijednost funkcije f u toki x. Promotrimo to sa aspekta programiranja. Mi bismo mogli graf funkcije prikazivati u jednom prozoru. Sredite toga prozora bilo bi ishodite koordinatnog sustava. Nadalje nam trebaju koordinatne osi, to mogu biti dvije duine paralelne s rubovima prozora te nam treba jedinina duljina, za koju moemo uzeti da je npr. 20 pixela. Kao to smo rekli graf funkcije f je skup toaka (x, f (x)) pravokutnog koordinatnog sustava. Dakle, da bismo u naem koordinatnom sustavu na prozoru, nacrtali graf funkcije, uzimat emo neke toke iz domene funkcije (toke s x osi) i za odgovarajuu toku domene raunat emo vrijednost funkcije te emo na prozoru nacrtati toku. U reenom treba uoiti nekoliko bitnih injenica: nema smisla uzimati bilo koje toke domene (toke s x osi), treba uzimati samo one koje su vidljive na ekranu; to uzmemo vie toaka domene (s vidljivog dijela ekrana) to e graf funkcije biti precizniji; rekli smo da je ishodite koordinatnog sustava, toka s koordinatama (0, 0) sredite ekrana, a s druge strane znamo da se toka prozora s koordinatama (0, 0) nalazi u gornjem lijevom kutu. Kako emo mi za crtanje koristiti metode klase Graphics, koje raspoznaju samo koordinate ekrana, a ne nikakvog naeg nacrtanog koordinatnog sustava, morat emo preraunavati koordinate. Isto tako bitno je voditi rauna da je jedinina duljina na prozoru 1 pixel, a mi smo za jedininu duljinu uzeli 20 pixela. Razmotrimo malo posljednji problem te naimo nain na koji emo pretvarati koordinate naeg nacrtanog koordinatnog sustava u koordinatni sustav prozora. Radi ilustracije, zamislimo da prozor ima irinu i visinu 100 pixela. elimo li koordinatni sustav na sredini ekrana, to znai da e ishodite tog sustava u stvari biti toka prozora s koordinatama (50, 50).

167

(0, 0)

(0, 0)

Uzmimo npr. toku (1, 0) u nacrtanom koordinatnom sustavu, zanimaju nas koordinate te toke u koordinatnom sustavu prozora. Znamo da koordinate ishodita koordinatnog sustava na prozoru imaju koordinate (50, 50), znai pomaknemo li se za jednu jedininu duinu, nacrtanog koordinatnog sustava, u stvari se pomiemo za 20 pixela. Dakle toka (1, 0) nacrtanog koordinatnog sustava e u koordinatnom sustavu prozora imati koordinate (70, 0). Lako se da zakljuiti da e openito toka s koordinatama (x, 0), naeg zamiljenog koordinatnog sustava u koordinatnom sustavu prozora imati koordinate (50 + x * 20). Nadalje, primijetimo da e npr. y koordinata toke (0, 1) nacrtanog koordinatnog sustava u koordinatnom sustavu prozora biti 50 20 pixela to iznosi 30. Dakle toka (0, 1) zamiljenog koordinatnog sustava e u koordinatnom sustavu prozora imati koordinate (0, 30), odnosno openito e toka s koordinatama (0, y) u nacrtanom koordinatnom sustavu, imati koordinate (0, 50 y * 20) u koordinatnom sustavu prozora. Openito, neka je sredite nacrtanog koordinatnog sustava toka s koordinatama (xs, ys) u koordinatnom sustavu prozora. Neka je jedinina duina nacrtanog koordinatnog sustava 20 pixela, te neka je u njemu zadana toka s koordinatama (x, y). Toka (x, y) e u koordinatnom sustavu prozora u tom sluaju imati koordinate (xp, yp), pri emu je: xp = xs + 20 * x yp = ys 20 * y Primjer 14 2: Napiimo program koji e unositi parametre a, b i c funkcije f (x) = a sin (bx + c), te e crtati graf funkcije u koordinatnom sustavu ije e sredite biti oko sredine ekrana veliine 640x480 pixela.

168

Java i objektno orijentirano programiranje

Rjeenje:
import javax.swing.*; import java.awt.*; public class GrafF extends JFrame { private final int SIRINA = 640, VISINA = 480; private int a, b, c; public GrafF() { try { a = Integer.parseInt(JOptionPane.showInputDialog (this, "Parametar a")); } catch (Exception e) { a = 1; } try { b = Integer.parseInt(JOptionPane.showInputDialog (this, "Parametar b")); } catch (Exception e) { b = 1; } try { c = Integer.parseInt(JOptionPane.showInputDialog (this,

169

"Parametar c")); } catch (Exception e) { c = 0; } setTitle ("Graf funkcije f (x) = " + a + " sin (" + b + " x + " + c + ")"); setSize (SIRINA, VISINA); setDefaultCloseOperation (EXIT_ON_CLOSE); setBackground (Color.white); setVisible (true); } private void xos (Graphics g) { g.setColor (Color.blue); g.drawLine (0, VISINA / 2, SIRINA, VISINA / 2); for (int i = 1; i < SIRINA / 20; i++) g.drawLine (i * 20, VISINA / 2 - 2, i * 20, VISINA / 2 + 2); } private void yos (Graphics g) { g.setColor (Color.blue); g.drawLine (SIRINA / 2, 0, SIRINA / 2, VISINA); for (int i = 1; i < VISINA / 20; i++) g.drawLine (SIRINA / 2 - 2, i * 20, SIRINA / 2 + 2, i * 20); } public void crtaj (Graphics g) { double x = - SIRINA / 40.0, xs = SIRINA / 2.0, ys = VISINA / 2.0, y; int xp, yp; g.setColor (Color.red); while (x < SIRINA / 40) { y = a * Math.sin (b * x + c); xp = (int)(xs + 20 * x); yp = (int)(ys - 20 * y); g.drawOval (xp, yp, 1, 1); x += 0.05; } } public void paint (Graphics g) { xos (g); yos (g); crtaj (g); } public static void main (String[] s) { GrafF gF = new GrafF (); } }

170

Java i objektno orijentirano programiranje Primijetimo da nam se graf funkcije sastoji os gustih tokica. elimo li da nam graf bude gladak, da nema razmaka izmeu tokica, tokice moemo spojiti linijama, i tom e sluaju metoda crtaj () imati sljedei oblik:
public void crtaj (Graphics g) { double x = - SIRINA / 40.0, xs = SIRINA / 2.0, ys = VISINA / 2.0, y; int xp, yp, xt, yt; y = a * Math.sin (b * x + c); xt = (int)(xs + 20 * x); yt = (int)(ys - 20 * y); g.setColor (Color.red); while (x < SIRINA / 40) { y = a * Math.sin (b * x + c); xp = (int)(xs + 20 * x); yp = (int)(ys - 20 * y); g.drawLine (xt, yt, xp, yp); xt = xp; yt = yp; x += 0.05; } }

171

15
Java appleti
Primjer appleta Integriranje appleta u web stranicu Prosljeivanje parametara appletu iz web browsera

172

Java i objektno orijentirano programiranje Do sada smo se upoznali s dva tipa programa u Javi: konzolni programi, koje smo pokretali iz komandnog prompta, a vrijednosti smo im prosljeivali preko standardnog ulaza ili iz datoteke programi s korisnikim sueljem, kod kojih smo vrijednosti unosili preko elemenata grafikog korisnikog suelja ili iz fileova. Na samo poetku smo rekli da osim programa u Javi moemo raditi i applete. Radi se o posebnoj vrsti programa koja je integrirana u web stranicu i izvrava se unutar web browsera.

Primjer appleta
Za razliku od programa s grafikim korisnikim sueljem, koje smo kreirali nasljeujui klasu JFrame, kod appleta emo nasljeivati klasu JApplet. Obje klase nalaze se u istom paketu javax.swing. Prisjetimo se, kod programa smo uvijek imali konstruktor i metodu main (). Kod appleta je stvar neto drugaija, nema konstruktora i nema metode main (). Ali zato e uvijek biti jedna od metoda: public void init () poziva se iz web browsera ili applet viewera svaki puta kada se applet uita ili ponovno uita. Ova metoda na neki nain zamjenjuje konstruktor, koji smo imali kod programa. Unutar nje je poeljno inicijalizirati svojstva appleta,... public void paint (Graphics g) za crtanje na appletu (analogno metodi paint () kod programa) osim navedenih metoda unutar appleta postoji i jo niz drugih metoda, najee koritene su: public void start () poziva se iz web browsera ili applet viewera, neposredno nakon pozivanja metode init (), kada se kod appleta poinje izvravati, te kada se stranica s appletom ponovo posjeti (bez da se gasi browser) public void stop () poziva se iz browsera ili applet viewera svaki puta kada se prekida izvravanje appleta (zatvaranje web stranice na kojoj se applet nalazi). public void destroy () poziva se iz browsera ili applet viewera neposredno nakon metode stop (). public void showStatus () prikazuje poruku na statusnoj traci. Primjer 15 1: Napiimo jednostavan applet koji e ispisivati poruku "Ja sam Java applet, a tko si ti?". Rjeenje:
import javax.swing.*; import java.awt.*; public class Poruka extends JApplet { public void paint (Graphics g) { setBackground (Color.yellow); g.setFont (new Font ("Garamond", Font.BOLD, 24)); g.setColor (Color.blue); g.drawString ("Ja sam Java applet, a tko si ti?", 20, 50); } }

173

Ovako kreirani applet moemo pokrenuti na nekoliko naina. BlueJ razvojno okruenje nam omoguava izvravanje appleta na dva naina: pokretanje u appletvieweru pokretanje u web browseru Na samom poetku emo primijetiti da je ve sliica appleta drugaija nego sliica programa.

Klikom desnog gumba mia na sliicu appleta otvorit e nam se izbornik, kod kojeg emo odabrati Run applet.:

Pokretanje appleta otvorit e nam se novi prozor u kojem emo moi definirati veliinu appleta, nain na koji elimo pokrenuti applet, te dodati jo neke parametre appletu, o kojima emo govoriti neto kasnije.

174

Java i objektno orijentirano programiranje Ovaj puta emo applet pokrenuti iz appletviewera, posebnog programa za pregledavanje appleta, definirat emo mu veliinu, te kliknuti na gumb OK i u posebnom prozoru e nam se otvoriti applet:

Integriranje appleta u web stranicu


Kao to znamo, web stranica je multimedijalni dokument koji se nalazi negdje na Internetu. Izmeu ostaloga web stranice mogu sadravati i applete. U pozadini svake web stranice nalazi se HTML (Hypertext Markup Language). HTML je u stvari jezik za pisanje web stranica, sastoji se od tzv. tagova odnosno opisnika, pomou kojih dizajniramo izgled stranice te stavljamo elemente na stranicu. Svaka stranica ima sljedei oblik:
<html> <head> ... </head> <body> ... </body> </head>

Kao to moemo primijetiti, web stranica se sastoji od zaglavlja (head) i tijela (body) stranice. Unutar zaglavlja stranice nalazi se najee naslov stranice (onaj koji se vidi u naslovnoj traci web browsera), neke skripte,... dok se unutar tijela stranice nalazi sve ono to vidimo u browseru, pa emo onda unutar tijela staviti sam applet. Applet koji stavljamo na neku web stranicu mora biti kompajliran te moramo imati dokument s nastavkom .class. Tag za postavljanje appleta na stranicu je <applet> i ima sljedeu sintaksu:
<applet code = "ImeKlase.class" width = "sirina" height = "visina"> </applet>

Pri emu je ImeKlase.class naziv klase koja generira applet, dok su sirina i visina vrijednosti za irinu i visinu appleta na web stranici.

175

Bitno je napomenuti da se sama klasa koja generira applet i web stranica trebaju nalaziti u istoj mapi, inae kod code treba navesti itav put do filea u kojem se nalazi klasa. Primjer 15 2: Kreirajmo web stranicu u koju emo ukljuiti applet napravljen u prethodnom primjeru. Rjeenje:
<html> <head> <title>Stranica s Java appletom</title> </head> <body> Ispod ovog teksta nalazi se Java applet<br> <applet code = "Poruka.class" height = "200" width = "450"> </applet> </body> </html>

Ovaj kod moemo napisati u bilo kojem text procesoru (Notepad,...) spremimo ga npr. pod imenom stranica.html u mapu u kojoj se nalazi file s klasom Poruka.class. Tako kreiranu stranicu otvorimo s nekim web browserom i ukoliko je sve u redu u njemu emo dobiti sadraj kao na sljedeoj slici:

Ovdje ima nekoliko HTML tagova koje nismo objasnili. Ukratko tagom <title> unutar zaglavlja definiramo naslov stranice (tekst koji se nalazi u naslovnoj traci preglednika). Tagom <br> naglaavamo da na tom mjestu elimo prei u novi red na stranici. Tekst neposredno prije taga <br> je obian tekst koji se ispisuje na stranici.

176

Java i objektno orijentirano programiranje BlueJ razvojno okruenje nam nudi mogunost automatskog kreiranja web stranice. Pomou BlueJa emo stranicu kreirati na sljedei nain: 1. Kliknemo desnim gumbom mia na sliicu appleta za koji elimo da se nalazi na Web stranici. 2. Odaberemo Run Applet.

3. U prozoru koji se pojavi odaberemo opciju Run Applet in web browser, te upiemo irinu i visinu appleta unutar web stranice. 4. Kliknemo na gumb OK. Otvorit e nam se web browser u kojem e se otvoriti stranica s appletom koji smo postavili unutar nje.

177

Stranica e biti kreirana u mapi u kojoj se nalazi i klasa koju smo pokretali kroz web browser. Kod ovako generirane stranice moemo pogledati tako da u izborniku View browsera odaberemo Source, i on u naem sluaju izgleda ovako:
<html> <!-- This file automatically generated by BlueJ Java Development --> <!-- Environment. It is regenerated automatically each time the --> <!-- applet is run. Any manual changes made to file will be lost --> <!-- when the applet is next run inside BlueJ. Save into a --> <!-- directory outside of the package directory if you want to --> <!-- preserve this file. --> <head> <title>Poruka Applet</title> </head> <body> <h1>Poruka Applet</h1> <hr> <applet code="Poruka.class" width=450 height=200 codebase="." archive="" alt="Your browser understands the &lt;APPLET&gt; tag but isn't running the applet, for some reason." >

178

Java i objektno orijentirano programiranje


Your browser is ignoring the &lt;APPLET&gt; tag! </applet> <hr> </body> </html>

Napomena: Primijetimo da smo kod programa s grafikim korisnikim sueljem uvijek koristili metode: setTitle (), setSize(), setDefaultCloseOperation(), setVisible (),... kod appleta takvih metoda nema. Naime, nema smisla appletu dodavati naslov jer se nalazi unutar Web stranice kojoj se definira naslov. Veliina koju applet zauzima unutar prozora web preglednika, takoer je definirana na razini HTML-a, unutar taga <applet>. Applet pokreemo neposredno s pokretanjem stranice, pa stoga nije potrebna metoda main (), koja se u stvari pokree kada elimo pokrenuti neki Java program. Isto tako zatvaranjem stranice na kojoj se applet nalazi automatski se prekida i izvravanje appleta.

Prosljeivanje parametara appletu iz web browsera


Kada smo govorili o pokretanju appleta iz BlueJ suelja rekli smo da je appletima preko parametara mogue proslijediti neke vrijednosti. U nastavku emo govoriti neto vie o tome. Moglo bi se npr. dogoditi da je applet iz naeg primjera postane jako poeljan i svi ga poele imati na svojim web stranicama. Meutim, ne svia se svima npr. tekst koji applet ispisuje ili moda ne vole svi utu boju. Kako ne bismo morali svaki puta iznova raditi novi applet s drugim tekstom ili drugom bojom,... bilo bi zgodno kada bismo npr. boju ili tekst mogli definirati negdje izvan appleta. To uistinu i moemo napraviti i to preko parametara u HTML-u. Vrijednosti parametara emo u klasi koja generira applet pokupiti metodom:
String getParemater (String ime)

Unutar HTML-a emo parametre definirati tagom:


<param name = "ime" value = "vrijednost">

koji se nalazi unutar taga <applet>. Prije nego to ponemo rjeavati sljedei primjer, upoznat emo se s jo jednom klasom koju emo u njemu koristiti. Radi se o klasi Date za rad s datumima i vremenom. Klasa Date ima nekoliko konstruktora, od kojih se najee korite sljedei: public Date () kreira objekt tipa Date, pri emu e datum i vrijeme biti inicijalizirani na trenutni datum i vrijeme public Date (int g, int m, int d) kreira objekt tipa Date, pri emu e vrijednost godine biti postavljena na g, mjeseca na m a dana na d. Godine se poinju raunati od 1900, pa ako npr. elimo godinu 2005, vrijednost parametra g emo postaviti na 105. Mjeseci su definirani od 0-11. Pa ako elimo mjesec na npr. lipanj, vrijednost parametra d treba biti 5. public Date (int g, int m, int d, int h, int min, int sec) kreira objekt tipa Date pri emu e vrijednosti svojstava biti postavljene na proslijeene vrijednosti, a godina i datum se definiraju kao kod prolog konstruktora.

179

public Date (long ms) kreira objekt tipa Date, pri emu e datum i vrijeme biti postavljeni tako da predstavljaju datum koji dolazi ms sekundi nakon 1. sijenja 1900 00:00:00. Osim navedenih konstruktora esto emo koristiti i neke od sljedeih metoda: public int getYear () vraa redni broj godine kao redni broj nakon 1900 public int getMonth () vraa redni broj mjeseca, poevi od 0 public int getDate () vraa dan u mjesecu public int getDay () vraa redni broj dana u tjednu public int getHours () vraa sate public int getMinutes () vraa minute public int getSeconds () vraa sekunde public long getTime () vraa vrijeme u milisekundama od 1. sijenja 1900 00:00:00 public void setYear () postavlja godinu public void setMonth () postavlja mjesec public void setDate () postavlja dan u mjesecu public void setDay () postavlja redni broj dana u tjednu public void setHours () postavlja sate public void setMinutes () postavlja minute public void setSeconds () postavlja sekunde public boolean equals (Date d1) vraa true ako su datumi jednaki public boolean after (Date d1) vraa true ako je datum nakon specificiranog datuma d1 public boolean before (Date d1) vraa true ako je datum prije specificiranog datuma d1 Klasa Date nalazi se u posebnom paketu java.util, koji emo morati ukljuiti u svoj program svaki puta kada emo raditi s datumima. Primjer 15 3: Kreirajmo Java applet koji e unositi dan, mjesec i godinu roenja neke osobe, te e na osnovu tih podataka raunati bioritam osobe za razdoblje od broja dana koji e se zadati kao parametar kroz web stranicu. Bioritam se sastoji od 3 krivulje. Sve tri krivulje su periodike, u trenutku roenja su sve tri na 0. Krivulje su redom: Fiziki aspekt period je 23 dana Emotivni aspekt period je 28 dana Intelektualni aspekt period je 33 dana Rjeenje: Applet:
import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; public class Bioritam extends JApplet implements ActionListener { private Date dr, d = new Date (); private Container c; private JButton b; private JComboBox c1, c2, c3; private boolean initialized = false; private int broj_dana, k; public void init()

180

Java i objektno orijentirano programiranje


{ //uzimanje vrijednosti parametra s web stranice broj_dana = Integer.parseInt (getParameter ("broj_dana")); k = 600 / broj_dana; c = getContentPane (); c.setLayout (null); c1 = new JComboBox (); c1.setSize (50, 25); c1.setLocation (10, 10); for (int i = 1; i <= 31; i++) c1.addItem ("" + i); c.add (c1); String[] mj = {"Sijeanj", "Veljaa", "Oujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"}; c2 = new JComboBox (mj); c2.setSize (150, 25); c2.setLocation (70, 10); c.add (c2); c3 = new JComboBox (); c3.setSize (70, 25); c3.setLocation (230, 10); for (int i = 1900; i <= 2005; i++) c3.addItem ("" + i); c.add (c3); b = new JButton ("OK"); b.setSize (80, 25); b.setLocation (320, 10); b.addActionListener (this); c.add (b); }

public void paint(Graphics g) { super.paint (g); g.setColor(Color.white); g.fillRect(0, 100, 600, 520); if (initialized) { //starost osobe u danima kao razlika izmeu dva datuma u //milisekundama, pa poslije pretvorena u dane long start = (long)((d.getTime () - dr.getTime ()) / (24 * 60 * 60 * 1000)); //crtanje krivulja crtaj (g, 28, Color.red, start); crtaj (g, 33, Color.blue, start); crtaj (g, 23, Color.green, start); koordinatni (g); } } //metoda crta graf za odreeni aspekt na osnovu perioda ciklusa te //starosti osobe u danima. //Budui da se radi o periodikom grafu, crtat emo ga kao sinusoidu //s periodom b i to na intervalu od (start broj_dana / 2) //do (start + broj_dana / 2), pri emu je start starost osobe u

181

//danima, na dananji datum, dok je broj_dana vrijednost parametra, //proslijeenog s web stranice a odnosi se na broj dana za koji //elimo raditi bioritam. public void crtaj (Graphics g, int b, Color c, long start) { double x = start - broj_dana / 2, y; int xt = (int)(k * (x - start) + 300), yt = (int)(300 - 20 * 10 * Math.sin (2.0/b * Math.PI * x)), xx, yy; g.setColor (c); while (x < start + broj_dana / 2) { y = Math.sin (2.0/b * Math.PI * x); xx = (int)(k * (x - start) + 300); yy = (int)(300 - 20 * 10 * y); g.drawLine (xt, yt, xx, yy); xt = xx; yt = yy; x += 0.01; } if (b == 23) g.drawString ("Fiziki ciklus", 10, 515); else if (b == 28) g.drawString ("Emotivni ciklus", 210, 515); else g.drawString ("Intelektualni ciklus", 410, 515); } //metoda crta koordinatni sustav ovisno o vremenskom intervalu za //koji se bioritam radi. public void koordinatni (Graphics g) { g.setColor (Color.blue); g.drawLine (0, 300, 600, 300); g.drawLine (300, 100, 300, 500); Date tmp; int dan, danas = d.getDate (); String s; for (int i = -broj_dana / 2; i <= broj_dana / 2; i++) { g.drawLine (300 + i * k, 298, 300 + i * k, 302); tmp = new Date (d.getTime () + i * 24 * 60 * 60 * 1000); if (tmp.getDate () < 10) s = "0" + tmp.getDate (); else s = "" + tmp.getDate (); if (tmp.getMonth () + 1 < 10) s = s + ".0" + (tmp.getMonth () + 1); else s = s + "." + (tmp.getMonth () + 1); if (i % 2 == 0) g.drawString (s, 285 + i * k, 315); } } public void actionPerformed (ActionEvent e) { initialized = true; dr = new Date (c3.getSelectedIndex (), c2.getSelectedIndex (), c1.getSelectedIndex () + 1); repaint ();

182

Java i objektno orijentirano programiranje


} }

Web stranica:
<html> <head> <title>Bioritam</title> </head> <body> Unesite svoj datum roenja te kliknite na gumb OK. <hr> <applet code="Bioritam.class" width="600" height="520"> <param name = "broj_dana" value = "20"> </applet> </body> </html>

183

16
Osnove mrene komunikacije u Javi
O raunalnim mreama Mrena komunikacija u Javi Komunikacija putem socketa Vienitnost

184

Java i objektno orijentirano programiranje Jedno od velikih podruja upotrebe Jave je izrada mrenih aplikacija, raznih servera,... U ovom emo se poglavlju, na stvarnom primjeru upoznati s osnovnim pojmovima vezanim uz mrenu komunikaciju. Cilj nam je napraviti program koji e omoguiti komunikaciju korisnika na udaljenim raunalima, tzv. chat.

O raunalnim mreama
Mreu ine dva ili vie ureaja koja su meusobno spojena i mogu razmjenjivati podatke. Najei naini spajanja danas su kablovi odnosno wireles. Cilj mree je prijenos podataka izmeu ureaja unutar mree tzv. vorova. vorovi mogu biti raunala, neki drugi tipovi hardwarea npr. printer ili neki mreni ureaji zadueni za pojedine segmente unutar komunikacije. Kako bi podaci stizali na ispravno odredite treba postojati pravilan nain oznaavanja vorova komunikacije. Svaki vor unutar mree ima svoju adresu. Ba isto kao to ako na razglednicu napiemo ispravnu adresu primatelja, bez obzira iz kojeg dijela svijeta ju slali ona e doi na odredite. Slina je situacija i u svijetu raunala. Postoje stroga pravila komuniciranja tzv. protokoli. Svaki ureaj spojen na raunalnu mreu ima svoju jedinstvenu adresu. Ta adresa je fiksna i u principu ju nije mogue mijenjati. Sam Internet, globalna raunalna mrea, funkcionira na slinom principu. Komunikacija putem Interneta temelji se na IP adresama. IP adresa se sastoji od 32 bita (4 puta po 8 bitova) i oblika je: bbb.bbb.bbb.bbb pri emu je bbb neki nenegativan cijeli broj izmeu 0 i 255. Primjer IP adrese je: 195.29.220.4. Spajanjem na Internet svako raunalo dobije svoju jedinstvenu IP adresu i na taj nain moe komunicirati s ostalim raunalima na Internetu. Kako je pamenje ovakvih IP adresa komplicirano postoje i tzv. simbolike IP adrese koje su lake za pamenje. Takva simbolika IP adresa poznata je jo i kao host name. Tako npr. raunalo ija je IP adresa 195.29.220.4 ima host name shk.skolskaknjiga.hr. Vezivanje IP adrese s host nameom omoguava nam tzv. DNS (Domain Name Server). Raunala spojena na Internet komuniciraju putem jednog od dva protokola: TCP Transmission Control Protocol UDP User Datagram Protocol Grafiki bi to izgledalo ovako: Aplikacijski sloj (FTP, Telnet, HTTP,...) Prijenos podataka (TCP, UDP...) Mreni sloj (IP,...) Fiziki sloj (driveri,...)

185

Zahvaljujui specijalnom Javinom paketu java.net piui svoje mrene aplikacije neemo se trebati zamarati TCP-em, UDP-om, IP-em,... ve emo ih pisati na aplikacijskom sloju i koristiti sve njegove blagodati. Programiranje mrenih programa na aplikacijskom nivou ini mreno programiranje poprilino jednostavnim. U nastavku emo se ukratko osvrnuti na najvanije pojmove vezane uz mreu koje emo susretati u ovom poglavlju: TCP UDP portovi TCP protokol Kada dva raunala ele meusobno komunicirati pouzdano, oni e uspostaviti vezu te meusobno slati i primati podatke putem uspostavljene veze. Ovaj nain komunikacije moemo usporediti s slanjem preporuenog pisama. Naime aljemo li preporueno pismo tada osoba kojoj pismo aljemo svojim potpisom potvruje da je pismo primila. Ukoliko pismo nije primljeno ono se vraa poiljatelju. Isto tako TCP nam osigurava da sve to jedno raunalo poalje drugo e sigurno primiti i obrnuto, inae e biti poslana poruka o greci. TCP omoguava sigurnu komunikaciju za aplikacije koje to zahtijevaju. HTTP (protokol za prijenos Web stranica), FTP (protokol za prijenos datoteka), i Telnet (protokol za udaljeni rad na raunalu) zahtijevaju upravo takvu, pouzdanu komunikaciju. Informacija jesu li podaci stigli na odredite kljuna je za ove protokole. Ukoliko ne bi bilo tako primili bismo Web stranicu na kojoj bi nedostajali elementi, skinuli bismo nepotpun dokument,... UDP protokol Za razliku od TCP protokola koji zahtjeva pouzdanu komunikaciju, UDP je protokol za komunikaciju koji ne garantira da e podaci stii na odredite. Ovaj protokol moemo usporediti s klasinom potom. Naime, poaljemo li obino pismo, nitko nam ne garantira da e ga osoba kojoj je poslano primiti. UDP alje neovisne pakete podataka tzv. datagrame s jednog raunala na drugo. Veina mrenih aplikacija zahtijevaju pouzdanu komunikaciju, meutim postoje i aplikacije kod kojih to nije bitno. Portovi Ve smo rekli da jednom kada se raunalo spoji na Internet ono dobiva jedinstvenu IP adresu pomou koje komunicira s ostalim raunalima na Internetu. Svi podaci koje dobiva s Interneta dolaze tom vezom. Meutim raunalo moe istovremeno primati podatke za razliite aplikacije (downloadati dokument putem FTP-a, uitavati Web stranicu,...). Postavlja se pitanje kako ono zna kojoj aplikaciji treba proslijediti koji podatak? Odgovor lei u portovima. Podaci koji putuju Internetom osim to sadre IP adresu odredita sadre i port na odreditu na koji se trebaju isporuiti.

186

Java i objektno orijentirano programiranje

paket
IP adresa port podatak

RAUNALO (TCP/UDP)

port 1 program 1

port 2

port n

...
program 2 program n

Na raunalu postoji 65536 portova koji su numerirani brojevima od 0 do 65535. Portovi od 0 do 1023 su rezervirani za posebne servise. Tako npr. HTTP koristi port 80, FTP koristi portove 20 i 21, Telnet koristi port 23,... Tablica servisa, protokola te pripadnih portova dana je u dodatku. Mrene aplikacije koje emo mi kreirati takoer e komunicirati putem portova, rezervirane portove neemo smjeti koristiti za komunikaciju u svojim aplikacijama. Internet se temelji na tzv. klijent-server koncepciji. To znai da na Internetu postoje dva osnovna tipa raunala: klijenti serveri (posluitelji) Klijent je raunalo koje serveru alje zahtjeve i od njega dobiva traene podatke. Posluitelj je raunalo koje sadri podatke i u stanju je posluivati vie raunala podacima koje oni od njega trae.

187

Mrena komunikacija u Javi


Ve smo rekli da nam mrenu komunikaciju u Javi omoguava paket java.net. Paket java.net sadri klase za TCP i UDP komunikaciju. Najee koritene klase za TCP komunikaciju su: InetAdress URL URLConnection Socket ServerSocket Dok su za UDP komunikaciju najee koritene klase: DatagramPacket DatagramSocket MulticastSocket Klasa InetAddress Klasa InetAddress predstavlja Internet adresu. Najee koritene metode ove klase su:
static InetAddress getByName (String s)

vraa objekt tipa InetAdress na osnovu

imena hosta s vraa objekt tipa InetAddres koji je kreiran na osnovu niza a koji predstavlja IP adresu public String getHostAddress () vraa IP adresu objekta nad kojim se poziva public String getHostName () vraa host name objekta nad kojim se poziva
static InetAdress getByAddress (byte[] a)

Primjer 16 1: Napiimo konzolnu aplikaciju koja e biti pozivana s jednim parametrom, Web adresom neke Web stranice. Aplikacija treba ispisivati IP adresu i host name raunala na kojem se Web stranica nalazi. Rjeenje:
import java.net.*; public class IP { public static void main (String[] s) { try { InetAddress address = InetAddress.getByName(s[0]); System.out.println(address.getHostName()); System.out.println(address.getHostAddress()); } catch (Exception e) { System.out.println("Ne mogu pronaci " + s[0]); } } }

Napomena: Pri izvravanju programa trebate biti spojeni na Internet.


188

Java i objektno orijentirano programiranje

Klasa URL URL (Uniform Resource Locator) je jedinstvena adresa bilo kojeg dokumenta na Internetu. URL je tekst koji npr. upisujemo u Address bar Web preglednika kako bi uitali neku stranicu. Primjer URL-a je:
http://s5.pro-futura.com:8080/readmail.html

URL se u osnovi sastoji od nekoliko dijelova: protokol neki od Internet protokola, najee http, https, ftp,... host name naziv raunala na kojem je smjeten sadraj port broj porta na koji se spajamo (najee se ne navodi) ime dokumenta put do dokumenta na serveru reference mjesto unutar dokumenta na koje e se premjestiti fokus prilikom uitavanja dokumenta Javina klasa URL sadri metode koje nam omoguuju pristup dokumentima na Internetu. Klasa URL ima nekoliko konstruktora, neki od njih su:
URL (String s) kreira objekt tipa URL pri emu je s neki URL URL (String protokol, String host, int port, String file)

kreira objekt URL s

zadanim parametrima
URL (String protokol, String host, String file)

kreira objekt URL s zadanim

svojstvima Neke od metoda definirane nad klasom URL su: String getFile () vraa file URL-a String getHost () vraa host name URL-a int getPort () vraa port URL-a. Ako port nije specificiran vraa -1 String getProtocol () vraa protokol InputStream openStream () otvara konekciju prema danom URL-u i vraa InputStream koji e omoguiti itanje podataka s URL-a URLConnection openConnection () vraa objekt tipa URLConnection koji predstavlja konekciju prema URL-u. Primjer 16 2: Napiimo program s grafikim sueljem koji e unositi URL neke Web stranice i ispisivati sadraj te stranice u posebnom podruju za tekst.

189

Rjeenje:
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; import java.io.*; public class WebBrowser extends JFrame implements ActionListener { private final int sirina = 400; private final int visina = 300; private Container c; private JTextArea ta; private JTextField t; private JScrollPane sp; private JButton b; public WebBrowser () { setTitle ("Web browser"); setSize (sirina, visina); setDefaultCloseOperation (EXIT_ON_CLOSE); c = getContentPane (); c.setLayout (null); t = new JTextField (); t.setSize (200, 30); t.setLocation (10, 10); c.add (t); b = new JButton (); b.setSize (135, 30); b.setText ("OK"); b.setLocation (220, 10); b.addActionListener (this); c.add (b); ta = new JTextArea (); sp = new JScrollPane (ta);

190

Java i objektno orijentirano programiranje


sp.setLocation (10, 50); sp.setSize (350, 200); c.add (sp); setVisible (true); } public void actionPerformed (ActionEvent e) { try { URL url = new URL(t.getText()); BufferedReader br = new BufferedReader (new InputStreamReader (url.openStream ())); String inputLine, tmp = ""; while ((inputLine = br.readLine()) != null) tmp = tmp + "\n" + inputLine; ta.setText (tmp); br.close(); } catch (Exception e1) { System.out.println (e1.getMessage()); } } public static void main (String[] s) { WebBrowser z = new WebBrowser (); } }

Klasa URLConnection Klasa URLConnection omoguava komunikaciju izmeu programa i URL-a. Metode ove klase omoguavaju itanje i pisanje na resurs s danim URL-om. Konstruktor ove klase je oblika:
URLConnection (URL s)

kreira konekciju za objekt s tipa URL

Nekoliko ee upotrebljavanih metoda klase URLConnection su:


InputStream getInputStream () vraa InputStream za itanje s otvorene konekcije OutputStream getOutputStream () vraa OutputStream za pisanje na otvorenu URL

konekciju

191

Komunikacija putem socketa


Klase URL i URLConnection su gotove klase koje omoguavaju komunikaciju sa serverom. U nastavku nam je cilj nauiti kreirati aplikacije koje e komunicirati na nioj razini. Nauit emo kako komunicirati na sloju samog prijenosa podataka, na razini TCP odnosno UTP protokola. TCP omoguava tzv. point-to-point komunikaciju izmeu klijenta i servera. Za komunikaciju putem TCP-a serverske i klijentske aplikacije koriste poseban komunikacijski kanal kojim prolaze podaci. Klijent je u stvari raunalo na kojem se izvrava klijentska aplikacija dok s druge strane imamo server tj. raunalo na kojem se izvrava serverska aplikacija. Kanal izmeu servera i klijenta je dvosmjeran to znai da njime putuju podaci od klijenta prema serveru i od servera prema klijentu. Krajeve takvog kanala nazivamo socketi. Na komunikacijski kanal moemo gledati kao na hodnik koji povezuje dvije prostorije, dok bi socketi u tom sluaju bila vrata na svakom od krajeva hodnika. Dakle, kada se uspostavi komunikacijski kanal izmeu dva raunala na svakom kraju tog kanala otvara se po jedan socket. S jedne strane imamo server koji je samostalna aplikacija na nekom raunalu. Server ima socket na nekom portu i eka da klijent poalje zahtjev za poetkom komunikacije. S druge strane klijent kreira svoj socket, on zna IP adresu raunala na kojem se nalazi server te zna port na kojem je server. Kada klijent kreira socket serveru se alje zahtjev za uspostavom veze. Kada primi zahtjev od klijenta server kreira novi socket, na novom portu, za komunikaciju s klijentom, te je na taj nain omoguena komunikacija s vie klijenata istovremeno. Nakon to je komunikacijski kanal otvoren mogue je prenositi podatke izmeu servera i klijenta. Za poetak nam je elja kreirati jednostavnu aplikaciju koja e raditi na sljedeem principu: klijent uita liniju teksta sa standardnog ulaza te ju ispie na socketu. server sa socketa proita tekst koji je klijent posao, sva slova poruke pretvori u velika te takvu, izmijenjenu poruku ispie na socket klijent proita poruku sa socketa te ju ispie ponovo na standardni izlaz Shematski prikaz opisanih radnji mogao bi izgledati ovako:

192

Java i objektno orijentirano programiranje

server
kreira socket na nekom portu

klijent

eka zahtjev klijenta

kreira novi socket za komunikaciju sa serverom

kreira novi socket za komunikaciju s klijentom uitava poruku sa standardnog ulaza ita poruku s socketa pie poruku na socket

sva slova u poruci mijenja odgovarajuim velikim slovima

ita poruku sa socketa

pie poruku na socket

ispisuje poruku na standardni izlaz

zatvara socket

zatvara socket

Da bismo ovo bili u stanju isprogramirati moramo znati neto o socketima u Javi. Kako proitati podatke sa socketa? Kako pisati na socket?... Javina klasa java.net sadri klasu Socket koja implementira jedan kraj komunikacijskog kanala. Isto tako java.net sadri i klasu ServerSocket koja implementira socket koji e koristiti server za ekanje i prihvaanje konekcije od strane klijenta. Klasa Socket ima nekoliko konstruktora najei su:
Socket (String host, int port) kreira socket sa specificiranim hostom i portom Socket (InetAddress adress, int port) kreira socket sa specificiranom adresom

portom Najee metode definirane nad klasom Socket su:


public void close () zatvara konekciju public InetAddress getInetAddress () vraa adresu s kojom je klijent spojen public InputStream getInputStream () kreirao objekt tipa InputStream koji

e nam

omoguavati itanje podataka sa socketa


public InetAddress getLocalAddress ()

vraa lokalnu adresu raunala na kojem je

socket
public int getLocalPort ()

vraa lokalni port na kojemu je socket

193

public OutputStream getOutputStream ()

kreira objekt tipa OutputStream koji e

nam omoguavati pisanje podataka na socket Najei konstruktor klase ServerSocket je:
ServerSocket (int port)

kreira objekt tipa ServerSocket na specificiranom portu

Najee koritene metode ove klase su:


public Socket accept () oekuje zahtjev klijenta i kreira novi socket public void close () zatvara socket public InetAddress getLocalAddress () vraa lokalnu adresu raunala

na kojem je

socket
public int getLocalPort ()

vraa port na kojemu je socket eka

Sada imamo sve spremno za rjeavanje problema koji smo si postavili. Primjer 16 3: Kreirajmo server aplikaciju na portu 2000 koja e od klijenta uzimati poruku te sva slova poruke pretvoriti u velika. Tako dobivenu poruku treba ispisati na socket. Potrebno je kreirati i klijent aplikaciju koja e se spajati sa serverom na port 2000, uitavat e poruku sa standardnog ulaza, pisati ju na socket te sa socketa uzeti poruku koju je vratio server i ispisati ju na standardni izlaz. Rjeenje: Klasa za serversku aplikaciju
import java.net.*; import java.io.*; public class Server { private ServerSocket ss; private int port; private Socket s; public Server(int port) { this.port = port; try { //otvaranje socketa na serveru na portu port koji e ekati //zahtjev klijenta za otvaranje komunikacijskog kanala ss = new ServerSocket (port); System.out.println ("Socket kreiran"); //eka se zahtjev klijenta za spajanje na server s = ss.accept (); //zaprimljen zahtjev klijenta i otvoren je komunikacijski kanal //na serveru je kreiran novi socket System.out.println ("Klijent spojen"); //objekt za itanje podataka sa socketa s InputStream in = s.getInputStream(); //objekt za pisanje podataka na socket s

194

Java i objektno orijentirano programiranje


OutputStream out = s.getOutputStream(); //itanje podataka sa socketa reenica koju je na socket //zapisao klijent BufferedReader br = new BufferedReader (new InputStreamReader (in)); String tmp = br.readLine(); System.out.println ("Primio sam poruku od klijenta: " + tmp); //pretvaranje svih slova u velika tmp = tmp.toUpperCase (); System.out.println ("Saljem poruku klijentu: " + tmp); //pisanje na socket PrintStream ps = new PrintStream (out); ps.println (tmp); //zatvaranje konekcije s.close(); } catch (Exception e) { System.out.println ("Greska"); } } public static void main (String[] s) { Server sr = new Server (2000); } }

Klasa za klijentsku aplikaciju


import java.net.*; import java.io.*; public class Klijent { private int port; private String host; private Socket s; public Klijent(String host, int port) { try { this.host = host; this.port = port; //otvaranje socketa prema serveru na portu 2000 s = new Socket (host, port); //itanje podataka sa standardnog ulaza BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); System.out.println ("Unesi poruku: "); String tmp = br.readLine (); //pisanje poruke na socket OutputStream out = s.getOutputStream(); PrintStream ps = new PrintStream(out);

195

ps.println (tmp); //itanje poruke sa socketa InputStream in = s.getInputStream(); BufferedReader bs = new BufferedReader (new InputStreamReader (in)); String tmp2 = bs.readLine(); //ispis poruke na standardni output (ekran) System.out.println (tmp2); } catch (Exception e) { System.out.println ("Greska"); } } public static void main (String[] s) { //server na koji se spajamo u ovom se sluaju zove predrag Klijent k = new Klijent ("localhost", 2000); } }

Napomena: Program emo testirati tako da na jednom raunalo prvo pokrenemo klasu Server. Ukoliko imamo dva raunala koja su umreena na drugom raunalu emo pokrenuti klasu Klijent (klase emo pokrenuti iz komandnog prompta). Ukoliko imamo samo jedno raunalo, moemo obje klase pokrenuti na istom raunalu. Ukoliko obje klase pokreemo na istom raunalu kao host name kod klijenta moemo koristiti localhost.

196

Java i objektno orijentirano programiranje

Viekorisniki server
U prethodnom primjeru smo kreirali klijent-server aplikaciju kod koje smo imali jedan server i samo jednog klijenta, koji su izmijenili samo jednu poruku i komunikacija se je prekinula. Na samom poetku smo rekli da nam je cilj kreirati vlastiti chat. Kao to znamo na chat se moe spojiti vie korisnika (klijenata) koji meusobno razgovaraju. Svaki klijent alje poruku koju vide svi sudionici chata. Dakle, elimo li napraviti chat, moramo kreirati server koji e biti u stanju prihvatiti vie klijenata i s njima komunicirati. Server bi trebao biti u stanju u svakom trenutku biti u stanju primiti novog klijenta i svi klijenti bi trebali biti meusobno neovisni. Dakle, na serveru bi trebala postojati jedna petlja koja e neprestano ekati i prihvaati nove konekcije. Dio servera koji e biti u stanju neprekidno prihvaati nove konekcije mogao bi izgledati ovako:
ss = new ServerSocket( port ); System.out.println( "Cekam klijente.... " ); while (true) { Socket s = ss.accept(); //nakon to se klijent spoji na neki port s njim neto napravim System.out.println( "Klijent spojen na port " + s.getPort() ); }

Na ovaj smo nain omoguili istovremeno spajanje vie klijenata na server. Meutim nakon to se klijent spoji na server, on nita ne radi, samo se na serveru ispie poruka da je klijent spojen i port na kojem je spojen. Primijetimo da se svi klijenti spajaju na socket s na serveru. Dakle kada se spoji novi klijent u principu gubimo svaki odnos sa starim klijentom. U stvari bi bilo idealno kada bi na klijent mogao biti neto kao recepcionar u nekom bogatom hotelu. Dakle, server bi trebao "prihvatiti" klijenta, "zapisati ga" i zatim ga "prepustiti pomonom osoblju" koje e mu "stajati na usluzi", te ponovno "ekati" novog klijenta... Dakle, rezimirajmo: na server e prihvaati klijente te ih prosljeivati "nekom drugom" koji e dalje voditi rauna o svakom klijentu. Nakon to proslijedi klijenta "nekome drugom" on e biti ponovo slobodan i ekati e nove klijente. Taj "netko drugi" e biti posebna klasa koja e prihvaati klijenta i s njim neto raditi. Klasa e evidentirati neke osnovne podatke o klijentu (ime, socket na koji je spojen,...) te e u sebi imati implementiranu komunikaciju klijenta sa serverom. Nakon to se klijent "ugasi" ova e klasa poslati poruku serveru da se klijent vie nije spojen. Na ovaj smo nain uistinu osigurali da server uistinu ne treba vie voditi rauna o klijentu, nakon to ga prihvati. Jo nam je preostao samo jedan problem, kako to sve realizirati u Javi?

197

Vienitnost
Snaga Jave kao programskog jezika najvie dolazi do izraaja u mrenim i tzv. vienitnim (multithreading) aplikacijama. U nastavku emo pokuati objasniti kakve su to vienitne aplikacije. Pokuajmo to objasniti na jednom jednostavnom primjeru: taksi sluba unutar nekog grada raspolae s nekoliko taksista koji stoje na raspolaganju. Na poziv klijenta koji treba prijevoz taksist doe po njega te mu stoji na usluzi i vozi ga gdje god klijent eli, naravno uz odreenu naknadu. Svi taksisti rade unutar jedne taksi slube ali svaki od njih razvozi klijente neovisno kada se za to pojavi potreba. Nerijetko se dogaa da vie taksista razvozi klijente istovremeno. Slina je situacija i kod vienitnosti unutar programa. Dakle, imamo jedan program ali unutar kojega se istovremeno odvija vie neovisnih procesa (niti, threads). Svaka nit vodi rauna o izvravanju odreenog skupa naredbi. Vienitni programi imaju viestruke, autonomne aktivnosti koje se izvravaju istovremeno. To je upravo ono to nam treba u naem chatu. Server moe istovremeno komunicirati s vie klijenata, meutim klijenti su znatno sporiji od servera. Stoga e server glavninu vremena ekati da neki klijent neto kae. Ako imamo jednonitnu aplikaciju koja eka da klijent 1 neto kae, u to vrijeme bi moda neki drugi klijenti moda ve izmijenili nekoliko poruka, jer npr. klijent 1 sporo pie. Stoga emo kreirati vienitnu aplikaciju kod koje e postojati niti za svakog klijenta koji se spojina server. Vienitnost e nam omoguiti da klijenti alju poruke serveru neovisno, a znamo da je server dovoljno brz i on e sve te poruke biti u stanju obraivati. Za rad s nitima Java ima posebnu klasu Thread. Klasa Thread implementira interface Runnable koja ima jednu public metodu: run (), koja nita ne vraa. Ukratko to znai da emo u klasi koja e u sebi koristiti klasu Thread trebati definirati metodu run sa zaglavljem: public void run (). Unutar tijela metode run definirat emo "ponaanje" klase. Tj. definirat emo to e se dogaati s konkretnom niti unutar nekog programa. Kao i svaka druga klasa i klasa Thread ima nekoliko konstruktora:
Thread () kreira novi objekt tipa Thread Thread (String name) kreira novi objekt

tipa Thread kojemu e biti dodijeljeno dano ime

(name) Neke od metoda definirane unutar klase Thread su:


static int activeCount () vraa broj trenutno aktivnih niti void destroy () unitava nit String getName () vraa ime niti void start () pokree nit, tj. zapoinje izvravanje metode run()

Sada imamo sve spremno za kreiranje klase koja e brinuti o svakom klijentu. Klasa e kao svojstva imati ime serverske aplikacije koja je kreirala vezu s klijentom i koja je pokrenula nit programa. Osim toga znat e ime socketa preko kojega se odvija komunikacija te e imati informaciju o nekom simbolikom imenu klijenta koje mu je dodijelio server kako bi se znalo tono znalo koji klijent alje informacije. Zadaa niti e biti da preuzme poruku sa ulaza te ju stavi na socket i kae serveru da poruku proita i poalje ju svim klijentima koji su spojeni na chat.
import java.io.*; import java.net.*;

198

Java i objektno orijentirano programiranje


public class ChatServerNit extends Thread { private ChatServer server; private Socket socket; private String name; public ChatServerNit ( ChatServer server, Socket socket, String name ) { //podaci o serveru, socketu i simboliko ime klijenta su svojstva //klase ChatServerNit this.server = server; this.socket = socket; this.name = name; //poetak "rada" niti start(); } //metoda run koja opisuje rad klijenta public void run() { try { BufferedReader din = new BufferedReader( new InputStreamReader ( socket.getInputStream())); //beskonano ponavljaj while (true) { //Uitaj poruku s ulaza String message = din.readLine (); //ispii poruku na socket System.out.println(message ); //upozoravamo server da je klijent poslao poruku, tako //da pozovemo odgovarajuu metodu na serveru. server.sendToAll( name + " > " + message ); } } catch( Exception ie ) { System.out.println(ie.getMessage()); } //nakon to se klijent "ugasi" javlja se poruka serveru da //obrie klijenta server.removeConnection( socket ); } }

Preostaje nam jo izmijeniti server. Server e voditi evidenciju o svim klijentima spojenim na server i to pomou posebnog niza socketa. Isto tako e za svaki socket imati posebni PrintStream koji e mu omoguiti da zna na koje sve sockete treba pisati poruke:
import java.io.*; import java.net.*; public class ChatServer { private ServerSocket ss;

199

//na server e se moi spojiti maksimalno 100 klijanata private final int MAX = 100; //podaci o socketima pamtit e se unutar niza soc private Socket[] soc = new Socket[MAX]; //za svaki socket bit e kreiran poseban PrintStream private PrintStream[] ps = new PrintStream[MAX]; private int elements = 0, k = 1; public ChatServer( int port ) { try { ss = new ServerSocket( port ); System.out.println( "Cekam klijente.... "); while (true) { //prihvaanje klijenta i otvaranje novog socketa koji //e se spremiti u niz socketa te kreiranje //posebnog PrintStreama za svaki socket Socket s = ss.accept(); System.out.println("Klijent spojen na port "+ s.getPort()); PrintStream dout = new PrintStream(s.getOutputStream()); soc [elements] = s; ps [elements++] = dout; //kreiranje niti za novog klijenta, imena klijenata bit e //redni brojevi njihovog spajanja na server sendToAll ("Dobrodosao Klijent " + k); new ChatServerNit( this, s, "Klijent " + k++ ); } } catch (Exception e) { System.out.println (e.getMessage ()); } } //metoda koja pristiglu poruku pie na sve sockete void sendToAll( String message ) { for (int i = 0; i < elements; i++) { PrintStream dout = ps [i]; try { dout.println (message); } catch( Exception e ) { System.out.println( e.getMessage () ); } } } //brie klijenta koji je otiao s chata, tako da brie odgovarajue //elemente iz niza socketa i niza PrintStreamova void removeConnection( Socket s ) { System.out.println( "Brisem klijenta na portu " + s.getPort() ); int i = 0;

200

Java i objektno orijentirano programiranje


while (!soc [i].equals (s)) i++; //sve elemente iza izbrisanog pomie za jedno mjesto unatrag for (int j = i; j < elements; j++) { soc [j] = soc [j + 1]; ps [j] = ps [j + 1]; } elements--; System.out.println( name + " je napustio chat" ); sendToAll ( name + " je napustio chat"); } public static void main( String args[] ) { try { int port = Integer.parseInt( args[0] ); ChatServer cs = new ChatServer( port ); } catch (Exception e) { System.println (e.getMessage()); } } }

Preostaje nam jo kreirati klijenta. Klijent emo poput pravog chat klijenta implementirati kao Applet te ga staviti unutar neke Web stranice. Chat klijent treba voditi rauna o dvije stvari: nakon to korisnik upie poruku chat klijent ju treba zapisati na socket neprekidno provjeravati ima li novih poruka na socketu te ukoliko ih ima ispisati ih u svom prozoru Prvi problem: slanje upisane poruke na socket rijeit emo prilino jednostavno. Korisnik chata e upisati poruku u poseban tekstualni okvir te e pritiskom na tipku [enter] zapisati na socket. To emo napraviti tako da emo kreirati Action Listener na tekstualnom okviru. Pritiskom tipke [enter] kreirat e se dogaaj koji e pokrenuti metodu sendMessage (), koja e poruku zapisati na socket. Metoda sendMessage () vrlo je jednostavna i ne predstavlja nikakvu novost, ona izgleda ovako:
private void sendMessage( String message ) { try { dout.println ( message ); tf.setText( "" ); } catch( Exception e ) { System.out.println( e.getMessage() ); } }

pri emu je dout objekt tipa PrintStream.

201

Na chat klijent osim to pie podatke na socket te ih na taj nain prosljeuje serveru, on mora i provjeravati je li server upisao kakve podatke na socket, a ako ih je upisao treba ih proitati i ispisati unutar suelja chat klijenta. Slina kao i kod servera i ovdje emo morati kreirati posebnu nit koja e u pozadini izvravati beskonanu petlju koja e neprestano provjeravati ima li podataka na socketu te ih proitati i ispisati u prozoru chat klijenta. To emo implementirati unutar metode run (). Prisjetimo se svaki puta kada koristimo klasu Thread, unutar svoje klase trebamo definirati metodu run (). Ta je metoda poprilino jednostavna i ima sljedei oblik:
public void run() { try { while (true) { String message = din.readLine(); ta.append( message + "\n" ); } } catch( Exception e ) { System.out.println( e.getMessage() ); } }

Dakle, cjelokupna implementacija chat klijenta bila bi:


import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class ChatClient extends Applet implements Runnable, { private TextField tf = new TextField(); private TextArea ta = new TextArea(); private Socket socket; private PrintStream dout; private BufferedReader din;

ActionListener

public void init() { ta.setEditable (false); String host = getParameter( "host" ); int port = Integer.parseInt( getParameter( "port" ) ); setLayout( new BorderLayout() ); add("Center", ta); add("South", tf); tf.addActionListener(this); try { Thread t = new Thread (this); socket = new Socket( host, port ); din = new BufferedReader( new InputStreamReader (socket.getInputStream())); dout = new PrintStream( socket.getOutputStream() ); t.start(); }

202

Java i objektno orijentirano programiranje


catch( Exception e ) { System.out.println( e.getMessage() ); } } public void actionPerformed (ActionEvent e) { sendMessage (tf.getText ()); } private void sendMessage( String message ) { try { dout.println ( message ); tf.setText( "" ); } catch( Exception e ) { System.out.println( e.getMessage() ); } } public void run() { try { while (true) { String message = din.readLine(); ta.append( message + "\n" ); } } catch( Exception e ) { System.out.println( e.getMessage() ); } } }

203

Zadaci za vjebu: 1. to je protokol? 2. to je IP adresa? 3. Koji su osnovni protokoli za komunikaciju putem Interneta i objasni svaki od njih. 4. to je port? 5. Koliko portova postoji na raunalu? 6. Koje portove je mogue koristiti u svojim aplikacijama? 7. Objasni klijent-server princip komunikacije. 8. Nabroji neke klase za mrenu komunikaciju u Javi. 9. Kreirajte aplikaciju s grafikim korisnikim sueljem koja e omoguavati unos web adrese te e klikom na gumb IP vraati odgovarajuu IP adresu. 10. to nam omoguavaju klase URL i URLConnection? 11. Napiite applet koji e npr. s URL-a Hrvatske narodne banke (www.hnb.hr) uzimati teaj eura i dolara te ga ispisivati na Web stranici. 12. to je socket? 13. Kreirajte mrenu klijent-server aplikaciju koja e omoguiti komunikaciju izmeu klijenta i servera. Klijent uitava poruke sa standardnog ulaza i alje ih serveru sve dok se s klijenta ne poalje poruka KRAJ. Dakle aplikacija treba raditi sljedee: klijent uitava poruku, klijent alje poruku serveru, server preuzima poruku od klijenta, server sva slova poruke pretvori u velika, server poalje poruku klijentu klijent ispisuje poruku na izlaz klijent uitava poruku sa standardnog ulaza ... Aplikaciju kreirajte s grafikim korisnikim sueljem. 14. Kreirajte mrenu klijent-server aplikaciju koja e biti jednostavan Web server za tekstualne dokumente: klijentska aplikacija treba unositi ime dokumenta na serveru klikom na gumb Uitaj sa servera se treba u poseban okvir uitati sadraj tekstualnog dokumenta sa servera, odnosno ukoliko dokument ne postoji treba ispisati odgovarajuu poruku server treba obraditi zahtjev klijenta i poslati sadraj dokumenta klijentu Aplikaciju kreirajte s grafikim korisnikim sueljem. 15. Objasni vienitnost (multithreading). 16. Izmijenite chat aplikaciju tako da: a. Svaki korisnik moe pri ulazu u chat unijeti svoje ime; b. Chat aplikacija treba kreirati tzv. log file, unutar tog log filea trebaju se nalaziti itava arhiva o chatu (tko je pristupio chatu, u koje vrijeme, to je pisao,...) 17. Kreirajte mrenu aplikaciju koja e omoguiti slanje tekstualnih dokumenata s jednog raunala na drugo.

204

Java i objektno orijentirano programiranje

17
Osnove baza podataka u Javi
to je baza podataka? SQL (Structured Query Language) Java i baze podataka Jo neki elementi grafikog korisnikog suelja

205

U profesionalnom programerskom svijetu veliki dio programiranja svodi se na pisanje programa koje u svojoj pozadini imaju baze podataka. Cilj ovog poglavlja je nauiti raditi s bazama podataka te nauiti kako povezivati baze podataka s programima pisanim u Javi. O bazama podataka napisano je na stotine knjiga. Mi neemo ulaziti u dubinu baza podataka, rei emo nekoliko osnovnih injenice rada s bazama podataka koje e nam omoguiti izradu jednostavnog adresara ali i niza drugih, slinih aplikacija. S bazama podataka emo se upoznati kreirajui jednostavan adresar. Adresar bi trebao biti program u kojem e se nalaziti podaci o osobama. Specifikacija programa U adresar e se spremati sljedei podaci o osobi: ime prezime datum roenja telefon mobitel e-mail adresa Aplikacija treba imati sljedee funkcionalnosti: dodavanje podataka o novim osobama pretraivanje osoba prema svim kriterijima (ime, prezime, datum roenja, telefon, mobitel, e-mail, adresa) i to tako da omoguava pretraivanje s zamjenskim znakom * brisanje osoba iz adresara izmjenu podataka o osobama u adresaru Izvedba programa Program e biti napisan kao Java aplikacija. Podaci za program nalazit e se u Accessovoj bazi podataka, a pristupat e im se iz programa pomou posebnih upita. Program e biti organiziran kroz dva razliita suelja: suelje za unos podataka suelje za pretraivanje, brisanje i izmjenu podataka Suelja e biti implementirana kao tzv. jahai unutar jednog prozora, primjer takvog prozora s jahaima je:

206

Java i objektno orijentirano programiranje

Slika 17-1 Prozor s tzv. jahaima (Font, Character Spacing, Text Effects) U dijelu za unos nalazit e se tekstualna polja za unos: imena, prezimena, datuma roenja, telefona, mobitela, e-maila, te podruje za tekst za unos adrese. Na kraju e se nalaziti i jedan gumb Spremi. Klikom na gumb spremi e se u bazu podataka upisati podaci upisani u odgovarajua pola za unos. Te e se ispisati odgovarajua poruka ukoliko su podaci uspjeno spremljeni u bazu, odnosno poruka o greki ako je dolo do greke prilikom spremanja podataka u bazu (krivi format datuma,...). Pretraivanje podataka biti e organizirano tako da e se neki od kriterija pretraivanja upisati u poseban okvir za tekst. Klikom na gumb Trai pretrait e se svi podaci u tablici. Ime i prezime svih osoba koje u nekom od svojih podataka (ime, prezime, telefon,...) imaju zadani kriterij bit e ispisani u posebnoj listi na ekranu. Klikom na odreeni zapis u listi, podaci o odabranoj osobi bit e prikazani u odgovarajuim poljima te e se moi izmijeniti i spremiti izmjene. Isto tako e se klikom na osobu unutar popisa moi izbrisati ta osoba iz baze podataka.

207

to je baza podataka?
Rekli smo da emo podatke o osobama uvati unutar Accessove baze podataka. U nastavku emo rei neto vie o bazama podataka openito te o kreiranju baze podataka u MS Accessu. Jednostavno reeno, baza podataka je skup tablica u kojima su zapisani podaci. Svaka tablica sastoji se od stupaca, pri emu svaki stupac ima svoje ime. Podaci su zapisani u redcima. Npr. tablica s popisom uenika neke kole, unutar neke baze podataka mogla bi izgledati ovako: Ime Ines Ivana Iva Matko Prezime Markovi Bosanac Veki Kuzmani Datum roenja 13.2.1987. 14.9.1988. 6.1.1977 13.9.1980 Spol M M

Kod tablica u bazi podataka dobro je uvijek imati stupac takav da podaci unutar njega jedinstveno odreuju odreeni redak. Pojednostavljeno reeno. U naoj tablici trebao bi postojati stupac koji bi jedinstveno odreivao svaki redak unutar tablice. U naoj tablici takvog stupca oito nema. Naime, ime definitivno nije takav stupac jer dvije osobe mogu imati isto ime. Slino je i s prezimenom, datumom roenja te spolom. Takav stupac koji jedinstveno odreuje podatke u retku zovemo primarni klju (Primary key). U naoj bi tablici primarni klju mogao biti npr. JMBG. Kao to znamo, ne moe se dogoditi da dvije osobe imaju isti JMBG. Vrlo esto se kao primarni klju postavljaju brojevi koji se automatski poveavaju dodavanjem novog zapisa u tablicu. Pravi smisao primarnog kljua dobije se kada u bazi imamo vie tablica iji su podaci meusobno povezani, no o tome emo govoriti neto kasnije. Dakle, naa tablica s primarnim kljuem, koji se automatski poveava dodavanjem novog zapisa, mogla bi izgledati ovako: ID 1 2 3 4 Ime Ines Ivana Iva Matko Prezime Markovi Bosanac Veki Kuzmani Datum roenja 13.2.1987. 14.9.1988. 6.1.1977 13.9.1980 Spol M M

Danas postoji mnotvo programa za rad s bazama podataka (MS SQL, Oracle, MySQL,...), nama najblii, najjednostavniji i s daleko najmanjim brojem mogunosti je MS Access. Radi se o programu koji dolazi u kompletu s MS Officeom. U nastavku emo nauiti kako u Accessu kreirati tablicu za na Adresar. Primjer 17 1: Kreirajmo tablicu koja e sadravati sve stupce potrebne za program Adresar. Rjeenje: Pokrenimo MS Access. Ovdje emo raditi na MS Accessu XP, sve ostale verzije vrlo su sline.

208

Java i objektno orijentirano programiranje

Slika 17-2. Prozor MS Accessa U desnom dijelu prozora odaberemo Blank Database. Odaberemo mapu gdje elimo spremiti bazu te upiemo ime (adresar.mdb) i kliknemo na gumb Save.

209

Slika 17-3. Glavni prozor za rad s bazom podataka U prozoru koji se otvori, kliknemo na sliicu Tables u lijevom dijelu prozora, te odaberemo New u gornjem dijelu prozora.

Slika 17-4. Prozor za kreiranje tablice unutar baze podataka Kliknemo na Design View te definirajmo stupce unutar tablice:

Slika 17-5. Definiranje stupaca tablice U stupac Field name upisivat emo nazive stupaca. Dok emo pod Dana Type odabirati tip vrijednosti koje emo upisivati unutar stupaca. Najei tipovi vrijednosti je Text odnosno Number za unos teksta odnosno brojeva. esto se jo koriste i Date za datum i vrijeme, te Autonumber koji oznaava da se vrijednost stupca automatski poveava za 1. Mi emo kreirati sljedee stupce: ID Autonumber ime Text, najvie 30 znakova

210

Java i objektno orijentirano programiranje prezime Text, najvie 30 znakova datumR Date/Time, Short Date telefon Text, najvie 30 znakova mobitel Text, najvie 30 znakova e-mail Text, najvie 30 znakova adresa Text, najvie 255 znakova Nadalje emo definirati da je ID primarni klju na tablici. To emo napraviti tako da kliknemo desnim gumbom mia na stupac ID te u izborniku koji se otvori odaberemo Primary Key.

Slika 17-6. Definiranje primarnog kljua Na kraju kliknemo na gumb Save odnosno File Save, upiemo ime tablice (adresar) te kliknemo na gumb OK.

Slika 17-7. Definirana tablica adresar

211

SQL (Structured Query Language)


U tako definiranu tablicu podatke moemo unositi, mijenjati, brisati,... direktno preko suelja MS Accessa, no nas u stvari zanima neto drugo. Naime, mi u svojoj aplikaciji neemo otvarati MS Access i u njega upisivati podatke, mijenjati ih,... ve bismo htjeli da to radi naa aplikacija. Manipulaciju podacima unutar baze podataka omoguuje nam SQL. SQL je skraenica za Structured Query Language, a radi se o jeziku za manipulaciju podacima unutar tablica baze podataka. etiri su osnovna tipa upita (Query): INSERT SELECT UPDATE DELETE Upit INSERT Upit INSERT koristit emo svaki put kada budemo dodavali podatke u tablicu. Opi oblik naredbe INSERT je: INSERT INTO ime_tablice (st1, st2,... stn) VALUES (v1, v2,... vn) pri emu su st1, st2,... stn, nazivi stupaca, dok su v1, v2,... vn odgovarajue vrijednosti. Sve upite emo u MS Accessu izvravati u posebnom prozoru za upite. Za poetak otvorimo bazu podataka adresar.mdb. Primjer 17 2: Dodajmo u tablicu adresar osobu sa sljedeim podacima: Ime: Ines Prezime: Markovi Datum roenja: 13. 2. 1987. Telefon: 01123456 Mobitel: 095123456 Adresa: V. avenija 23, 10000 Zageb. Rjeenje: Pokrenimo Access te otvorimo tablicu adresar.mdb, koju smo kreirali u prolom primjeru. U popisu s desne strane odaberemo sliicu Queries. U gornjem popisu odaberemo New a zatim Design View, te kliknemo na OK.

212

Java i objektno orijentirano programiranje

Slika 17-8. Odabir naina kreiranja upita U prozoru koji se pojavi kliknemo na Close.

Slika 17-9. Popis tablica za upit U gornjem dijelu glavnom prozora kliknemo na sliicu SQL, te u izborniku koji se otvori odaberemo SQL View (View SQL View).

Slika 17-10. Odabir suelja za kreiranje upita Odabirom ove opcije otvorit e se sljedei prozor:

213

Slika 17-11. Prozor za unos upita U prozor koji se pojavio upisat emo sljedei upit za dodavanje podataka:
INSERT INTO adresar (ime, prezime, datumR, mobitel, telefon, adresa) VALUES ('Ines', 'Markovi', '13.2.1987', '01123456', '095123456', 'V. avenija 23, 10000 Zagreb')

Kliknemo na gumb Execute (

) i ukoliko je sve u redu, pojavit e se prozor s porukom:

Slika 17-12. Upit je uspjeno izvren Otvorimo tablicu adresar i u njoj emo vidjeti redak s podacima koje smo upravo dodali: Napomena: Primijetimo da stupce u upitu nismo naveli onim redoslijedom kojim se nalaze u tablici, bitno je samo da redoslijed stupaca odgovara redoslijedu vrijednosti koje se ele dodati u odgovarajue stupce tablice. Isto tako mogli smo primijetiti da jedan stupac u tablici postoji, ali ga nema u upitu, radi se o stupcu email. Pogledamo li u tablicu vidjet emo da u tom stupcu nema vrijednosti za osobu koju smo unijeli u tablicu, to je i za razumno. Kao to smo mogli primijetiti u primjeru, vrijednosti koje smo dodavali u tablicu pisali smo unutar jednostrukih navodnika, to je u principu uvijek tako osim kada se dodaju brojevi, koji se ne piu unutar jednostrukih navodnika. Isto tako je mogue i datume pisati bez navodnika. Upit SELECT SELECT emo koristiti kada iz tablice budemo htjeli izdvojiti podatke prema nekom kriteriju. Opi oblik naredbe SELECT je: SELECT st1, st2,... stn FROM ime_tablice WHERE uvjet1 AND/OR uvjet2 AND/OR...AND/OR uvjetm pri emu su st1, st2,... stn nazivi stupaca ije vrijednosti elimo da nam vrati upit, dok je uvjet1, ..., uvjetm uvjeti odgovarajui uvjeti koji su najee oblika:

214

Java i objektno orijentirano programiranje ime_stupca [operator] vrijednost pri emu je operator jedan od relacijskih operatora (=, <, >, <>). ime_stupca like vrijednost Ovakvim uvjetom najee se trae podaci koji "su slini" zadanoj vrijednosti. U tom se sluaju moe koristiti zamjenski znak * koji zamjenjuje jedan ili vie znakova. Mogue je pisati SELECT upite i bez uvjeta, u tom sluaju neemo imati WHERE. Rezultat upita je jedna privremena tablica. Primjer 17 3: Ispiimo imena prezimena, brojeve mobitela te adrese svih osoba koje se zovu Ines i prezime zapoinje slovom M. Rjeenje:
SELECT ime, prezime, mobitel, adresa FROM adresar WHERE ime = 'Ines' AND prezime LIKE 'M*'

Napomena: elimo li da nam upit vrati sve stupce umjesto nabrajanja svih emo jednostavno napisati *. Npr. SELECT * FROM adresar e nam ispisati sve podatke iz tablice adresar. Upit UPDATE UPDATE emo koristiti za auriranje (izmjenu) podataka u tablici. Opi oblik ove naredbe je: UPDATE ime_tablice SET st1 = vr1, st2 = vr2,... stn = vrn WHERE uvjet1 AND/OR uvjet2 AND/OR...AND/OR uvjetm Nakon izvravanja ovog upita, svim zapisima koji zadovoljavaju zadane kriterije bit e, za stupac st1, postavljena vrijednost na vr1, stupac st2 e imati vrijednost vr2,... dok e stupac stn imati vrijednost vrn. Primjer 17 4: Izmijenimo podatke u tablici adresar tako da svim osobama koji u broju mobitela imaju broj 95 izbriemo broj mobitela (postavimo ga na prazan string). Rjeenje:
UPDATE adresar SET mobitel = '' WHERE mobitel LIKE '*95*'

215

Upit DELETE Kao to je i za pretpostaviti DELETE emo koristiti kada budemo htjeli brisati itave zapise iz tablice. Opi oblik naredbe DELETE je: UPDATE FROM ime_tablice WHERE uvjet1 AND/OR uvjet2 AND/OR...AND/OR uvjetm Izvravanjem ove naredbe iz tablice ime_tablice bit e izbrisani svi podaci koji zadovoljavaju postavljene uvjete. Primjer 17 5: Izbriimo sve osobe iz tablice adresar. Rjeenje:
DELETE FROM adresar

216

Java i objektno orijentirano programiranje

Java i baze podataka


SQL o kojem smo upravo govorili je standardiziran za rad s razliitim tipovima baza podataka (MS Access, MS SQL, ORACLE,...). U principu to znai da emo pomou istog SQL upita dodavati podatke, u bazu kreiranu u Accessu ili MS SQL-u odnosno ORACLU i upravo u tome lei njegova snaga. Da bismo iz vlastitog programa mogli komunicirati s bazom podataka, prvo se moramo spojiti na bazu podataka. E to ba i nije tako jednostavno. Nain spajanja ovisi o tipu baze podataka,... to uvelike komplicira stvari. Meutim, nije ba sve tako crno, u pomo nam dolazi JDBC. JDBC (Java Database Connectivity) omoguava nam jednostavnu komunikaciju s bazom podataka. Radi se o suelju za komunikaciju s bazama podataka. Naa aplikacija treba samo poslati odgovarajue parametre i JDBC e sam obaviti sve potrebne radnje kako bismo uspostavili komunikaciju s bazom podataka i pomou SQL upita izvravali odreene manipulacije s podacima. Meutim postoji jedan problem, JDBC ne radi sa svim tipovima baza podataka. Osim JDBC-a postoji jo i tzv. ODBC (Open Database Connectivity) koje je u stanju spojiti se sa svim tipovima baza podataka. Na alost, Java ne omoguava spajanje na bazu podataka pomou ODBC-a, ali zato postoji spona koja je u stanju translatirati JDBC u ODBC. Radi se o svojevrsnom mostu izmeu JDBC-a i ODBC-a tzv. JDBC-ODBC bridge. Uz puno preznojavanja, muke i prie konano smo u stanju spojiti se s bilo kojom bazom podataka. Kako bismo se spojili s bazom podataka pomou moramo unutar programa napraviti nekoliko predradnji. Prvo to moramo napraviti je rei da elimo komunicirati s ODBC-em preko JDBCODBC bridgea. To emo napraviti izvravanjem naredbe: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Ukoliko je ova naredba uspjeno izvrena spremni smo za kreiranje veze prema bazi podataka, koja e nam omoguiti direktnu komunikaciju s bazom podataka, koja e ukljuivati izvravanje SQL upita. Povezivanje s bazom podataka Povezivanje s bazom podataka omoguit e nam metode klase DriverManager. DriverManager je static klasa, a neke od njenih, ee upotrebljavanih metoda su: na osnovu opisa veze prema bazi podataka (s), ova metoda uspostavlja vezu s bazom podataka te vraa objekt tipa Connection koji predstavlja konekciju static Connection getConnection (String s, String ime, String lozinka) na osnovu opisa veze prema bazi podataka (s), korisnikog imena (ime) i lozinke (lozinka), ova metoda uspostavlja vezu s bazom podataka. te vraa objekt tipa Connection koji predstavlja konekciju
static Connection getConnection (String s)

Ukoliko se spajamo s Access bazom podatak, string s koji opisuje vezu prema bazi je sljedeeg oblika: jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=ime.mdb pri emu je ime.mdb itav put do Accessovog dokumenta u kojem je spremljena naa baza podataka.

217

Klasa Connection sadri sve potrebne informacije o otvorenoj vezi prema bazi podataka. Neke od metoda ove klase su:
void close () zatvara konekciju prema bazi Statement createStatement () kreira objekt

tipa Statement koji e nam omoguiti

slanje SQL upita bazi


boolean isClosed ()

vraa true ako je veza prema bazi zatvorena, inae vraa false

Za izvravanje SQL upita na bazi podataka koristit emo metode klase Statement. Najvanije metode ove klase su:
boolean execute (String s) izvrava ResultSet executeQuery (String s)

upit (s) tipa INSERT, UPDATE, DELETE izvrava upit (s) koji je tipa SELECT i rezultate

vraa u obliku objekta tipa ResultSet void close () zatvara Statement objekt Rezultat SELECT upita vraa se u obliku ResultSeta. ResultSet moemo zamisliti kao tablicu u kojoj se nalaze rezultati upita. Nakon to se upit izvri i rezultati upita se smjeste u ResultSet, preostaje nam jo proitati podatke iz ResultSeta te ih na neki nain prikazati u aplikaciji. Rezultate emo itati tako da s kursorom prolazimo red po red ResultSeta i itamo podatke iz odgovarajuih stupaca unutar trenutnog reda. To e nam omoguiti metode klase ResultSet:
boolean absolute (int n) postavlja kursor u n-ti redak ResultSeta void afterLast () postavlja kursor na kraj ResultSeta (iza zadnjeg zapisa) void beforeFirst () postavlja kursor na poetak ResultSeta (ispred prvog zapisa) void close () zatvara ResultSeta objekt void deleteRow () bie trenutni redak unutar ResultSeta int findColumn (String s) vraa redni broj stupca s imenom s unutar trenutnog

ResultSeta
boolean first () postavlja kursor na prvi redak ResultSeta boolean getBoolean (String s) vraa logiku vrijednost koja

se nalazi u trenutnom retku

u stupcu s imenom s danog ResultSeta boolean getBoolean (int n) vraa logiku vrijednost koja se nalazi u trenutnom retku u stupcu s rednim brojem n danog ResultSeta Date getDate (String s) vraa datum koji se nalazi u trenutnom retku u stupcu s imenom s danog ResultSeta Date getDate (int n) vraa datum koji se nalazi u trenutnom retku u stupcu s rednim brojem n danog ResultSeta float getFloat (String s) vraa realnu vrijednost koja se nalazi u trenutnom retku u stupcu s imenom s danog ResultSeta float getFloat (int n) vraa realnu vrijednost koja se nalazi u trenutnom retku u stupcu s rednim brojem n danog ResultSeta int getInt (String s) vraa cjelobrojnu vrijednost koja se nalazi u trenutnom retku u stupcu s imenom s danog ResultSeta int getInt (int n) vraa cjelobrojnu vrijednost koja se nalazi u trenutnom retku u stupcu s rednim brojem n danog ResultSeta int getRow () vraa redni broj trenutnog retka unutar ResultSeta String getString (String s) vraa tekstualnu vrijednost koja se nalazi u trenutnom retku u stupcu s imenom s danog ResultSeta

218

Java i objektno orijentirano programiranje vraa tekstualnu vrijednost koja se nalazi u trenutnom retku u stupcu s rednim brojem n danog ResultSeta boolean isAfterLast () vraa true ako je kursor iza zadnjeg reda ResultSeta, inae vraa false boolean isBeforeFirst () vraa true ako je kursor ispred prvog reda ResultSeta, inae vraa false boolean isFirst () vraa true ako je kursor na prvom elementu ResultSeta, inae vraa false boolean isLast () vraa true ako je kursor na zadnjem elementu ResultSeta, inae vraa false boolean last () postavlja kursor na zadnji redak ResultSeta boolean next () pomie kursor na sljedei redak ResultSeta boolean previous () pomie kursor na prethodni redak ResultSeta boolean relative (int n) pomie kursor za n redaka, s obzirom na trenutni redak unutar ResultSeta
String getString (int n)

Sve gore navedene klase za rad s bazama podataka nalaze se unutar posebnog paketa: java.sql, koji emo morati pozvati unutar aplikacije koja e raditi s bazama podataka.

Jo neki elementi grafikog korisnikog suelja


Sa aspekta baza podataka znamo sve potrebno za kreiranje aplikacije. Preostaje nam jo neto rei o elementima grafikog korisnikog suelja kakve jo nismo susreli: jahaima, liste Prisjetimo se naa aplikacija treba imati dva suelja: suelje za unos podataka suelje za pretraivanje, izmjenu i brisanje podataka Suelja trebaju biti implementirana pomou dva jahaa na jednom prozoru, a rezultati upita (imena i prezimena osoba) e se ispisivati unutar liste. Klikom na neko ime unutar liste, svi podaci o toj osobi bit e prikazani u posebnim poljima. Jahai Izgled jahaa moemo vidjeti na slici 17-1. Kao i za sve ostale elemente Java ima posebnu klasu koja e nam omoguiti kreiranje jahaa. Podruje na koje emo slagati jahae kreirat emo klasom JTabbedPane. Neki od konstruktora ove klase su: kreira prazno podruje za jahae, pri emu su jahai inicijalno okrenuti prema gore (JTabbedPane.TOP) JTabbedPane (int p) kreira prazno podruje za jahae, pri emu je smjer jahaa odreen parametrom p: JTabbedPane.TOP gore JTabbedPane.BOTTOM dolje JTabbedPane.LEFT lijevo JTabbedPane.RIGHT desno
JTabbedPane ()

219

Kao to smo rekli klasa JTabbedPane nam omoguava kreiranje podruja na koje emo stavljati jahae. Jahae, koje emo stavljati unutar podruja, kreirat emo posebnom klasom JPanel. Najee koriteni konstruktor klase JPanel je:
JPanel ()

kreira objekt klase JPanel

Izmeu ostalih, klasa JPanel nasljeuje klasu Container to znai da je na njega mogue dodavati elemente grafikog korisnikog suelja metodom add (), definirati Layout,... JPanel emo dodati JTabbedPane posebnom metodom addTab (). Osim metode addTab () klasa JTabbedPane ima i niz drugih metoda, a neke od njih su:
void addTab (String s, Component c)

dodaje komponentu c na JTabbedPane pri


Component c)

emu e naslov komponente biti s dodaje komponentu c na JTabbedPane pri emu e naslov komponente biti s, dok e sliica komponente biti i void addTab (String s, Icon i, Component c, String t) dodaje komponentu c na JTabbedPane pri emu e naslov komponente biti s, sliica e biti i, dok e tooltip tekst biti t int getSelectedIndex () vraa redni broj trenutno aktivnog jahaa int getTabCount () vraa ukupni broj jahaa unutar JTabbedPanea void remove (int i) brie jaha s rednim brojem i void setColorAt (int i, Color c) definira pozadinsku boju za jaha s rednim brojem i
void addTab (String s, Icon i,

Lista Lista na prvi pogled ima sline karakteristike kao padajua lista (JOptionPane), meutim rad s listama je u Javi je znatno sloenija od rada s padajuim listama. No to svakako nije razlog da ne kaemo neto i o njima. Klasa koja e kreirati listu na ekranu je JList. Najei konstruktori ove klase su:
JList () kreira objekt klase JList JList (ListModel m) kreira objekt

klase JList koji e prikazivati podatke iz zadanog

modela m Najee koritene metode klase JList su: kreira listener na listi koji prati svaku promjenu na oznaenoj stavki liste int getSelectedIndex () vraa redni broj prve oznaene stavke unutar liste, ukoliko niti jedna stavka nije oznaena vraa -1 int[] getSelectedIndices () vraa niz sa rednim indeksima svih oznaenih stavki liste Object getSelectedValue () vraa prvu oznaenu stavku unutar liste, ukoliko niti jedna stavka nije oznaena vraa null Object[] getSelectedValues () vraa niz sa vrijednostima svih oznaenih stavki liste boolean isSelectedIndex (int n) vraa true ako je element na n-tom mjestu oznaen boolean isSelectionEmpty () vraa true ako niti jedan element liste nije oznaen void setModel (ListModel m) postavlja model m, koji predstavlja sadraj liste void setSelectecIndex (int n) oznaava stavku liste na n-tom mjestu
void addListSelectionListener (ListSelectionListener l)

220

Java i objektno orijentirano programiranje


void setSelectedIndices (int[] a)

oznaava skup stavki, iji su redni brojevi elementi

niza a
void setSelectionBackground (Color c) definira pozadinsku boju oznaene stavke void setSelectionForeground (Color c) definira boju teksta oznaene stavke void setSelectionInterval (int s, int k) oznaava interval stavki

elimo li pratiti dogaaje na listi, morat emo u aplikaciji implementirati i jo jedan interface. Radi se o interfaceu ListSelectionListener, te emo trebati definirati metodu:
void valueChanged(ListSelectionEvent e)

Kao to moemo primijetiti nema metode kojom emo dodati stavku u listu. Ne, nismo ju zaboravili, ona jednostavno ne postoji. Stvar je u tome da je JList samo "ljuska" za popis stavki koje e se u njoj nalaziti. Popis stavki koje e biti ispisane u listi nalazi se u posebnom objektu. Mi emo stavke drati u objektu koji e biti tipa DefaultListModel. DefaultListModel je posebna klasa koja e brinuti o sadraju liste. Samo je jedan konstruktor ove klase: DefaultListModel () kreira objekt klase DefaultListModel Neke od metoda klase DefaultListModel su:
void add (int n, Object o) dodaje objekt na odreeno mjesto u listi void add (Object o) dodaje objekt na posljednje mjesto u listi void clear () brie sve stavke liste boolean contains (Object o) provjerava je li o element liste boolean contains (Object o) provjerava je li o element liste Object elementAt (int n) vraa element koji se nalazi na n-tom mjestu liste int getSize () vraa broj elemenata liste boolean isEmpty () provjerava ima li lista elemenata void removeElementAt (int n) iz liste brie element na n-tom mjestu Object[] toArray () vraa niz koji sadri sve elemente liste u onom redoslijedu

u kojem se

pojavljuju u listi Sada uistinu imamo sve potrebno za kreiranje aplikacije:

221

Service echo echo discard discard systat systat daytime daytime netstat qotd qotd chargen chargen ftp-data ftp telnet smtp time time rlp name name whois domain domain nameserver nameserver mtp bootp tftp gopher rje finger http link supdup hostnames iso-tsap dictionary x400 x400-snd

Port 7 7 9 9 11 11 13 13 15 17 17 19 19 20 21 23 25 37 37 39 42 42 43 53 53 53 53 57 67 69 70 77 79 80 87 95 101 102 103 103 104

Protocol tcp udp tcp udp tcp tcp tcp udp tcp tcp udp tcp udp tcp tcp tcp tcp tcp udp udp tcp udp tcp tcp udp tcp udp tcp udp udp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp

222

Java i objektno orijentirano programiranje


csnet-ns pop pop2 pop3 portmap portmap sunrpc sunrpc auth sftp path uucp-path nntp ntp nbname nbdatagram nbsession NeWS sgmp tcprepo snmp snmp-trap print-srv vmnet load vmnet0 sytek biff exec login who shell syslog printer talk ntalk efs route timed tempo courier conference rvd-control 105 109 109 110 111 111 111 111 113 115 117 117 119 123 137 138 139 144 153 158 161 162 170 175 315 400 500 512 512 513 513 514 514 515 517 518 520 520 525 526 530 531 531 tcp tcp tcp tcp tcp udp tcp udp tcp tcp tcp tcp tcp udp udp udp tcp tcp udp tcp udp udp tcp tcp udp tcp udp udp tcp tcp udp tcp udp tcp udp udp tcp udp udp tcp tcp tcp tcp

223

netnews netwall uucp klogin kshell new-rwho remotefs rmonitor monitor garcon maitrd busboy acctmaster acctslave acct acctlogin acctprinter elcsd acctinfo acctslave2 acctdisk kerberos kerberos

532 533 540 543 544 550 556 560 561 600 601 602 700 701 702 703 704 704 705 706 707 750 750

tcp udp tcp tcp tcp udp tcp udp udp tcp tcp tcp udp udp udp udp udp udp udp udp udp tcp udp tcp udp udp udp tcp tcp tcp udp tcp udp udp tcp tcp tcp tcp tcp tcp tcp

kerberos_master 751 kerberos_master 751 passwd_server userreg_server krb_prop erlogin kpop phone ingreslock maze nfs knetd eklogin rmt mtb man w mantst bnews rscs0 752 753 754 888 1109 1167 1524 1666 2049 2053 2105 5555 5556 9535 9536 9537

10000 tcp 10000 udp

224

Java i objektno orijentirano programiranje


queue rscs1 poker rscs2 gateway rscs3 remp rscs4 rscs5 rscs6 rscs7 rscs8 rscs9 rscsa rscsb qmaster qmaster irc 10001 tcp 10001 udp 10002 tcp 10002 udp 10003 tcp 10003 udp 10004 tcp 10004 udp 10005 udp 10006 udp 10007 udp 10008 udp 10009 udp 10010 udp 10011 udp 10012 tcp 10012 udp 6667 tcp

225

You might also like