Microsoft Word - PRO1_2_Java_2015_12_22

Velikost: px
Začni prikazovanje s strani:

Download "Microsoft Word - PRO1_2_Java_2015_12_22"

Transkripcija

1 ŠOLSKI CENTER VELENJE VIŠJA STROKOVNA ŠOLA Višješolski strokovni program: Informatika PROGRAMIRANJE (1. in 2. letnik) JAVAA Gradivo za interno uporabo (delovna verzija) Sestavil: Srečko Zorman Velenje, 2015 Stran 1 ŠC VELENJE, Višja strokovna šola

2 Vsebina 1 DIAGRAMI POTEKA DP Popoldanske aktivnosti DP Največja vrednost N vstavljenih števil DP Vsota 10-ih vstavljenih števil DP Število vstavljenih števil DP Vsota števil od 1 do N DP Vsota prvih N števil - Gausov algoritem DP Štetje števil glede na kriterij DP Vsota naravnih števil od X do Y DP Geometrijsko zaporedje 1, 2, 4, 8, DP Največji skupni delitelj DP Vsota števk DP Pretvorba arabske številke v rimsko DP Ploščina trikotnika DP Vsota števil od X do Y 24 2 UVOD Struktura programa 25 3 PODATKI, SPREMENLJIVKE Osnovni podatkovni tipi Literali (vrednosti spremenljivk) Znaki Realna števila 34 4 VHODNO IZHODNE OPERACIJE Standardni vhod in izhod Standardni izhod (standard output) Standardni vhod (standard input) 36 5 OPERATORJI, IZRAZI, STAVKI Aritmetični operatorji za cela in realna števila Operatorji prirejanja Relacijski operatorji Logični operatorji (!, &&, ) Bitni operatorji ( &,, ^, ~, <<, >> ) Prioritete operatorjev 40 6 KRMILNI STAVKI Odločitveni stavki If stavek Switch stavek Stavki ponavljanja (zanke) While stavek Do while stavek For stavek Break in continue stavek 58 7 METODE Deklaracija metode Statične metode Metode objekta Formalni in dejanski parametri metode 65 8 TABELA OZ. POLJE Izboljšana oblika for stavka Prenos polja v metodo razreda Uporaba polja ocen izpita Večdimenzionalna polja (tabele) Urejanje podatkov 78 INFORMATIKA, Programiranje 1 in 2 Stran 2

3 8.3.1 Urejanje po metodi izbora najmanjšega elementa Urejanje po metodi mehurčkov (bubble sort) Binarno iskanje Urejanje z vstavljanjem 81 9 RAZRED Uvod v razrede, objekte in metode Razredi (angl. Classes) Atributi oz. polja razreda Metode razreda Lokalne in globalne spremenljivke Večkratno definirane metode Konstruktor OSNOVNE KNJIŽNICE Razred Math Razred Character Razred String Razred Stringbuffer Naključna števila Besedilni dokumenti Branje Pisanje Razred Enum IZJEME Vrste izjem GRAFIKA (AWT, SWING) Enostavno okno Metode razreda Graphics za risanje geometrijskih likov Konstruktorji in metode razreda Color Applet POGOVORNA OKNA RAZREDI (NADALJEVANJE) Preverjanje vrednosti parametrov konstruktorjev Kontrola dostopa do polj razreda Privzeti konstruktor Razred vsebuje objekte drugih razredov Enum (podrobneje) Sproščanje pomnilniškega prostora Statična najava deklaracije Ustvarjanje paketov Primer naključnega izrisa črt Dedovanje (angl. inheritence) Redefinicija metod Oblike dedovanja Kompozicija (angl. composition) Ograjevanje (angl. encapsulation) Polimorfizem Abstraktni razredi Vmesnik (angl. Interface) Aplikacija za bankomat GRAFIČNI VMESNIK (SWING KOMPONENTE)) Grafika (awt, swing) Pogovorna okna Izpis obvestila Seštevanje dveh števil 193 Stran 3 ŠC VELENJE, Višja strokovna šola

4 15.3 Okno (JFrame) Plošča (JPanel) in oznaka (JLabel) Oznaka (JLabel) Besedilna polja (JTextFields, JPasswordFields) Določitev odzivnega dogodka JTextField Splošni odzivni dogodki in poslušalci dogodkov Gumbi AbstractButton JButton Kombinirano vnosno polje (JComboBox) Seznam (JList) Obravnava dogodkov miške Obravnava dogodkov tipkovnice Razporejevalniki VHODNO IZHODNE OPERACIJE Vhodno izhodne operacije Razred File Besedilni dokumenti (txt) Branje Pisanje (razred Formatter) Serializacija Postopek serializacije v datoteko Postopek deserializacije iz datoteke Pogovorno okno za izbor dokumenta (JFileChooser) REKURZIJA Rekurzivne rešitve Fakulteta Fibonaccijevo število PODATKOVNE STRUKTURE Ogrodje Collection Seznam Enosmerni seznam Dvosmerni seznam LinkedList Vmesnik ListIterator Vrsta Izvedba vrste s povezanim seznamom Vrsta z dvema koncema (angl. Deque) Razred PriorityQueue in vmesnik Queue Sklad Razred ArrayList Množica Zgoščena tabela Vmesnik Comparator Razred Properties Sinhronizacija podatkovnih struktur SPLOŠNE (GENERIČNE) METODE IN RAZREDE Uvod v splošne razrede in metode Splošne metode z vračanjem vrednosti splošnega tipa Večkratno definirane splošne metode Splošni (generični) razredi Uporaba znaka? za določitev tipa parametra splošne metode GRAFIČNI VMESNIK (NADALJEVANJE) Drsni trak 283 INFORMATIKA, Programiranje 1 in 2 Stran 4

5 Meni Vsebinski (priročni) meni Slog grafičnega vmesnika Kontrolnik z zavihki (JTabbedPane) Zbirke podatkov (JDBC) JDBC Vzpostavitev povezave z zbirko podatkov Paket java.sql (JDBC) JTable Vmesnik Rowset Krmarjenje po zapisih (tabela države) WINDOWBUILDER VAJE Izpis obvestila Izpis obvestila na zaslon Izračun vsote dveh vnesenih celih števil Ploščine in obsega pravokotnika Zamenjava vrednosti spremenljivk Povprečna starost in povprečna teža Vrednosti relacijskih izrazov Tranzitivnost števil Višine študentov Program za telesno težo Število pozitivnih in negativnih števil Izris pravokotnika Izris pravokotnega trikotnika Izračun fakultete Tabela naključnih števil Izračun obresti Frekvenca pojavitev posameznih ocen študentov Izračun vsote členov zaporedja Praštevilo Števila iz območja, ki so deljiva s tri ali pet Izris sinusne krivulje v besedilnem načinu Izris lika Prestopno leto Največji skupni delitelj Izpis trikotnika števil Dan v tednu Besedilni dokument Izpis lika Reverzni niz Število besed Ločila Meni Največja števka Binarna vrednost Dolžina števila Dan v tednu Določitev ocene Vsota števil deljivih s tri Vsota števil deljivih s pet ali sedem Izpis angleške abecede v padajočem zaporedju 340 Stran 5 ŠC VELENJE, Višja strokovna šola

6 Izpis trikotnika števil Izpis enakostraničnega trikotnika Produkt lihih števil Vsota inverznih števil Vsota števil z enako prvo in zadnjo števko Polje realnih števil Frekvenca pojavitev metov kocke Ustvarjanje in izpis šahovnice Kocka naključnih števil Evidenca študentov Evidenca višin oseb Urejenje števil v tabeli LITERATURA 346 Kazalo slik Slika 1: Diagram poteka za izračun zneska plačila Slika 2: Diagram poteka za popoldanske aktivnosti Slika 3: Diagram poteka za največjo vrednost n vstavljenih števil Slika 4: Diagram poteka za vsoto 10-ih vstavljenih števil Slika 5: Diagram poteka za število vstavljenih števil Slika 6: Diagram poteka za vsoto števil od 1 do n Slika 7: Diagram poteka za vsoto prvih n števil Slika 8: Diagram poteka za štetje števil glede na kriterij Slika 9: Diagram poteka za vsoto naravnih števil od x do y Slika 10: Diagram poteka za geometrijsko zaporedje Slika 11: Diagram poteka za največji skupni delitelj Slika 12: Diagram poteka za vsoto števk Slika 13: Diagram poteka za pretvorbo arabske številke v rimsko Slika 14: Diagram poteka za ploščino trikotnika Slika 15: Diagram poteka za vsoto števil od X do Y Slika 16: Diagram poteka za if stavek (oblika 1) Slika 17: Diagram poteka za if stavek (oblika 2) Slika 18: Diagram poteka za if stavek (oblika 3) Slika 19: Diagram poteka za if stavek (oblika 4) Slika 20: Diagram poteka za gnezden if stavek (oblika 5) Slika 21: Diagram poteka za while stavek (oblika 1) Slika 22: Diagram poteka za while stavek (oblika 2) Slika 23: Diagram poteka za do while stavek (oblika 1) Slika 24: Diagram poteka za do while stavek (oblika 2) Slika 25: Diagram poteka za for stavek (oblika 1) Slika 26: Diagram poteka za for stavek (oblika 2) Slika 27: For stavek (združen števec in pogoj) Slika 28: Formalni in dejanski parameter Slika 29: Prenos parametrov Slika 30: Prenos parametrov Slika 31: Del izpeljanih razredov razreda Throwable Slika 32: Koordinatni sistem Slika 33: Koordinate gradniki Slika 34: Enostavno okno Slika 35: Geometrijski liki Slika 36: Applet geometrijski liki Slika 37: Pretvorba eurov v dolerje Slika 38: Sierpinski trikotniki INFORMATIKA, Programiranje 1 in 2 Stran 6

7 Slika 39: Sierpinski trikotniki primer izvajanja Slika 40: Izpis sporočila Slika 41: Vnos predmeta Slika 42: Izpis predmeta Slika 43: Nepravilna raba privatnih atributov Slika 44: Risanje naključnih črt Slika 44: Razredna hierarhija likov Slika 44: Razredni diagram Slika 47: Pogovorno okno za izpis obvestila Slika 48: Sporočilo Slika 49: Pogovorno okno za vnos Slika 50: Vnos Slika 51: Sporočilo Slika 52: Vnos števila Slika 53: Vnos števila Slika 54: Izpis izračuna Slika 55: Hiearhija osnovnih razredov GUI Slika 56: Osnovno okno Slika 57: Okno z naslovom in ikono Slika 58: Oznake Slika 59: Vnosna polja Slika 60: Odziv dogodka Slika 61: Dogodkovni razredi Slika 62: Poslušalci Slika 63: Registracija poslušalca Slika 64: Hiearhija swing gumbov Slika 65: Vmesnik Euro v $ Slika 66: Vmesnik s kombiniranim poljem Slika 67: Uporaba kombiniranega polja (1) Slika 68: Uporaba kombiniranega polja (2) Slika 69: Seznam barv Slika 70: Izbor s seznamom Slika 71: Primer izbora Slika 72: Dodajanje in brisanje elementov seznama Slika 73: Evidenca dogodkov miške Slika 74: Evidenca med izvajanjem Slika 75: Risanje sledi miške Slika 76: Evidenca dogodkov tipkovnice Slika 77: Izgled vmesnika z razporejevalnikom Slika 78: Delovanje razporejevalnika Slika 79: Paket java.io Slika 80: Uporaba pogovornega objekta JFileChooser Slika 81: Hierarhija razredov orgodja Collection Slika 82: Vozlišče seznama Slika 83: Enosmerni seznam Slika 84: Vstavljanje elementa v enosmerni seznam Slika 85: Brisanje elementa enosmernega seznama Slika 86: Dvosmerni seznam Slika 87: Dodajanje na začetek dvosmernega seznama Slika 88: Dodajanje za oz. pred elementom dvosmernega seznama Slika 89: Brisanje elementom dvosmernega seznama Slika 90: Pomnilniška slika dvosmernega seznama Slika 91: Predstavitev dvosmernega seznama Slika 92: Vrsta Slika 93: Dodajanje v vrsto Stran 7 ŠC VELENJE

8 Slika 94: Izvedba vrste s tabelo Slika 95: Izvedba vrste s povezanim seznamom Slika 96: Sklad Slika 97: Določitev mesta prenosa Slika 98: Izbor elementov INFORMATIKA, Programiranje 1 in 2 Stran 8

9 1 DIAGRAMI POTEKA Algoritem pomeni splošen postopek (metodo) za reševanje problemov. Računalnik zna izvrševati le postopke, ki so mu predpisani z njemu razumljivimi ukazi. V računalništvu algoritem pomeni postopek (metodo), ki jo lahko izvaja računalnik, da pride do rešitve problema. Algoritem lahko zapišemo na več različnih načinov: z naravnim jezikom (npr. kuharski recept), diagrami poteka (grafičen prikaz strukture programa), struktogrami (grafičen prikaz strukture programa), psevdokodo... Program je v programskem jeziku zapisan algoritem. Vsak računalniški problem lahko rešimo z izvršitvijo različnih aktivnosti, ki jih moramo izvršiti v pravilnem vrstnem redu oz. zaporedju. Program mora biti zapisan natančno po pravilih zapisovanja programa (sintaksa programskega jezika), saj računalnik lahko "razume" le omejen nabor ukazov. Diagrami poteka uporabljajo grafične simbole za prikaz strukture algoritma oz. postopka reševanja problema. Elementi diagramov poteka Grafični simbol oz. element Pomen Začetek ali konec diagrama Vhodno/izhodne operacije Proces oz. aktivnost (operacije) Definiran proces (podprogram) Odločitev oz. vejitev (pogoj) Povezovalni element (nadaljevanje strani) Povezovalni element (konec strani) Pot izvajanja Stran 9 ŠC VELENJE

10 Programi za risanje diagramov poteka: Microsoft Visio, yed (brezplačni program za izdelavo diagramov poteka). Dostopen na php ( ).... Terminologija Spremenljivka - celica v pomnilniku, kjer je shranjena vrednost (a,b,c,s,p). Izraz (angl. expression) - izračunljiva formula ali predpis, po katerem se izračuna določena vrednost. Prirejanje vrednosti - zapis oz. vpis vrednosti v spremenljivko ( ali =). Primer Diagram poteka za izračun zneska plačila. Uporabnik vpiše število opravljenih ur in znesek urne postavke. Slika 1: Diagram poteka za izračun zneska plačila INFORMATIKA, Programiranje 1 in 2 Stran 10

11 1.1 DP Popoldanske aktivnosti Če bo popoldan lepo vreme, pojdi na košarko v nasprotnem preberi knjigo. Kasneje preveri, če že znaš pesem, ki ste se jo začeli učiti v šoli. Če je ne znaš, jo beri tako dolgo, da jo boš znal povedati brez besedila. Zvečer pojdi spat. Slika 2: Diagram poteka za popoldanske aktivnosti Stran 11 ŠC VELENJE

12 1.2 DP Največja vrednost N vstavljenih števil Uporabnik vnese koliko števil bo vstavil (N). Program za N vnesenih števil izpiše največje število. Slika 3: Diagram poteka za največjo vrednost n vstavljenih števil INFORMATIKA, Programiranje 1 in 2 Stran 12

13 Tabela: Sled izvajanja N NAJVECJE_ STEVILO STEVILO STEVEC STEVEC < N => STEVILO > NAJVECJE_ STEVILO => < 5 resnično > 10 neresnično 2 < 5 resnično > 10 resnično < 5 resnično 4 4 > 15 neresnično 4 4 < 5 resnično 8 8 > 15 neresnično 5 5 < 5 neresnično 1.3 DP Vsota 10-ih vstavljenih števil Izračun vsote 10-ih vstavljenih števil. Tabela: Sled izvajanja STEVEC VSOTA STEVILO STEVEC < 10 => <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 resnično <= 10 neresnično Slika 4: Diagram poteka za vsoto 10-ih vstavljenih števil Stran 13 ŠC VELENJE

14 1.4 DP Število vstavljenih števil Uporabnik vnaša števila dokler ne vnese vrednost števila 0. Program izpiše število vstavljenih števil. Tabela: Sled izvajanja STEVILO_ STEVIL STEVILO STEVILO <> 0 => <> 0 resnično <> 0 resnično <> 0 resnično <> 0 resnično <> 0 resnično <> 0 resnično <> 0 neresnično Slika 5: Diagram poteka za število vstavljenih števil INFORMATIKA, Programiranje 1 in 2 Stran 14

15 1.5 DP Vsota števil od 1 do N Izračun vsote celih števil od 1 do N. N je zgornja meja, ki jo določi uporabnik. Npr. N = 5 Izračun: Vsota je 15. Tabela: Sled izvajanja STEVILO <> N STEVEC_I 0 => VSOTA <= 5 resnično <= 5 resnično <= 5 resnično <= 5 resnično <= 5 resnično 15 6 <= 5 neresnično Slika 6: Diagram poteka za vsoto števil od 1 do n Stran 15 ŠC VELENJE

16 1.6 DP Vsota prvih N števil - Gausov algoritem Izračun vsote celih števil od 1 do N. N je zgornja meja, ki jo določi uporabnik. Izračun vsote z uporabo Gaussovega algoritma. Vsota = N * (N+1) / 2 Npr. N = 5 Izračun: Vsota = 5 * (5+1) / 2 Vsota = 30 / 2 Vsota = 15 Slika 7: Diagram poteka za vsoto prvih n števil INFORMATIKA, Programiranje 1 in 2 Stran 16

17 1.7 DP Štetje števil glede na kriterij Uporabnik vnaša števila, dokler ne vnese števila 0 (0 - konec vnosa). Ugotovimo in izpišemo število vnesenih števil, ki so večja od 50. Slika 8: Diagram poteka za štetje števil glede na kriterij Stran 17 ŠC VELENJE

18 1.8 DP Vsota naravnih števil od X do Y Izračun vsote naravnih števil iz območja od števila X do števila Y. Uporabnik določi območje za izračun (X.. Y). Slika 9: Diagram poteka za vsoto naravnih števil od x do y INFORMATIKA, Programiranje 1 in 2 Stran 18

19 1.9 DP Geometrijsko zaporedje 1, 2, 4, 8, Podano je geometrijsko zaporedje 1, 2, 4, 8, Določite i-ti člen, ki povzroči, da je vsota i-členov zaporedja večja od 450. i-člen = 2 * (i-1)-člen Slika 10: Diagram poteka za geometrijsko zaporedje Stran 19 ŠC VELENJE

20 1.10 DP Največji skupni delitelj Največji skupni delitelji (NSD) dveh celih števil (Evklidov algoritem). NSD(X,X) = X NSD(X,Y) = NSD(Y,X) Če je X > Y => NSD(X,Y) = NSD(X-Y,Y) Uporabnik vpiše dve celi števili. Program poišče in izpiše največji skupni delitelj vnesenih števil. Npr. X = 16, Y = 12 NSD(12, 16) = 4 Tabela: Sled izvajanja X Y X <> Y => X > Y <> 12 resnično 16 > <> 12 resnično 4 > <> 8 resnično 4 > <> 4 neresnično Slika 11: Diagram poteka za največji skupni delitelj INFORMATIKA, Programiranje 1 in 2 Stran 20

21 1.11 DP Vsota števk Izračun vsote števk celega števila. Število vstavi uporabnik. 8 % 3 = 2 % ostanek po celoštevilčnem deljenju 8 / 2 = 4 / celoštevilčno deljenje Npr. število = 124 vsota števk = = 7 Slika 12: Diagram poteka za vsoto števk Stran 21 ŠC VELENJE

22 1.12 DP Pretvorba arabske številke v rimsko Pretvorba arabskega števila v rimsko število ( 1- I, 2 - II, 3 - III, 4 - IV, 5 - V, 6 - VI, 7 -VII, 8 - VIII, 9 - IX, 10 - X, 20 - XX, 30 - XXX, 40 - XL, 50 - L, 60 - LX, 90 - XC, C CD, D, CM, M) Slika 13: Diagram poteka za pretvorbo arabske številke v rimsko INFORMATIKA, Programiranje 1 in 2 Stran 22

23 1.13 DP Ploščina trikotnika Izračun ploščine trikotnika, če so znane vse tri stranice trikotnika. Heronov obrazec ploščina = s = (a + b + c) / 2; Pogoj za obstoj trikotnika: vsota poljubnih dveh stranic je večja od tretje stranice. Slika 14: Diagram poteka za ploščino trikotnika Stran 23 ŠC VELENJE

24 1.14 DP Vsota števil od X do Y Vsota števil od števila X do števila Y (Gaussov postopek): Gaussov postopek (Y > X) Vsota = x + (x+1) + (x+2) + (x+3) (y-2) + (y-1) + y enačbi seštejemo (+) Vsota = y + (y-1) + (y-2) + (y-3) (x+2) + (x+1) + x *Vsota = (x+y) + (x+y) + (x+y) (x+y) + (x+y) +(x+y) (y-x + 1) elementov 2 * Vsota = (x+y) * (y-x+1) Vsota = ((x+y) * (y-x+1)) / 2 Če je x = 1: 2 * Vsota = (1+y) * (y) Vsota = ((1+y) * (y)) / 2 Slika 15: Diagram poteka za vsoto števil od X do Y INFORMATIKA, Programiranje 1 in 2 Stran 24

25 2 UVOD Java je objektno usmerjeni, prenosljivi programski jezik, ki ga je razvil James Gosling s sodelavci v podjetju Sun Microsystems. Projekt, ki se je v začetku (leta 1991) imenoval Oak (hrast). Razvit je bil kot zamenjava za programski jezik C++. Jave ne smemo zamenjevati z jezikom JavaScript, ki ima podobno ime ter podobno skladnjo (programski jezik C). Java različica 1.0 je bila objavljena leta Javo vzdržuje in posodablja Oracle - Sun Microsystems. Spletišče: ( ). Tolmač za javo je vgrajen v večino spletnih brskalnikov. Javanski program (angl. applet) se lahko izvaja kot del HTML dokumenta. Poznamo 3 vrste Jave: J2SE - standardna različica Jave za osebne računalnike, J2ME - različica Jave za mini naprave (mobiteli, pametni televizorji...), J2EE - poslovna različica Jave. V Javi programiramo tudi aplikacije na mobilnih telefonih (J2ME) in pametnih telefonih z operacijskim sistemom Android. Različice programskega jezika Java: JDK 1.0 (January 21, 1996), JDK 1.1 (February 19, 1997), J2SE 1.2 (December 8, 1998), J2SE 1.3 (May 8, 2000), J2SE 1.4 (February 6, 2002), J2SE 5.0 (September 30, 2004), Java SE 6 (December 11, 2006), Java SE 7 (July 28, 2011). Java SE Struktura programa Primer 1: Izpis obvestila na zaslon. Program na zaslon izpiše besedilo: Primer prvega programa. Pozdrav. 1. public class P1_1 // najava razreda P1_1 2. { 3. public static void main(string[] args) 4. { // Izpis na zaslon z uporabo standardnega izhodnega toka - razred System. 5. // Izhodni tok je samodejno na voljo za izhodne podatke 6. System.out.print("Primer prvega programa."); 7. System.out.print("\n"); // prehod v novo vrstico new line \n 8. System.out.print("Pozdrav."); 9. } // konec metode main 10. } // konec razreda P1_1 Stran 25 ŠC VELENJE

26 Primer prvega programa. Pozdrav. Vsak program v Javi vsebuje vsaj en razred. Program začnemo s public class, ki predstavlja najavo razreda. Rezerviranki class sledi ime razreda (P1_1). Ime razreda je identifikator, ki ga po dogovoru začnemo z veliko začetnico. Če je ime sestavljeno iz več besed, jih zapišemo brez presledkov; vsako besedo začnemo z veliko začetnico. Identifikator je zaporedje znakov, ki vsebuje črke, števke, podčrtaj in znak dolar ($). Ime identifikatorja se ne začne s števko in ne vsebuje presledkov. Java razlikuje velike in male črke (angl. case sensitive). Identifikatorja stevilo1 in Stevilo1 sta dva različna identifikatorja. Deklaracija razreda vsebuje eno ali več metod razreda. V programu moramo določiti metodo main (vrstica 3). Metoda main predstavlja mesto začetka izvajanja vsakega programa. Metode predstavljajo aktivnosti razreda in lahko vrnejo informacije o zaključku izvedbe aktivnosti. Rezerviranka void določa, da metoda ne vrne vrednosti. String[] args v okroglih oklepajih je zahtevan del deklaracije metode main. Predstavlja vhodne argumente metode. Telo metode je območje med zavitimi oklepaji (v primeru od vrstice 4 do vrstice 9). Izpis na zaslon izvede ukaz System.out.print. System.out.print("Primer prvega programa.") izpiše na zaslon besedilo med dvojnimi narekovaji (argument metode). Objekt System.out predstavlja standardni izhodni objekt za izpis informacij v izhodnem oknu. Komentarji so zapisani med znaki /* in */ (večvrstični) ali za znakom // (enovrstični). Komentar je lahko tudi čez več vrstic. Vsak stavek se konča s podpičjem. Komentar Komentar je del kode, ki jo prevajalnik (angl. compiler) izpusti in je namenjen za opombe in opise (dokumentiranje) programske kode. Komentar lahko zapišemo na dva načina: // komentar v vrstici (vsebina desno od // se obravnava kot komentar); /* blok s komentarjem */. V besedilo lahko vstavimo tudi posebne znake - ubežne sekvence (angl. escape sequence): \n (angl. Newline) Postavitev utripalke na začetek naslednje vrstice. \t (angl. Horizontal tab) Premik utripalke na položaj naslednjega tabulatorja. \r (angl. Carriage return) Postavitev utripalke na začetek trenutne vrstice. Izhodni znaki za potrditveno tipko prepisujejo znake v trenutni vrstici. \\ (angl. Backslash) Izpis poševnice nazaj. \" (angl. Double quote) Izpis dvojnega narekovaja. Izpis besedila z metodo printf Metodo System.out.printf (f angl. formatted ) uporabljamo za oblikovanje izpisa podatkov. Sintaksa: public PrintStream printf(string format, Object... args) V prvem argumentu (format) določimo obliko izpisa; v ostalih argumentih pa podatke oz. informacije, ki jih izpisujemo. Argumente med seboj ločimo z vejico. Prvi argument lahko vsebuje besedilo izpisa in oblikovalna določila. Ukaz System.out.printf("\n\n%s\n%s\n","Primer novega", "izpisa") izpiše: dva prehoda v novo vrstico (\n), besedilo (%s; drugi argument), prehod v novo vrstico (\n), besedilo (%s, tretji argument) in prehod v novo vrstico. INFORMATIKA, Programiranje 1 in 2 Stran 26

27 Primer novega izpisa Primer 2: Izračun vsote dveh celih števil. Uporabnik vpiše dve celi števili. Program izpiše rezultat v obliki: Vsota števil število_1 + število_2 = vsota. Java ima definirane razrede, ki jih lahko uporabljamo v programih. Definirani razredi so združeni v pakete (angl. packages) - poimenovane skupine pomensko sorodnih razredov - Java class library oz. Java Application Programming Interface (Java API). 1. // Najava uporabe (deklaracija) razreda Scanner iz paketa java.util 2. import java.util.scanner; public class Vsota 5. { 6. public static void main(string[] args) 7. { 8. // ustvarimo primerek objekta Scanner za vnos v ukaznem oknu 9. Scanner vhod = new Scanner(System.in); 10. //spremenljivke za vhodna števila podatkovnega tipa integer 11. int operand1; //prvo število 12. int operand2; //drugo število 13. int vsota; //spremenljivka rezultat podatkovnega tipa integer 14. System.out.print("Prvo celo število: "); //izpis obvestila za vnos 15. operand1 = vhod.nextint(); //branje prvega števila System.out.print("Drugo celo število: "); //izpis obvestila za vnos 18. operand2 = vhod.nextint(); //branje drugega števila // izračun vsote 21. vsota = operand1 + operand2; 22. //izpis rezultata 23. System.out.printf("Vsota števil %d + %d = %d.", operand1, operand2, vsota); 24. } // konec metode main 25. } Prvo celo število: 45 Drugo celo število: 56 Vsota števil = 101. import java.util.scanner; je najava deklaracije, ki omogoča prevajalniku poiskati razred, ki je uporabljen v programu. Določi uporabo razreda Scanner iz paketa java.util. public class Vsota predstavlja začetek deklaracije razreda Vsota. Ime dokumenta (datoteke) je Vsota.java. Izvajanje programa se začne v metodi main (od vrstice 6 do vrstice 24). Deklaracija in ustvarjanje predmeta (objekta) razreda Scanner za pridobitev vrednosti vnosa Vrstica 9 Scanner vhod = new Scanner(System.in); Stran 27 ŠC VELENJE

28 je deklaracijski stavek, ki določi ime (vhod) in podatkovni tip (Scanner) spremenljivke za branje podatkov (besedil in števil). Podatke lahko pridobimo iz različnih virov (vnos uporabnika, shranjeni dokumenti...). Pred uporabo predmeta Scanner ga moramo ustvariti in mu določiti vir podatkov. Znak = predstavlja prireditveni stavek; izraz desno od znaka enačaj (=) se ovrednoti (izračuna) in shrani v spremenljivko vhod. Izraz vsebuje rezerviranko new, ki ustvari nov primerek objekta Scanner. Ta objekt vsebuje znake, ki jih uporabnik vpiše preko tipkovnice. Standardni vhodni objekt System.in omogoča programu branje vhodnih zlogov informacij uporabnika. Scanner pretvori vnesene podatke v celoštevilčni podatkovni tip. Vrstice 11, 12 in 13 vsebujejo deklaracijo spremenljivk v katere se shranjujejo celoštevilčne vrednosti (podatkovni tip integer). Pred vnosom podatkov uporabniku izpišemo obvestilo. Ukaz System.out.print("Prvo celo število: ") obvesti uporabnika, glede aktivnosti, ki jo mora izvršiti. Vrstica 15 operand1 = vhod.nextint() uporabi vhodno metodo nextint razreda Scanner, da prebere celoštevilno vrednost vnesenega podatka. Na tem mestu se program ustavi, da uporabnik vpiše podatek in potrdi vnos s potrditveno tipko (Enter). Predvideno je, da uporabnik vnese celoštevilčni podatek. V nasprotem primeru se izvajanje programa prekine (napaka pri izvajanju). V primeru veljavnega vnosa celega števila se vnesena vrednost shrani v spremenljivko operand1. Izpis obvestila in branje drugega operanda oz. števila se izvede v vrsticah 17 in 18. Seštevanje števil izvedemo z uporabo spremenljivk. V vrstici 21 vsota = operand1 + operand2; v prireditvenem stavku izračunamo vrednost izraza desno od znaka enačaj (=). Operator + izračuna vsoto vrednosti operandov. Rezultat seštevanja se shrani v spremenljivko vsota. Razlaga stavka: spremenljivki vsota določimo vrednost izraza operand1 + operand2. Po izvršitvi seštevanja v vrstici 23 System.out.printf("Vsota števil %d + %d = %d.", operand1, operand2, vsota) z metodo System.out.printf izpišemo rezultat seštevanja. Oblikovalno določilo %d predstavlja mesta izpisa celih števil (drugi, tretji in četrti parameter). Vsoto števil lahko izračunamo tudi v printf stavku. V tem primeru namesto vrstic 21 in 23 zapišemo stavek: System.out.printf("Vsota števil %d + %d = %d.", operand1, operand2, (operand1 + operand2)); Pomnilniška slika Spremenljivke predstavljajo lokacije oz. mesta v pomnilniku, kjer so shranjeni podatki. Po izvršitvi stavka v vrstici 15, ko uporabnik potrdi vnos števila se v pomnilnik shrani vnesena vrednost. Predpostavimo, da uporabnik vnese vrednost 45. Računalnik shrani vrednost 45 na lokacijo spremenljivke operand1 v pomnilnik in prepiše obstoječo vrednost na tej lokaciji (prejšnja vrednost na tej lokaciji je izgubljena). operand1 45 Po izvršitvi stavka v vrstici 18, ko uporabnik potrdi vnos drugega števila. Predpostavimo, da uporabnik vnese vrednost 56. operand1 45 operand2 56 Po izvršitvi seštevanja oz. stavka v vrstici 21. operand1 45 operand2 56 vsota 101 INFORMATIKA, Programiranje 1 in 2 Stran 28

29 Osnovna struktura oz. lupina programa public class <ime_razreda> { public static void main(string[] args) { // stavki } } 3 PODATKI, SPREMENLJIVKE Podatki Program obdeluje podatke, ki jih shranjuje v pomnilniku in se med izvajanjem programa lahko spreminjajo ali so konstantni. Podatek je shranjen v pomnilniku na enoličnem naslovu pomnilniški lokaciji in zasede toliko prostora, kot ga potrebujemo glede na podatkovni tip podatka. Spremenljivke Spremenljivka je pomnilniška lokacija (celica), v kateri je shranjena posamezna vrednost. Ime spremenljivke ali konstante naj bo smiselno in naj pove čim več o vlogi spremenljivke. Ime je lahko poljubna kombinacija črk (angleška abeceda) in števk ter znaka podčrtaj ('_'). Prvi znak mora biti obvezno črka ali znak '_'. Prevajalnik razlikuje velike in majhne črke. St in st sta dve različni spremenljivki. Za ime ne smemo uporabiti imena rezervirank. Tabela: Rezerviranke abstract double int strictfp ** boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto * protected transient const * if public try continue implements return void default import short volatile do instanceof static while * rezerviranka trenutno ni v uporabi ** rezerviranka dodana v verziji Java 2 Vse rezervirane besede pišemo z malimi črkami. Lastnosti spremenljivk: ime spremenljivke, podatkovni tip, naslov pomnilniške lokacije, kjer je spremenljivka shranjena, vrednost spremenljivke. Podatkovne tipe delimo v dve skupini in sicer: osnovni podatkovni tipi, Stran 29 ŠC VELENJE

30 referenčni podatkovni tip (oz. kazalci) Osnovni podatkovni tipi Spremenljivke (podatki) so shranjene v računalniku v enem ali več zlogih (angl. byte). Različnih možnih znakov je toliko, da lahko shranimo vsak znak v enem zlogu (8 bitov). Da prevajalniku povemo, koliko prostora naj rezervira za posamezno spremenljivko, moramo pred uporabo spremenljivke deklarirati oz. najaviti. Sintaksa: <podatkovni_tip> <ime_spremenljivke> [ = <vrednost>][, <ime_spremenljivke> [= <vrednost>]...] ; // [ ] - opcija Najprej zapišemo podatkovni tip spremenljivke, nato ime spremenljivke ali več spremenljivk istega tipa (če jih je več, jih med seboj ločimo z vejico). Deklariramo lahko tudi vsako spremenljivko posebej. Deklaracija predstavlja stavek, ki ga zaključimo s podpičjem (;). Osnovni podatkovni tipi so: celoštevilčni podatkovni tipi: byte, short, int (integer), long; realni podatkovni tip: float: realno število enojne natančnosti, double: realno število dvojne natančnosti; znakovni podatkovni tip: char (character); en znak (črka, cifra ali drugi znak); logični podatkovni tip: boolean. Primeri deklaracij: int x, y, z; // Deklaracija treh celoštevilčnih spremenljivk x, y in z. short i = 10, j = 10; // Deklaracija in inicializacija celoštevilčnih spremenljivk i in j. byte k = 22; // Deklaracija in inicializacija spremenljivke k. double pi = ; // Deklaracija in inicializacija spremenljivke pi. char znak = 'z'; // Deklaracija in inicializacija znakovne spremenljivke znak. Spremenljivki lahko določimo vrednost iz predpisanega območja glede na to, kakšnega podatkovnega tipa je. Podatkovni tip Število zlogov Območje oz. obseg byte 1 zlog (8 bitov) od -127 do short 2 zloga (16 bitov) od 32,768 do +32,767 ( 2 15 to ) int 4 zlogi (32 bitov) od 2,147,483,648 do +2,147,483,647 ( 2 31 do ) long 8 zlogov (64 bitov) od 9,223,372,036,854,775,808 do +9,223,372,036,854,775,807 ( 2 63 do ) char 2 zloga '\u0000' do '\uffff' (0 do 65535) float 4 zlogi (IEEE 754) Negativno območje: E+38 do e 45 Pozitivno območje: e 45 do E+38 double 8 zlogov (IEEE 754) Negativno območje: E+308 do e 324 Pozitivno območje: INFORMATIKA, Programiranje 1 in 2 Stran 30

31 Podatkovni tip Število zlogov Območje oz. obseg boolean 1 true ali false Kazalci (referenčni podatkovni tip) e 324 do E+308 Kazalčne spremenljivke se uporabljajo za dostop do vrednosti primerkov objektov posameznih razredov. Te spremenljivke so posebnega podatkovnega tipa, ki ga ni možno spremeniti (podatkovni tip). Vrednost kazalčne spremenljivke je pomnilniški naslov. Spremenljivke razrednih objektov (predmetov) in spremenljivke polj oz. tabel so kazalci oz. referenčni podatkovni tip. Privzeta vrednost kazalčne spremenljivke je null (kazalec ne kaže na objekt v pomnilniku). Kazalčno spremenljivko lahko uporabimo za dostop do vrednosti predmeta deklariranega podatkovnega tipa. Primer: Oseba oseba = new Oseba("Janez","Novak"); Literali (vrednosti spremenljivk) Literali so vrednosti, ki jih uporabljamo v programski kodi brez izračunov oz. računskih izrazov. Npr. byte stevilo = 68; char znak ='A'; Vrednosti spremenljivk celoštevilčnih podatkovnih tipov byte, int, long, short lahko določimo v desetiškem, osmiškem ali šestnajstiškem številskem sistemu. Vrednosti oz. literali, ki se začno s predpono 0, se interpretirajo kot osmiška števila; vrednosti, ki se začno s predpono 0x ali 0X se interpretirajo kot šestnajstiška števila. Celoštevilski literali so zaporedja števk (0..9), pred katerimi lahko stoji predznak (+ oz. -). Med tisočicami ni pike, in ne smemo uporabiti decimalne vejice. Prav tako za njih ne smemo uporabiti znanstvenega zapisa. Pogosto uporabimo literale za inicializacijo (dodeljevanje začetnih vrednosti) spremenljivk. Npr.: int desetisko_stevilo = 68; int osmisko_stevilo = 012; int sestnajstisko_stevilo = 0x32; Besedilne vrednosti predstavlja zaporedje znakov med dvojnimi narekovaji npr. "besedilo". Npr.: "besedilna vrednost" "prva vrstica\ndruga vrstica" "\"Besedilo v narekovajih\"" Podatkovna tipa String in char lahko vsebujeta katerikoli Unicode znak (UTF-16). Npr.: char znak ='\u0030'; // znak 0 String besedilo ="\u0050"; Primer: 1. public class P1_3 2. { 3. public static void main(string[] args) 4. { 5. // deklaracija 6. int a; Stran 31 ŠC VELENJE

32 7. int b; 8. int rezultat; 9. // obdelava 10. a = 5; b = 2; 11. a = a + 1; 12. rezultat = a - b; 13. // izpis 14. System.out.printf("\nVrednost spremenljivke rezultat je: %d", rezultat); 15. } // konec main 16. } // konec P1_3 Vaja: Napišite program, ki bo izračunal porabo goriva avtomobila. Vhodni podatki: število prevoženih kilometrov st_prevoz_km število litrov, ki smo jih natočili st_litrov Izhodni podatki: poraba na 100 km - poraba Izračun: st_prevoz_km... st_litrov poraba poraba = st_litrov * 100 / st_prevoz_km Algoritem: vnos vhodnih podatkov izračun porabe izpis porabe Znaki Znakovni podatkovni tip (char) v bistvu določa nepredznačeno celo število. To število je interpretirano kot znak v kodni shemi Unicode. Znak je predstavljen s 16-bitno kodo sestavljeno iz 16 bitov (znaki 0 ali 1). V tej tabeli ima črka 'a' vrednost '\u0061', črka 'A' pa vrednost 'u\0041' in znak '0' vrednost '\u0030'. Znak lahko zapišemo: med dvema enojnima narekovajema: 'A', z njegovo šestnajstiško kodo: '\u0041'. \u je ubežna sekvenca, ki "določa" numerično kodo. Znakovna konstanta je črka med enojnima narekovajema. Če narekovaje izpustimo se interpretira kot spremenljivka. Med enojnima narekovajema ne sme biti več znakov (npr. 'avto'). Znake, ki jih ni na tipkovnici, lahko določimo s pomočjo ubežnih sekvenc. Primeri ubežnih sekvenc: \n - nova vrstica, \t - tabulator, \b - pomik za znak v levo, \r - pomik na začetek vrstice, \f - pomik na novo stran, \\ - poševna črta nazaj, INFORMATIKA, Programiranje 1 in 2 Stran 32

33 \' - enojni narekovaj, \" - dvojni narekovaj. Dec Šest Znak Dec Šest Znak 0 00 NUL '\0' DLE (data link escape) 1 01 SOH (start of heading) DC1 (device control 1) 2 02 STX (start of text) DC2 (device control 2) 3 03 ETX (end of text) DC3 (device control 3) 4 04 EOT (end of transmission) DC4 (device control 4) 5 05 ENQ (enquiry) NAK (negative ack.) 6 06 ACK (acknowledge) SYN (synchronous idle) 7 07 BEL '\a' (bell) ETB (end of trans. blk) 8 08 BS '\b' (backspace) CAN (cancel) 9 09 HT '\t' (horizontal tab) EM (end of medium) 10 0A LF '\n' (new line) 26 1A SUB (substitute) 11 0B VT '\v' (vertical tab) 27 1B ESC (escape) 12 0C FF '\f' (form feed) 28 1C FS (file separator) 13 0D CR '\r' (carriage ret) 29 1D GS (group separator) 14 0E SO (shift out) 30 1E RS (record separator) 15 0F SI (shift in) 31 1F US (unit separator) SPACE ! " # $ % & ( ) A * 58 3A : 43 2B B ; 44 2C, 60 3C < 45 2D D = 46 2E. 62 3E > 47 2F / 63 3F? 64 Stran 33 ŠC VELENJE

34 Dec Šest Znak Dec Šest Znak A a B b C c D d E e F f G g Dec Šest Znak Dec Šest Znak H h I i 74 4A J 106 6A j 75 4B K 107 6B k 76 4C L 108 6C l 77 4D M 109 6D m 78 4E N 110 6E n 79 4F O 111 6F o P p Q q R r S s T t U u V v W w X x Y y 90 5A Z 122 7A z 91 5B [ 123 7B { 92 5C \ '\\' 124 7C 93 5D ] 125 7D } 94 5E ^ 126 7E ~ 95 5F _ 127 7F DEL ` Realna števila Uporabljamo jih predvsem pri matematičnih operacijah. Omogočajo zapis večjih števil in decimalnega dela. Zavzamejo več pomnilniškega prostora in izvajanje je počasnejše. Realne konstante so zaporedja števk z možnim predznakom, decimalnim delom in eksponentnim delom. Eksponentni del označimo s črko e (E) in celoštevilsko konstanto. Ta določa, da moramo število pred decimalno vejico premakniti za toliko mest v desno, kolikor je velikost konstante za znakom e. V realni konstanti ne sme biti presledkov. Pozor: uporabljamo decimalno piko in ne decimalne vejice. Izpustimo lahko pozitivne predznake in vse ničle pred decimalno piko. Npr.: ,.056,.8e-5, 1002., INFORMATIKA, Programiranje 1 in 2 Stran 34

35 Vaja: Napišite program, ki izpiše znesek denarja, ki ga mora vrniti prodajalka, če vstavimo znesek računa in vplačan znesek kupca. Vhodni podatki: znesek računa znesek_racuna vplačan znesek znesek_placan Izhodni podatki: vračilo znesek_vracilo Izračun: znesek_vracilo = znesek_racuna - znesek_placan Algoritem: vnos vhodnih podatkov izračun vračila izpis vračila Povzetek Podatkovne tipe delimo na osnovne podatkovne tipe in reference (referenca je mesto oz. lokacija, kjer je predmet oz. objekt shranjen v pomnilniku). Osnovni podatkovni tipi so boolean, byte, char, short, int, long, float in double. Podatkovni tip float predstavlja realna števila enojne natančnosti; podatkovni tip double pa realna števila dvojne natančnosti. 4 VHODNO IZHODNE OPERACIJE 4.1 Standardni vhod in izhod Za standardni vhod/izhod (angl. Input/Output) uporabljamo metode razredov keyboard, screen, files ali kombinacije le teh. Vnos in izpis podatkov v preprostih programih izvršimo v konzolnem oknu (angl. console input/output). Za vhod/izhod lahko uporabimo tudi pogovorna okna Standardni izhod (standard output) Za izpis na standardni izhod (zaslon) v konzolnem oknu uporabljamo metode razreda System.out. Pri tem nam ni potrebno ustvariti primerka objekta System.out. V programu nam je le-ta vedno na voljo. Za izpis v konzolnem oknu uporabljamo metode: print( ), printf( ) in println( ). Metoda print( ) println( ) printf( ) Opis Metodo print() uporabljamo za izpis na zaslon. Utripalka (angl. cursor) ostane za zadnjim izpisanim znakom. Metoda println() izvede izpis na zaslon kot metoda print() le da se utripalka po izpisu pomakne na začetek nove vrstice. Metodo uporabljamo za oblikovanje izpisa v konzolnem oknu. Postopek izpisa Uporabimo objekt standardnega izhoda razreda System (System.out). Uporabimo metode razreda PrintStream (printf(), print(), println()). Objekt System.out je objekt razreda PrintStream. Stran 35 ŠC VELENJE

36 Metodo System.out.printf uporabljamo za oblikovanje izpisa v standardnem izhodu. Sintaksa: System.out.printf( oblikovano-besedilo [, arg1, arg2, ] ); Oblikovano besedilo vsebuje besedilno vrednost z oblikovalnimi določili. Če v besedilu uporabimo oblikovna določila, potem uporabimo argumente (arg1...). Sintaksa oblikovnega določila: % [zastavica] [širina] [.natančnost] znak_pretvorbe Zastavica Pomen - leva poravnava (privzeto desna poravnava) + prikaz plus ( + ) ali minus ( - ) znaka v številčni vrednosti 0 številne vrednosti se zapolnijo z znakom 0 (privzeti zapolnitveni znak je presledek), izpis ločila tisoč (,) presledek izpiše znak minus (-), če je število negativno oz. znak presledek ( ), če je število pozitivno Širina določa število znakov argumenta in predstavlja najmanjše število znakov izpisa. Natančnost določa za decimalna števila število decimalnih mest; za besedilo pa dolžino podniza. Decimalna števila se zaokrožujejo na zahtevano natančnost. Znak pretvorbe Pomen d f c C s S h desetiško število [byte, short, int, long] realno število [float, double] znak znak - velike črke besedilo (String) besedilo - velike črke pomnilniški naslov (referenca ali kazalec) Primeri: System.out.printf("Skupaj: %,10.2f%n", dblvrednost); System.out.printf("Skupaj: %-10.2f: ", dblvrednost); System.out.printf("% 4d", intvrednost); String s = "Besedilo"; System.out.printf("Besedilna vrednost %s je na naslovu %h", s, s); Standardni vhod (standard input) Za vnos podatkov s standardnega vhoda (tipkovnica) uporabimo razred Scanner. Na voljo je tudi razred System.in, ki ima funkcionalne pomanjkljivosti. Predmet System.in obstaja in je na voljo brez ustvarjanja. V praksi raje uporabljamo razred Scanner. Predmet Scanner moramo pred uporabo ustvariti. Vnos podatkov v programu predstavlja zaporedje znakov podatkovnega tipa String. Z metodami pretvorimo besedilno vrednost v znak, celo število, realno število itd. INFORMATIKA, Programiranje 1 in 2 Stran 36

37 Najpogosteje uporabljene metode razreda Scanner: Metoda Opis hasnext() nextint() nextdouble() next() nextline() Preverimo, če so na voljo podatki? Vrne logično vrednost true ali false. Vnos oz. branje celega števila. Vnos oz. branje realnega števila. Vnos oz. branje besedila (ločitveni znak presledek). Vnos oz. branje preostanka besedila v vrstici. Metode za branje posameznega znaka ni. Uporabimo branje besedila. Postopek branja Ustvarimo primerek objekta razreda Scanner // najavimo uporabo (deklaracija) razreda Scanner import java.util.scanner; // ustvarimo primerek objekta razreda Scanner za branje podatkov Scanner vhod = new Scanner(System.in); Do podatkov, ki jih uporabnik vnese preko tipkovnice, dostopamo z uporabo metod razreda Scanner // deklaracija spremenljivk int stevilo1; double stevilo2; String besedilo; stevilo1 = vhod.nextint(); // preberi celo število in ga shrani v stevilo1 stevilo2 = vhod.nextdouble(); // preberi realno število in ga shrani v stevilo2 besedilo = vhod.nextline(); // preberi besedilo in ga shrani v spremenljivko besedilo 5 OPERATORJI, IZRAZI, STAVKI Operandi so podatki, nad katerimi izvajamo operacije. Operatorji določajo vrsto operacije, ki se izvede nad enim ali več operandi. Poznamo več vrst operatorjev in sicer: aritmetični, relacijski, logični Aritmetični operatorji za cela in realna števila Operator Opis Primer * množenje x * 10 / deljenje x / y % ostanek celoštevilčnega deljenja 15 % 3 + seštevanje a + b - odštevanje d - e Rezultat celoštevilčnega deljenja je celo število. Rezultat izraza 8 / 5 je 1. Decimalni del rezultata celoštevilčnega deljenja se "odreže" (brez zaokroževanja). Operator % predstavlja ostanek po deljenju. Uporablja se večinoma za izračun ostanka po celoštevilčnem deljenju. Npr. 10 % 6 je 4 in 15 % 7 je 1. Oklepaje uporabljamo za določanje vrstnega reda izračuna posameznih delov izrazov. Izraz x * (y+z) predstavlja izračun vsote y + z in nato množenje z x. Stran 37 ŠC VELENJE

38 Izraz (x * (y+z)) določa najprej izračun najbolj notranjih delov izraza (v tem primeru y+z) in nato zunanjih delov. Če ne uporabljamo oklepajev se vrstni red izračuna izraza določi na osnovi pravil prioritete. Operator Operacija Vrstni red izračuna * množenje Več operatorjev te vrste, izračun z leve proti desni. / % deljenje ostanek po deljenju + seštevanje Več operatorjev te vrste, izračun z leve proti desni. - odštevanje = prireditev Po izračunu izraza desno od enačaja Operatorji prirejanja Operator prirejanja = združuje z desne proti levi, kar pomeni, da se najprej ovrednoti desna stran in nato leva. Veliko stavkov v jeziku je krajše oblike. Npr. sprem_x = sprem_x + c zapišemo krajše sprem_x += c; Podobno velja še za: Krajši zapis Daljši zapis a += b; a = a + b; a -= b; a = a - b; a *= b; a = a * b; a /= b; a = a / b; a %= b; a = a % b; Relacijski operatorji Uporabljamo jih za zapis logičnih pogojev v odločitvah. Operator Opis Primer Pomen == enakost (je enako) x == y x je enak y!= neenakost (ni enako) x!= y x ni enak y (x je različen od y) < manjše x < y x je manjši kot y > večje x > y x je večji kot y <= manjše ali enako x <= y x je manjši ali enak y >= večje ali enako x >= y x je večji ali enak y Zgled: int a = 5, b = 6; if (a == b) a+=1; else b+=1; Izraz Vrednost izraza (7 == 4) false (34 > 6) true (23!= 32) true (1 >= 1) true (12 < 10) false Izraz Vrednost izraza (a < b) true (a==b) false (a!= 5) false INFORMATIKA, Programiranje 1 in 2 Stran 38

39 5.1.4 Logični operatorji (!, &&, ) Operator! je logična negacija (NOT). Nahaja se levo od operanda in vrne logično nasprotno vrednost. Npr.!(67 == 67) // false (ker je izraz desno od! true)!(16 <= 14) // true (ker je (16 <= 14) false)!true // false!false // true Operatorja && - logični in (angl. logical and) in - logični ali (angl. logical or) uporabljamo z dvema operandoma. Logična tabela za logični in (&&) in ali ( ). operand 1 operand 2 logični in - && logični ali - false false false false false true false true true false false true true true true true Izraz Izraz je sestavljen iz operatorjev in operandov. Operandi so lahko konstante, spremenljivke, klici funkcij ali poljubna kombinacija prejšnjih. Izjema je operator prirejanja, pri katerem mora biti na levi strani spremenljivka. Vsak izraz ima svojo vrednost. Vrednosti pri aritmetičnih operatorjih so znane. Vrednost prireditvenega operatorja je kar vrednost izraza na desni strani znaka =. Vrednosti logičnih operatorjev sta 0 (neresnično - false) ali 1 (resnično - true). Vrstni red izračunavanja izrazov Operatorji (z izjemo operatorja prirejanja in unarnih operatorjev) združujejo izraz od leve proti desni. To pravilo velja med enakimi operatorji. Stavek: b = e q; se izračuna kot: b = (((e + 4) - 10) + q); Če v izrazu nastopajo operatorji z različno prioriteto, se najprej izračunajo tisti z najvišjo prioriteto in tako naprej proti najnižji prioriteti Bitni operatorji ( &,, ^, ~, <<, >> ) Bitni operatorji ovrednotijo izraz na osnovi posameznih bitov, ki predstavljajo vrednost operanda. Operator Pomen Opis & AND bitni logični IN () OR bitni logični ALI () ^ XOR (exclusive or) logični ekskluzivni ALI () ~ NOT komplement << SHL (shift left) pomik v levo >> SHR (shift right) pomik v desno x y x & y x y x y x y x ^ y x ~x Stran 39 ŠC VELENJE

40 Zgled: Dve spremenljivki x in y podatkovnega tipa char vsebujeta vrednosti 195 ( ) in 87 ( ). Zgled: char a = 195; char b = 87; char c; c = a & b; // vrednost 67 ( ) a = & b = c = Obstajajo standardne pretvorbe, če so operandi različnih (mešanih) podatkovnih tipov. To izvršuje prevajalnik v mešanih izrazih. Operator za pretvarjanje med podatkovnimi tipi - () Operator za pretvarjanje nam omogoča, da izraz določenega podatkovnega tipa pretvorimo v drug podatkovni tip tako, da pred izraz v okrogle oklepaje zapišemo željen podatkovni tip. int celo_st; float realno_st = 3.14; celo_st = (int) realno_st; // realno število pretvorimo v celo število (vrednost 3) Prioritete operatorjev Prioriteta Kategorija Operator Združevanje 1 (najvišja) () []. (dot operator) z leve v desno 2 unarni ++, - -,!, ~ z desne v levo 3 mnogokratni *, /, % z leve v desno 4 povečevalni +, - z leve v desno 5 bitni pomik >>, << z leve v desno 6 relacijski >, >=, <, <= z leve v desno 7 enakost ==,!= z leve v desno 8 bitni in (AND) & z leve v desno 9 bitni ekskluzivni ali (XOR) ^ z leve v desno 10 bitni ali (OR) z leve v desno 11 logični in (AND) && z leve v desno 12 logični ali (OR ) z leve v desno 13 pogojni?: z desne v levo 14 prireditev =, +=, -=, *=, /=, %=, >>=, z desne v levo <<=, &=, ^=, = 15 (najnižja) vejica, z leve v desno Združevanje določa pravilo, kateri del se izračuna oz. ovrednoti najprej, če imamo več operatorjev na istem nivoju prioritete in niso uporabljeni oklepaji. a = 5 * 7 % 2; // Izraz se lahko ovrednoti kot: a = 5 * (7 % 2); // v primeru desnega združevanja a = (5 * 7) % 2; // v primeru levega združevanja INFORMATIKA, Programiranje 1 in 2 Stran 40

41 6 KRMILNI STAVKI Preden lahko napišemo program, ki vrne rešitev problema, moramo poznati postopek rešitve problema in programske konstrukte. Stavki programa se izvajajo eden za drugim v zaporedju kot so zapisani v programu. Proces imenujemo sekvenčno izvajanje (angl. sequential execution). Različni stavki programskega jezika omogočajo, da določimo drugačno zaporedje izvajanja (naslednji stavek izvajanja ni naslednji stavek v zaporedju). Program je sestavljen iz zaporedja stavkov (sekvence), odločitvenih stavkov (selekcije) in ponavljanja stavkov (iteracije). Blok stavkov je več stavkov, ki so med seboj ločeni s podpičjem in se nahajajo med zavitima oklepajema npr. { stavek1; stavek2;... }. Če želimo, da je samo en stavek, potem ne uporabimo oklepajev oz. oznake za blok stavkov. V primeru, ko želimo sestavljeni stavek pa uporabimo blok stavkov. Če želimo, da se izvrši stavek ali blok stavkov samo v primeru določene vrednost pogoja oz. izraza, potem uporabimo odločitveni stavek. Odločitveni stavki if stavek; switch stavek. Stavki ponavljanja (zanke) Ponavljanje se lahko izvede določeno število krat npr. n krat ali dokler je izpolnjen pogoj. while stavek; do while stavek; for stavek. 6.1 Odločitveni stavki If stavek Če želimo, da se določen stavek (ali sestavljen stavek) izvede le ob določenem pogoju, potem uporabimo if stavek. If stavek predstavlja izbiro med več različnimi zaporedji stavkov. Sintaksa (oblika 1): stavek1; if (pogoj) stavek2; stavek3; Slika 16: Diagram poteka za if stavek (oblika 1) Stran 41 ŠC VELENJE

42 Pogoj je izraz, ki se ovrednosti s true ali false. Le v primeru, če je pogoj izpolnjen (true), se izvede stavek2. Če pogoj ni izpolnjen (false), se stavek2 ne izvede in izvajanje se nadaljuje z naslednjim stavkom, ki sledi stavku if (stavek3). Če želimo, da se izvede sestavljen stavek, potem uporabimo blok stavkov. stavek1; if (pogoj) { stavek2; stavek3; //... } stavek4; Slika 17: Diagram poteka za if stavek (oblika 2) Sintaksa z else (oblika 2): stavek1; if (pogoj) stavek2; else stavek3; stavek4; Slika 18: Diagram poteka za if stavek (oblika 3) stavek1; // ali if (pogoj) { stavek2_1; stavek2_2; //... } else { stavek3_1; stavek3_2; //... } stavek4; Slika 19: Diagram poteka za if stavek (oblika 4) INFORMATIKA, Programiranje 1 in 2 Stran 42

43 Stavke if lahko tudi gnezdimo (v stavku if je if stavek). stavek1; if (pogoj_a) stavek2; else if (pogoj_b) stavek3; else if (pogoj_c) else stavek4; stavek_5; stavek6; Slika 20: Diagram poteka za gnezden if stavek (oblika 5) Primer: Uporabnik vnese število doseženih točk na izpitu. Če je število doseženih točk večje ali enako 50, potem program v izhodnem oknu izpiše obvestilo "Izpit ste opravili.", v nasprotnem izpiše "Izpita niste opravili." 1. //najava uporabe razreda Scanner 2. import java.util.scanner; 3. public class If1 { public static void main(string[] args) { 6. // izpis obvestila za vnos točk 7. System.out.print("Število točk: "); 8. // v spremenljivko stevilo_tock zapišemo vnos uporabnika 9. double stevilo_tock = new Scanner(System.in).nextInt(); 10. if (stevilo_tock >= 50) // če je število točk večje ali enako System.out.printf("Izpit ste opravili."); //izpis obvestila za opravljen izpit 12. else // sicer 13. System.out.printf("Izpita niste opravili."); //izpis obvestila za neopravljen izpit 14. } // konec metode main } //konec razreda Primer izvajanja: Število točk: 60 Izpit ste opravili. Stran 43 ŠC VELENJE

44 Primer: Uporabnik vnese število doseženih točk na izpitu. Če je število doseženih točk večje ali enako 50, potem program v izhodnem oknu izpiše obvestilo "Izpit ste opravili.", v nasprotnem izpiše dve vrstici obvestila (uporabimo dva programska stavka): "Izpita niste opravili." "Naslednji izpit je v zimskem izpitnem roku." 1. //najava uporabe razreda Scanner 2. import java.util.scanner; 3. public class If1_1 { public static void main(string[] args) { 6. // izpis obvestila za vnos točk 7. System.out.print("Število točk: "); 8. // v spremenljivko stevilo_tock zapišemo vnos uporabnika 9. double stevilo_tock = new Scanner(System.in).nextInt(); 10. if (stevilo_tock >= 50) // če je število točk >= System.out.printf("Izpit ste opravili."); //izpis obvestila za opravljen izpit 12. else 13. { // sicer programski blok 14. System.out.println("Izpita niste opravili."); //izpis obvestila za neopravljen izpit 15. //izpis obvestila za neopravljen izpit 16. System.out.println("Naslednji izpit je v zimskem izpitnem roku."); 17. } // konec sicer bloka 18. } // konec metode main } // konec razreda Primer izvajanja: Število točk: 30 Izpita niste opravili. Naslednji izpit je v zimskem izpitnem roku. Primer: Uporabnik vnese število doseženih točk na izpitu. Program določi oceno izpita in jo izpiše v izhodnem oknu. Kriterij za določitev ocene Število točk Ocena //najava uporabe razreda Scanner 2. import java.util.scanner; public class If_1_2 { public static void main(string[] args) { 7. // izpis obvestila za vnos točk 8. System.out.print("Število točk: "); INFORMATIKA, Programiranje 1 in 2 Stran 44

45 9. // v spremenljivko stevilo_tock zapišemo vnos uporabnika 10. double stevilo_tock = new Scanner(System.in).nextInt(); 11. int ocena; // ocena izpita // določitev ocene 14. if (stevilo_tock >= 90) // če je število točk večje ali enako ocena = 10; 16. else // sicer 17. if (stevilo_tock >= 80) // če je število točk večje ali enako ocena = 9; 19. else // sicer 20. if (stevilo_tock >= 70) // če je število točk večje ali enako ocena = 8; 22. else // sicer 23. if (stevilo_tock >= 60) // če je število točk večje ali enako ocena = 7; 25. else // sicer 26. if (stevilo_tock >= 50) // če je število točk večje ali enako ocena = 6; 28. else 29. ocena = 5; // v vsakem drugem primeru je ocena // izpis ocene 31. System.out.printf("Ocena izpita: %d", ocena); 32. } // konec metode main } //konec razreda Primer izvajanja: Število točk: 70 Ocena izpita: 8 Primer: Uporabnik vpiše tri cela števila (vnos). Program poišče največjo vneseno vrednost in jo izpiše v izhodnem oknu. 1. //najava uporabe razreda Scanner 2. import java.util.scanner; public class If_2_1 { public static void main(string[] args) { 7. int stevilo1; //deklaracija celoštevilčne spremenljivke 8. int stevilo2; //deklaracija celoštevilčne spremenljivke 9. // ustvarimo primerek objekta rezreda Scanner za vnos 10. // izpis opisa aktivnosti 11. System.out.println("Vnos treh celih števil"); 12. System.out.println(" "); 13. // obvestilo za vnos 14. System.out.print("Prvo število: "); 15. // vneseno prvo število shranimo v spremenljivko stevilo1 16. stevilo1 = new Scanner(System.in).nextInt(); 17. // obvestilo za vnos 18. System.out.print("Drugo število: "); Stran 45 ŠC VELENJE

46 19. // vneseno drugo število shranimo v spremenljivko stevilo2 20. stevilo2 = new Scanner(System.in).nextInt(); // v spremenljivko stevilo1 shranimo večje število od prvih dveh vnesenih števil 23. if (stevilo2 > stevilo1) // če je drugo število večje od prvega potem 24. stevilo1 = stevilo2; // v spremenljivko stevilo1 določimo vrednost drugega števila // obvestilo za vnos 27. System.out.print("Tretje število: "); 28. // vneseno tretje število shranimo v spremenljivko stevilo2 29. stevilo2 = new Scanner(System.in).nextInt(); /* če je tretje število, ki je shranjeno v spremenljivki stevilo2 večje od do 32. sedaj največjega, potem ga shranimo v spremenljivko stevilo1*/ 33. if (stevilo2 > stevilo1) 34. stevilo1 = stevilo2; // v spremenljivko stevilo1 shranimo vrednost spremenljivke stevilo2 35. System.out.println(" : "); 36. System.out.printf("Največje število: %d", stevilo1); 37. } // konec metode main } // konec razreda Primer izvajanja: Vnos treh celih števil Prvo število: 569 Drugo število: 400 Tretje število: : Največje število: Switch stavek Kadar imamo več možnih vrednosti kot dve (pri stavku if) in se mora izvršiti le določeno zaporedje stavkov, potem uporabimo stavek switch. Glede na vrednost izraza se običajno izvrši le eno zaporedje stavkov izmed vseh možnih. Izbira poteka na podlagi vrednosti nekega izraza, ki mora vrniti vrednost podatkovnega tipa celega števila ali znaka. Izvede se zaporedje stavkov pri katerem se oznaka (konstanta_x) ujema z vrednostjo izraza. Sintaksa stavka switch: switch (izraz) { case konstanta_1: zaporedje_stavkov_1; break; } case konstanta_2: zaporedje_stavkov_2; break; default: privzeto_zaporedje_stavkov; INFORMATIKA, Programiranje 1 in 2 Stran 46

47 Primer: switch (x) { case 1: System.out.println("x je 1"); break; case 2: System.out.println("x je 2"); break; default: System.out.println("x vrednost ni 1 ali 2"); } Stavek switch ovrednoti izraz in preveri, če se ujema z vrednostjo prve konstante (konstanta_1). Če se ujema, izvrši zaporedje_stavkov_1, dokler ne naleti na rezerviranko break. Stavek break povzroči vejitev (skok) iz stavka switch oz. izvajanje programa se nadaljuje na koncu stavka switch. Če izraz ni enak vrednosti konstanta_1, potem program preveri, če je enak vrednosti druge konstante (konstanta_2). Če se ujema, izvrši zaporedje_stavkov_2 dokler ne naleti na rezerviranko break. Če izraz ni enak nobeni izmed vrednosti konstant, potem program izvede stavke, ki so zapisani v default delu (če obstaja). switch stavek switch (x) { case 1: System.out.println("x je 1"); break; case 2: System.out.println("x je 2"); break; default: System.out.println("x vrednost ni ne 1 in ne 2"); } if stavek if (x == 1) { System.out.println("x je 1"); } else { if (x == 2) { System.out.println("x je 2"); } else { System.out.println("x vrednost ni ne 1 in ne 2"); } } Pri posamezni vrednosti konstante oz. izbiri ne smemo pozabiti vključiti rezerviranke break. Če je ne vključimo, program nadaljuje izvajanje ostalih delov v switch stavku. Namesto konstant npr. konstanta_1 ne smemo uporabiti izrazov npr. (i+3). Primer: Uporabnik vnese število doseženih točk na izpitu. Program določi oceno in jo izpiše v izhodnem oknu (uporabimo stavek switch). Število točk Ocena Stran 47 ŠC VELENJE

48 //najava uporabe razreda Scanner import java.util.scanner; public class Switch1_1 { } // razreda public static void main(string[] args) { // izpis obvestila za vnos točk System.out.print("Število točk: "); // v spremenljivko stevilo_tock shranimo vnos uporabnika int stevilo_tock = new Scanner(System.in).nextInt(); int ocena; // ocena izpita // določitev ocene switch (stevilo_tock / 10) // število točk delimo z 10 { // blok switch stavka case 10: // število točk med 90 in 100 case 9: ocena = 10; break; case 8: // število točk med 80 in 89 ocena = 9; break; case 7: // število točk med 70 in 79 ocena = 8; break; case 6: // število točk med 60 in 69 ocena = 7; break; case 5: // število točk med 50 in 59 ocena = 6; break; default: ocena = 5; } // konec bloka switch stavka // izpis ocene System.out.printf("Ocena izpita: %d", ocena); } // konec metode main Primer izvajanja: Število točk: 55 Ocena izpita: 6 Primer: Uporabnik vnaša števila iz intervala od 1 do 5 dokler ne zaključi vnosa z vnosom vrednosti -1. Program tekoče izračunava frekvenco pojavitev posameznih števil brez uporabe polj. Program po vnosu izpiše frekvenco pojavitev v izhodnem oknu. INFORMATIKA, Programiranje 1 in 2 Stran 48

49 1. //najava uporabe razreda Scanner 2. import java.util.scanner; public class Switch_2_1 { public static void main(string[] args) 7. { 8. // deklaracija in inicializacija spremenljivk za določitev frekvence 9. int st1=0, st2=0, st3=0, st4=0, st5=0; // st1 - število ocen 1... st5 - število ocen int stevilo; // spremenljivka za vnos 11. do 12. { // blok zanke 13. // izpis obvestila za vnos 14. System.out.print("Vnesi število iz intervala od 1 do 5 <-1 - konec>: "); 15. stevilo = new Scanner(System.in).nextInt(); 16. // glede na vneseno število povečamo ustrezno spremenljivko frekvenc števil za switch (stevilo) // zadnje vneseno število 18. { // blok switch 19. case 1: st1; // povečamo st1 za break; 22. case 2: st2; // povečamo st2 za break; 25. case 3: st3; // povečamo st3 za break; 28. case 4: st4; // povečamo st4 za break; 31. case 5: st5; // povečamo st5 za break; 34. } // konec bloka switch } while (stevilo!= -1); // konec bloka zanke // izpišemo frekvence pojavitev ocen 40. System.out.printf("Število\tŠtevilo pojavitev\n"); 41. System.out.printf("%d\t%d\n",1,st1); 42. System.out.printf("%d\t%d\n",2,st2); 43. System.out.printf("%d\t%d\n",3,st3); 44. System.out.printf("%d\t%d\n",4,st4); 45. System.out.printf("%d\t%d\n",5,st5); 46. } // konec metode main } //konec razreda Primer izvajanja: Vnesi število iz intervala od 1 do 5 <-1 - konec>: 5 Vnesi število iz intervala od 1 do 5 <-1 - konec>: 4 Vnesi število iz intervala od 1 do 5 <-1 - konec>: 5 Vnesi število iz intervala od 1 do 5 <-1 - konec>: 4 Stran 49 ŠC VELENJE

50 Vnesi število iz intervala od 1 do 5 <-1 - konec>: 2 Vnesi število iz intervala od 1 do 5 <-1 - konec>: -1 Število Število pojavitev Stavki ponavljanja (zanke) While stavek Sintaksa: stavek1; while (pogoj) stavek2; stavek3; // ali Slika 21: Diagram poteka za while stavek (oblika 1) stavek1; while (pogoj) { stavek2_1; stavek2_2;... } stavek3; Slika 22: Diagram poteka za while stavek (oblika 2) Stavek2 (telo zanke) se izvaja tako dolgo, dokler je izpolnjen pogoj. Če pogoj ob prvem ovrednotenju ni izpolnjen, potem se stavek2 nikoli ne izvede. INFORMATIKA, Programiranje 1 in 2 Stran 50

51 Ko prvič ni izpolnjen pogoj, se nadaljuje izvajanje programa v stavku, ki sledi stavku while (v našem primeru je to stavek 3). Zgledi: 1. /** Primer z zmanjševanjem števca. 2. * Uporabnik vpiše pozitivno celo število. 3. * Program na zaslon izpiše seznam števil od vnesenega števila do števila 1. */ import java.util.scanner; public class while1_1 { public static void main(string[] args) { 11. int stevilo; // spremenljivka za vnos števila 12. System.out.println("Vpišite pozitivno celo število: "); 13. stevilo = new Scanner(System.in).nextInt(); 14. while (stevilo > 0) //dokler je število večje od nič 15. { 16. System.out.print(stevilo); //v izhodno okno izpišemo število 17. if (stevilo > 1) // zadnje izpisano število 18. System.out.print(", "); //izpišemo vejico s presledkom 19. stevilo = stevilo - 1; // zmanjšamo vrednost števila za ena 20. } 21. } 22. } Primer izvajanja: Vpišite pozitivno celo število: 25 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 1. /* 2. * Izračun vsote števil od 1 do N. 3. * N - celo število 4. */ 5. import java.util.scanner; 6. public class while1_2 { public static void main(string[] args) { 9. System.out.print("Vpiši N: "); 10. //v spremenljivko N preberemo vrednost celega števila 11. int N = new Scanner(System.in).nextInt(); 12. int i = 1; // inicializiramo števec zanke 13. int vsota = 0; // začetna vrednost vsote je while (i <= N) // dokler je števec manjši ali enak N 15. { 16. vsota = vsota + i; // vsoti prištejemo trenutno vrednost števca 17. //izpišemo vrednost vsote do vrednosti števca 18. System.out.printf("Vsota števil od 1 do %d je %d.\n",i,vsota); 19. i = i + 1; // števec povečamo za ena 20. } Stran 51 ŠC VELENJE

52 21. // izpišemo vrednost vsote 22. System.out.printf("\nVsota števil od 1 do %d je %d.",n,vsota); 23. } 24. } Primer izvajanja: Vpiši N: 6 Vsota števil od 1 do 1 je 1. Vsota števil od 1 do 2 je 3. Vsota števil od 1 do 3 je 6. Vsota števil od 1 do 4 je 10. Vsota števil od 1 do 5 je 15. Vsota števil od 1 do 6 je 21. Vsota števil od 1 do 6 je Do while stavek Od while stavka se razlikuje po tem, da se ne glede na pogoj izvede vsaj enkrat, kar je posledica tega, da se pogoj testira po izvršitvi stavka zanke (stavek2 ali blok stavkov { stavek2_1; stavek2_2}). Sintaksa: stavek1; do stavek2; while (pogoj); stavek3; // ali Slika 23: Diagram poteka za do while stavek (oblika 1) INFORMATIKA, Programiranje 1 in 2 Stran 52

53 stavek1; do { stavek2_1; stavek2_2;... } while (pogoj); stavek3; Slika 24: Diagram poteka za do while stavek (oblika 2) Ko se v preverjanju pogoja ugotovi, da pogoj ni izpolnjen, se nadaljuje izvajanje programa v stavku, ki sledi stavku while (v našem primeru je to stavek 3). Primeri: 1. /* Ugotavljanje naključnega števila od 1 do 10. Računalnik izbere naključno število. 2. * Uporabnik v čim manj poskusih ugane izbrano število. */ 3. import java.util.random; // razred naključna števila 4. import java.util.scanner; 5. public class do1 { public static void main(string[] args) { 8. Random nakljucno = new Random(); 9. int nakljucno_stevilo = nakljucno.nextint(10); 10. int stevilo, i=0; 11. do // ponavljaj 12. { 13. i = i + 1; // števec poskusov 14. // izpišemo obvestilo za vnos števila 15. System.out.printf("Ugani število med 1 in 10 (%d.): ",i); 16. // v spremenljivko stevilo preberemo vrednost števila 17. stevilo = new Scanner(System.in).nextInt(); 18. // dokler je vneseno število različno od naključno izbranega 19. } while (nakljucno_stevilo!= stevilo); 20. if (nakljucno_stevilo == stevilo) // je število uganjeno 21. // izpišemo število poskusov 22. System.out.printf("Čestitke...\nŠtevilo poskusov: %d. ",i); 23. else 24. // izpišemo neuspešno uganjevanje 25. System.out.print("Izbranega števila niste uganili."); 26. } 27. } Primer izvajanja: Ugani število med 1 in 10 (1.): 5 Ugani število med 1 in 10 (2.): 10 Stran 53 ŠC VELENJE

54 Ugani število med 1 in 10 (3.): 6 Čestitke... Število poskusov: 3. Predavatelj za vsakega študenta vpiše število doseženih točk izpita (od 0 do 100). Vnos se zaključi z vnosom -1. Program izračuna in izpiše število študentov in povprečje doseženih točk. Psevdokod algoritma: določi vsoto točk na 0 določi število študentov na 0 ponavljaj število_študentov povečaj za 1 izpiši obvestilo za vnos preberi število točk če je število točk različno od -1 potem vsota točk <- vsota točk + število točk sicer število_študentov <- število_študentov - 1 dokler število točk različno od -1 če je število_študentov večje od 0 potem izpiši število študentov izračunaj in izpiši povprečje točk 1. /* Predavatelj za vsakega študenta vpiše število doseženih točk izpita (od 0 do 100). 2. * Vnos se zaključi z vnosom -1. Program izračuna in izpiše število študentov in 3. * povprečje doseženih točk. */ 4. import java.util.scanner; public class povprecje { 7. private static Scanner vhod = new Scanner(System.in); public static void main(string[] args) { 10. double stevilo_tock; // število točk posameznega študenta 11. double vsota_tock = 0; //skupaj točke vnesenih študentov 12. int stevilo_studentov = 0; //števec - štetje vnosov točk 13. do //ponavljamo 14. { 15. stevilo_studentov = stevilo_studentov + 1; //povečamo števec študentov 16. // izpišemo obvestilo za vnos točk i-tega študenta 17. System.out.printf("Število točk %d-tega študenta: ",stevilo_studentov); 18. stevilo_tock = vhod.nextdouble(); //vnesemo točke i-tega študenta 19. if (stevilo_tock!= -1) // je konec vnosa točk 20. // vsoti točk prištejemo vnesene točke 21. vsota_tock = vsota_tock + stevilo_tock; 22. else 23. stevilo_studentov = stevilo_studentov - 1; // vnos -1 ne upoštevamo 24. } while (stevilo_tock!= -1); // dokler ni vnos zaključka vnosa (-1) 25. if (stevilo_studentov > 0) // je število študentov večje od { //izpis števila študentov 27. System.out.printf("Število študentov: %d.\n", stevilo_studentov); 28. // izračun in izpis povprečja točk 29. System.out.printf("Povprečje točk: %f.", (vsota_tock / stevilo_studentov)); 30. } INFORMATIKA, Programiranje 1 in 2 Stran 54

55 31. } 32. } Primer izvajanja: Število točk 1-tega študenta: 56 Število točk 2-tega študenta: 54 Število točk 3-tega študenta: 80 Število točk 4-tega študenta: -1 Število študentov: 4. Povprečje točk: 47, For stavek For stavek na enem mestu združuje inicializacijo števca, določitev pogoja ponavljanja in izraz spremembe števca po vsaki izvršitvi telesa oz. bloka zanke. Podobno kot pri stavku while se pogoj preverja na začetku. Sintaksa: stavek1; for (inicializacija; pogoj; sprememba_stevca) stavek2; stavek3; ali Slika 25: Diagram poteka za for stavek (oblika 1) Stran 55 ŠC VELENJE

56 stavek1; for (inicializacija; pogoj; sprememba_stevca) { } stavek2_1; stavek2_2;... stavek3; Slika 26: Diagram poteka za for stavek (oblika 2) Stavek (stavek2) ali blok stavkov v for stavku se izvršuje dokler je izpolnjen pogoj. V inicializacijskem delu deklariramo in določimo začetno vrednost spremenljivke, ki jo uporabimo za števec v zanki. V delu sprememba števca pa določimo spremembo števca (povečujemo oz. zmanjšujemo spremenljivko števca - korak). Postopek izvajanja: 1. Izvrši se inicializacija (le enkrat; ob vstopu v zanko for). 2. Preveri se pogoj. Če pogoj ni izpolnjen, se nadaljuje izvajanje programa za stavkom for. 3. Izvrši se telo oz. blok for stavka, ki je lahko posamezen stavek ali blok stavkov ({stavek2_1; stavek2_2... }). 4. Izvrši se sprememba števca in izvajanje se nadaljuje v točki 2. Zgled: Slika 27: For stavek (združen števec in pogoj) Dela inicializacija in sprememba števca sta opcijska (podpičja so obvezna). Npr. zapišemo lahko for (;n<10;). V posamezen del lahko zapišemo več stavkov, ki jih med seboj ločimo z vejico (,). V tem primeru je vejica ukazni separator. Zgled: for ( n = 0, i = 50 ; n!= i ; n++, i-- ) b { // obdelava... } V inicializaciji priredimo spremenljivki n vrednost 0 in spremenljivki i vrednost 50. Pogoj: spremenljivka n ni enaka spremenljivki i. Ker se n povečuje za ena in i zmanjšuje za ena bo pogoj zanke izpolnjen po 25-ih izvršitvah zanke, ko bosta spremenljivki n in i imeli vrednost 25. Primeri: INFORMATIKA, Programiranje 1 in 2 Stran 56

57 1. /* 2. * Program izpiše zaporedje: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, Konec! 3. */ 4. public class for1_1 { public static void main(string[] args) { 7. // zanka for števec i se spreminja od 10 do 0 (korak -1) 8. for (int i = 10; i > 0; i--) 9. System.out.printf("%d,",i); // izpis vrednosti števca i 10. System.out.print("Konec!"); // po zaključku zanke izpišemo še "Konec!" 11. } 12. } Primer izvajanja: 10,9,8,7,6,5,4,3,2,1,Konec! 1. /* Predavatelj za vsakega študenta vpiše število doseženih točk izpita (od 0 do 100). 2. * Na začetku izvajanja se vnese število študentov. 3. * Program izračuna in izpiše število študentov in povprečje doseženih točk. */ 4. import java.util.scanner; public class Povprecje { 7. //razred naključna števila 8. private static Scanner scanner = new Scanner(System.in); public static void main(string[] args) { 11. double stevilo_tock; // število točk posameznega študenta 12. double vsota_tock = 0; //skupaj točke vnesenih študentov 13. int stevilo_studentov; //število študentov 14. // izpišemo obvestilo za vnos števila študentov 15. System.out.print("Število študentov: "); 16. stevilo_studentov = scanner.nextint(); //vnesemo število študentov 17. // for stavek i=1.. stevilo_studentov (korak 1) 18. for (int i = 1; i <= stevilo_studentov; i++) 19. { 20. // izpišemo obvestilo za vnos točk i-tega študenta 21. System.out.printf("Število točk %d-tega študenta: ",i); 22. stevilo_tock = scanner.nextdouble(); //vnesemo točke i-tega študenta 23. vsota_tock = vsota_tock + stevilo_tock; // vsoti točk prištejemo vnesene točke 24. } 25. if (stevilo_studentov > 0) // je število študentov večje od { // izračun in izpis povprečja točk 27. System.out.printf("Povprečje točk: %f.", (vsota_tock / stevilo_studentov)); 28. } 29. } 30. } Stran 57 ŠC VELENJE

58 6.2.4 Break in continue stavek Break stavek v switch stavku povzroči vejitev (skok) iz stavka switch oz. izvajanje programa se nadaljuje na koncu stavka switch. Break stavek lahko uprabimo tudi v kateremkoli telesu oz. bloku zanke. Break stavek v zanki ustavi izvajanje zanke in izvajanje se nadaljuje s prvim stavkom, ki sledi zanki. V praksi se izogibamo uporabi stavka break v telesu oz. bloku zanke. Primer: Zanka for se bi brez uporabe stavka break v if stavku izvršila 10-krat. Stavek break se izvrši, ko ima števec vrednost 6. Izvajanje zanke for se prekine. // zanka s spreminjanjem števca od 1 do 10 (korak 1) for (int i=1; i <= 10; i++) { if (i == 6) //vrednost števca i je enaka šest? break; //izhod iz zanke for System.out.printf ("Vrednost števca je %d.\n", i); //izpis vrednosti števca } System.out.println ("Stavek za zanko for."); Primer izvajanja: Vrednost števca je 1. Vrednost števca je 2. Vrednost števca je 3. Vrednost števca je 4. Vrednost števca je 5. Stavek za zanko for. V zankah ne potrebujemo stavka break (ga ne uporabljamo). Continue stavek Uporaba stavka continue v zanki povzroči, da se preostanek telesa zanke izpusti in se začne naslednje izvajanje zanke, če je pogoj zanke resničen. Primer: Zanka for se bi brez uporabe stavka continue v if stavku izvršila v celoti 10-krat. Stavek continue se izvrši, ko ima števec vrednost 6. V tem primeru se stavki v telesu zanke za stavkom continue ne izvršijo in se nadaljuje izvajanje naslednje ponovitve zanke for. // zanka s spreminjanjem števca od 1 do 10 (korak 1) for (int i=1; i <= 10; i++) { if (i == 6) //vrednost števca i je enaka šest? continue; //vejitev oz. skok v preverjanje pogoja zanke System.out.printf ("Vrednost števca je %d.\n", i); //izpis vrednosti števca } System.out.println ("Stavek za zanko for."); Primer izvajanja: Vrednost števca je 1. INFORMATIKA, Programiranje 1 in 2 Stran 58

59 Vrednost števca je 2. Vrednost števca je 3. Vrednost števca je 4. Vrednost števca je 5. Vrednost števca je 7. Vrednost števca je 8. Vrednost števca je 9. Vrednost števca je 10. Stavek za zanko for. V zankah ne potrebujemo stavka continue. V dobri praksi se v zankah ne uporablja stavek continue. Primeri Izračun povprečne vrednosti n števil Primeri: 1. /* Izračun povprečne vrednosti n števil. N določi uporabnik. Števila vpiše uporabnik. */ 2. public static void main(string[] args) { 3. double vsota = 0; // vsota vnesenih števil 4. System.out.print("Število števil - N: "); 5. int n; // število števil 6. Scanner vhod = new Scanner(System.in); 7. n = vhod.nextint(); //vnos celega števila 8. // zanka for, števec i => 1.. n 9. double stevilo; // vnos števila 10. for (int i=1; i<=n; i++) 11. { // obvestilo za vnos i-tega števila 12. System.out.printf("%d. število: ",i); 13. // vnos števila 14. stevilo = vhod.nextdouble(); 15. // vsoti prištejemo i-to število 16. vsota = vsota + stevilo; 17. } / /for 18. // izračun povprečja 19. if (n > 0) // je vpisano vsaj eno število 20. { 21. // izračun povprečja 22. double povprecje = vsota / n; 23. // izpis povprečja 24. System.out.printf("Povprečje števil je %f.", povprecje); 25. } // if 26. } // main Izvajanje: Število števil - N: 4 1. število: 5 2. število: 6 3. število: 9 4. število: 8 Povprečje števil je 7, Preštevanje sodih in lihih števil Stran 59 ŠC VELENJE

60 1. /* Preštevanje sodih in lihih števil. 2. * Uporabnik vpisuje cela števila dokler ne vpiše števila */ 4. public static void main(string[] args) { 5. // število sodih in lihih števil inicializiramo na int stevilo_soda = 0, stevilo_liha=0; 7. Scanner vhod = new Scanner(System.in); 8. // zanka do while 9. int stevilo; // vpis števila 10. do 11. { // obvestilo za vnos števila 12. System.out.print("Število: "); 13. // vnos števila 14. stevilo = vhod.nextint(); 15. // je število različno od if (stevilo!= 0) 17. { 18. // če je ostanek po celoštevilčnem deljenju z 2 enak 0 => sodo število 19. if (stevilo % 2 == 0 ) // je sodo 20. stevilo_soda = stevilo_soda + 1; 21. else 22. stevilo_liha = stevilo_liha + 1; 23. } // if 24. } while (stevilo!=0); // dokler je število različno od // izpis števila sodih in lihih števil 26. System.out.printf("Število sodih števil: %d.\n", stevilo_soda); 27. System.out.printf("Število lihih števil: %d.", stevilo_liha); 28. } //main Izvajanje: Število: 5 Število: 10 Število: 78 Število: 24 Število: 69 Število: 21 Število: 0 Število sodih števil: 3. Število lihih števil: 3. Izris pravokotnika v besedilnem načinu 1. /* Izris pravokotnika z znakom '*'. 2. * Uporabnik vpiše stranici pravokotnika (a in b). 3. * */ 4. public static void main(string[] args) { 5. int stranica_a, stranica_b; // stranici pravokotnika 6. Scanner vhod = new Scanner(System.in); // primerek objekta za vnos podatkov 7. //izpis obvestila 8. System.out.print("Stranica a (število stolpcev): "); 9. // vnos stranice a 10. stranica_a = vhod.nextint(); 11. //izpis obvestila 12. System.out.print("Stranica b (število vrstic): "); 13. // vnos stranice b INFORMATIKA, Programiranje 1 in 2 Stran 60

61 14. stranica_b = vhod.nextint(); 15. // izris pravokotnika v besedilnem načinu 16. // zanka stevec i => 1.. stranica_b (število vrstic) 17. for (int i =1; i<= stranica_b; i++) 18. { 19. // zanka stevec j => 1.. stranica_a (število stolpcev) 20. for (int j =1; j<= stranica_a; j++) 21. System.out.print('*'); // izpis znaka '*' 22. // prehod v novo vrstico 23. System.out.println(""); 24. } // for vrstice 25. } // main Primer izvajanja: Stranica a (število stolpcev): 5 Stranica b (število vrstic): 3 ***** ***** ***** 7 METODE Najboljši način razvoja in vzdrževanja večjega programa je, da ga izdelamo iz manjših delov oz. modulov. Takšen pristop imenujemo deli in vladaj. Večji problem razbijemo na manjše dele, ki jih rešimo in jih nato povežemo v celoto. V Javi izdelujemo programske rešitve s kombinacijo uporabe vgrajenih razredov in metod v programski knjižnici (Java Application Programming Interface - Java API) in izdelavo lastnih razredov in metod. Sorodne razrede združujemo v pakete, ki jih vključujemo v programske rešitve. Java API vsebuje veliko zbirko definiranih razredov, ki vsebujejo metode za izvajanje aktivnosti, npr. matematičnih izračunov, obdelave nizov, obdelave znakov, vhodno/izhodne operacije, uporaba zbirk podatkov, delo z medmrežjem, obdelava besedilnih dokumentov, preverjanje napak itd. Metode omogočajo lažjo modularno zasnovo programa z ločevanjem aktivnosti v samostojne programske enote. Metoda predstavlja poimenovano zaporedje stavkov, ki predstavlja rešitev manjšega problema. S klici metod izvajamo isto zaporedje stavkov nad različnimi podatki. Metode predstavljajo tudi operacije, ki so na voljo nad posameznim objektom. Primeri: metoda za bančno transakcijo (datum, znesek, namen), metoda za vpis ocene predmeta (datum, predmet, ocena), metoda za izračun kvadratnega korena (število)... Metodo izvršimo s klicem metode. Ločimo dve vrsti metod: metode, ki ne vračajo vrednosti (klic metode je samostojen stavek) in metode, ki vračajo vrednost (klic metode je sestavni del izraza). Stran 61 ŠC VELENJE

62 7.1.1 Deklaracija metode // glava metode <določila načina dostopa> <podatkovni tip rezultata> <ime metode> ( [<podatkovni tip> <ime>] [, <podatkovni ti > <ime>] ) { // telo metode // stavki [ return <izraz>; ] // metode, ki vračajo vrednosti } // konec metode <določila načina dostopa> npr. public static Podatkovni tip void določa, da metoda ne vrača vrednosti. Seznam formalnih parametrov metode je lahko prazen (). Formalni parameter je določen s podatkovnim tipom in imenom. Formalni parametri so med seboj ločeni z vejico. Formalni parametri predstavljajo lokalne spremenljivke, ki so dosegljive samo znotraj metode Statične metode Metode najpogostejše izvajamo kot klic metode nad izvodom objekta določenega razreda. Včasih izvršitev metode ni odvisna od vsebine objekta. Takšne metode so v razredih definirane kot statične z uporabo rezerviranke static. Statične metode lahko uporabljajo le statične lastnosti (polja) in statične metode. Statične metode razreda uporabljamo za splošne aktivnosti. Za statično spremenljivko obstaja ena sama vrednost spremenljivke za celoten razred, zato jih imenujemo tudi spremenljivke razreda (ang. class variables). Statične metode so tipične za razrede, ki predstavljajo aplikacije in razrede, ki služijo kot knjižnice (npr. razred Math): deklariramo jih z dostopnim določilom static, v pomnilniku so shranjene samo enkrat, niso vezane na posamezne objekte, ampak so skupne za celoten razred, uporabljamo jih tudi brez ustvarjanja (obstoja) objekta, statične metode ne morejo posegati v polja (atribute) posameznih objektov, metoda main() je vedno statična, statična metoda v razredu, ki je namenjen ustvarjanju objektov, je skupna (enaka) za vse izvode objekte. Klic oz. izvršitev statične metode razreda: <ImeRazreda>.<imeMetode> (< dejanski parametri >); Konstantno polje je deklarirano z rezerviranko final. Konstantnega polja po inicializaciji ne moremo spreminjati. Rezerviranka static omogoča dostop do metode z uporabo imena razreda Math npr. Math.PI. Statična polja imajo enako vrednost za vse izvode objekte razreda. Metodo main določimo z rezerviranko static. To omogoča Java Virtual Machine (JVM), da lahko izvede klic metode main brez ustvarjanja primerka objekta razreda Metode objekta Metode objekta so vezane na posamezne objekte (primerke razreda). Razred (tip) objekta določa metode, ki so na voljo za posamezen objekt. INFORMATIKA, Programiranje 1 in 2 Stran 62

63 Tipične so za razrede, ki so namenjeni ustvarjanju objektov. Metode objekta omogočajo dostop do posameznih polj (atributov) objekta. Pri deklaraciji metod objektov ne uporabimo dostopnega določila static. Ob klicu metode objekta vedno navedemo tudi ime objekta, ki mu metoda pripada. Klic oz. izvršitev metode objekta: <ime objekta>.<ime metode> (<dejanski parametri>) <ime razreda>.<ime objekta>.<ime metode> (<dejanski parametri>) Metode z več parametri Metode pogosto zahtevajo več informacij, da lahko izvršijo ustrezne aktivnosti. Oglejmo si primer metode, ki za tri cela števila vrne najmanjše število. 1. /* Vnos treh celih števil. 2. * Program poišče najmanjše vneseno število in ga izpiše na zaslon.*/ 3. // najava uporabe razreda Scanner 4. import java.util.scanner; 5. // razred 6. public class Metode1 { 7. // metoda main 8. public static void main(string[] args) { 9. Scanner vhod = new Scanner(System.in); 10. int stevilo1, stevilo2, stevilo3; // celoštevilčne spremenljivke 11. // izpis obvestila 12. System.out.print("Vpiši tri cela števila (ločena s presledki): "); 13. stevilo1 = vhod.nextint(); // vnos 1. števila 14. stevilo2 = vhod.nextint(); // vnos 2. števila 15. stevilo3 = vhod.nextint(); // vnos 3. števila 16. // izpis najmanjšega števila 17. System.out.printf("Najmanjše število je %d.", 18. najmanjsestevilo(stevilo1,stevilo2,stevilo3)); 19. } // metoda main // metoda vrne najmanjše število 22. public static int najmanjsestevilo(int stevilo1, int stevilo2, int stevilo3) 23. { 24. // prvo število je najmanjše 25. int najmanjse = stevilo1; 26. // če je drugo število manjše od do sedaj najmanjšega 27. if (stevilo2 < najmanjse) 28. najmanjse = stevilo2; // drugo število je najmanjše 29. // če je tretje število manjše od do sedaj najmanjšega 30. if (stevilo3 < najmanjse) 31. najmanjse = stevilo3; // tretje število je najmanjše 32. return najmanjse; // vrnemo rezultat 33. } // metoda najmanjsestevilo 34. } // razred Metode1 Primer izvajanja: Vpiši tri cela števila (ločena števila s presledki): Najmanjše število je 25. Stran 63 ŠC VELENJE

64 Klic metode Ob klicu metode navedemo ime metode in dejanske parametre metode. Dejanski in formalni parametri se morajo ujemati v številu in podatkovnem tipu glede na vrstni red parametrov. Dejanski parameter je lahko vrednost spremenljivke, konstante ali izraza. Navadne spremenljivke se prenašajo po vrednosti, objekti pa po referenci. Pri prenosu po vrednosti prejme metoda kopijo vrednosti dejanskega parametra. Klic metode, ki vrača vrednost je sestavni del izraza. Klic metode, ki ne vrača vrednost je samostojni stavek. Klic metode znotraj razreda v katerem se nahaja metoda o <imemetode> (<dejanski parametri>) npr. najmanjsestevilo(stevilo1,stevilo2,stevilo3) 1. // primer prenosa parametra po vrednosti 2. public class B { 3. // metoda main 4. public static void main(string[] args) { 5. double stevilo = 20; //deklaracija in inicializacija 6. // klic metode dvakratstevilo je samostojni stavek 7. dvakratstevilo(stevilo); // stevilo- dejanski parameter 8. // izpis 9. System.out.printf("Vrednost števila v metodi main po izvršitvi metode dvakratstevilo je %f.\n", stevilo); 10. } // metoda main // metoda dvakratstevilo 13. public static void dvakratstevilo(double stevilo) 14. { 15. stevilo = 2 * stevilo; // sprememba vrednosti spremenljivke parametra 16. System.out.printf("Vrednost števila v izpisu v metodi dvakratstevilo je %f.\n", stevilo); 17. } // metoda dvakratstevilo 18. } Primer izvajanja: Vrednost števila v izpisu v metodi dvakratstevilo je 40, Vrednost števila v metodi main po izvršitvi metode dvakratstevilo je 20, Slika 28: Formalni in dejanski parameter Klic metode iz drugega razreda Metode, ki so vezane na objekte o <imerazreda>.<imeobjekta>.<imemetode>(<dejanski parametri>) INFORMATIKA, Programiranje 1 in 2 Stran 64

65 Samostojne (statične) metode o <imerazreda>.<imemetode>(<dejanski parametri>) Vračanje kontrole izvajanja v stavek klica metode Če metoda ne vrača vrednosti (podatkovni tip void), potem se izvajanja programa nadaljuje za stavkom klica metode po zaključku bloka metode (}) ali po izvršitvi stavka return. Če metoda vrača vrednost, potem se izvajanje programa nadaljuje v stavku klica metode po izvršitvi stavka return <izraz> Formalni in dejanski parametri metode Formalne parametre metode navedemo ob deklaraciji metode in so določeni s podatkovnim tipom in imenom. Ob klicu metode se dejanski parametri prenesejo v isto ležeče formalne parametre metode. Formalni parametri predstavljajo lokalne spremenljivke metode, ki so dostopne samo znotraj telesa metode. Število formalnih in dejanskih parametrov se mora ujemati. Podatkovni tipi isto ležečih dejanskih parametrov morajo biti skladni oz. kompatibilni s formalnimi parametri. Podatkovna tipa sta skladna oz. kompatibilna, če je podatkovni tip dejanskega parametra vsebovan v podatkovnem tipu formalnega parametra. Zgled prenosa dejanskih parametrov v formalne parametre metode: Slika 29: Prenos parametrov Klic metode obseg_pravokotnika ni samostojni stavek. 1. /* Izračun obsega pravokotnika 2. * 3. * najava uporabe razreda Scanner */ 4. import java.util.scanner; 5. // razred 6. public class Metode1 { 7. // metoda main 8. public static void main(string[] args) { 9. Scanner vhod = new Scanner(System.in); 10. double dolzinaa, sirinab; //stranice pravokotnika 11. // izpis obvestila 12. System.out.print("Vpiši dolžino in širino pravokotnika: "); 13. dolzinaa = vhod.nextdouble(); // vnos dolžine 14. sirinab = vhod.nextdouble(); // vnos širine 15. System.out.printf("Obseg pravokotnika s tranicami %f in %f je %f.", dolzinaa, sirinab, 16. obseg_pravokotnika(dolzinaa,sirinab)); // dejanska parametra dolzinaa in sirinab 17. } // metoda main /* metoda za izračun obsega pravokotnika 20. * vhod: stranicaa - dolžina pravokotnika, stranicab - širina pravokotnika Stran 65 ŠC VELENJE

66 21. * rezultat: obseg pravokotniak 22. */ 23. public static double obseg_pravokotnika(double stranica A, double stranicab) // formalna parametra stranicaa in stranicab 24. { 25. double obseg = 2 * stranicaa + 2 * stranicab; // deklaracija in izračun obsega 26. return obseg; // vračanje rezultata 27. } // metoda obseg_pravokotnika 28. } // razred Metode1 Primer izvajanja: Vpiši dolžino in širino pravokotnika: 4 8 Obseg pravokotnika s stranicami 4, in 8, je 24, Pretvarjanje podatkovnih tipov pri klicu metod Pretvorba podatkovnih tipov se izvede v primerih klica metode s parametri, kjer se parameter pretvori iz podatkovnega tipa manjšega obsega v podatkovni tip večjega obsega (ni izgube podatkov). Npr. klic metode Math.sqrt (9) povzroči izvršitev metode, ki pričakuje vhodni parameter podatkovnega tipa double. Deklariran seznam parametrov metode povzroči pretvorbo celoštevilčne vrednosti 9 v vrednost podatkovnega tipa double 9.0. Tabela pretvorb Podatkovni tip Ustrezni podatkovni tipi pretvorbe double / float double long float ali double int long ali float ali double char int ali long ali float ali double short int ali long ali float ali double byte short ali int ali long ali float ali double boolean / 8 TABELA OZ. POLJE Tabela oz. polje je zaporedje elementov enakega podatkovnega tipa. Elementi polja so shranjeni na sosednjih pomnilniških lokacijah. Vrednost posameznega elementa dobimo tako, da za ime spremenljivke polja med oglatimi oklepaji zapišemo indeks elementa. ime polja ime [indeks] elementi polja polje_stevil polje_stevil[0] 94 polje_stevil[1] -16 polje_stevil[2] 37 polje_stevil[3] -48 polje_stevil[4] -27 polje_stevil[5] 31 polje_stevil[6] -58 polje_stevil[7] -61 polje_stevil[8] -75 polje_stevil[9] -76 INFORMATIKA, Programiranje 1 in 2 Stran 66

67 Polje na sliki ima ime polje_stevil in vsebuje 10 elementov. Indeksi polja so od 0 do 9 (prvi indeks polja je vedno 0 ne glede na dolžino polja). Indeks polja je vedno pozitivna celoštevilčna vrednost. Vrednost tretjega elementa polja: polje_stevil[2]. Število elementov polja predstavlja spremenljivka length. Izraz ime_polja.length predstavlja dolžino polja oz. število elementov polja. Spremenljivki length ne moremo spremeniti vrednosti, ker je konstanta (final). Polje na sliki vsebuje 10 elementov. Elementi polja: polje_stevil[0], polje_stevil[1], polje_stevil[2]..., polje_stevil[9]. Vrednost elementa polje_stevil[0] je 94, polje_stevil[1] je -16, polje_stevil[2] je 37..., polje_stevil[9] je -76. Vsoto vrednosti prvih dveh elementov zapišemo: int vsota_prvega_in_drugega_elementa = polje_stevil[0] + polje_stevil[1]; Tako kot pri spremenljivkah, moramo tudi polje deklarirati oz. najaviti pred uporabo. Sintaksa deklaracije: podatkovni_tip[] ime = new razred_podatkovni_tip[število_elementov]; Primer: int[] polje_stevil = new int[10]; Deklaracija ustvari nov objekt desetih elementov podatkovnega tipa int. V spremenljivko polje_stevil se shrani pomnilniški naslov oz. referenca, kje se nahaja polje v pomnilniku. Ob ustvarjanju polja se vsem elementom polja določi privzeta vrednost. Tabela privzetih vrednosti Podatkovni tip Privzeta vrednost Osnovni številčni podatkovni tipi (int, double...) 0 Logični podatkovni tip (boolean) Reference (kazalci) na objekte Deklaracijo in ustvarjanje lahko izvedemo v dveh korakih: int[] polje_stevil; // deklaracija polja polje_stevil = new int[10]; // ustvarjanje polja V stavku polje_stevil = new int[10]; se v spremenljivko polja polje_stevil shrani referenca oz. pomnilniški naslov nahajališča oz. mesta polja v pomnilniku. V posameznem deklaracijskem stavku lahko ustvarimo več polj. int[] polje_stevil1 = new int[ 10 ], polje_stevil2 = new int[ 5 ]; Stavek ustvari dva polja celih števil. Prvo polje polje_stevil1 ima 10 elementov, drugo polje polje_stevil2 pa 5 elementov. Če v deklaraciji najavimo samo eno spremenljivko, potem lahko oglate oklepaje postavimo za rezerviranko podatkovnega tipa ali za ime spremenljivke, npr. int[] polje_stevil = new int[ 10 ]; // ali int polje_stevil[] = new int[ 10 ]; Deklariramo lahko polje poljubnega podatkovnega tipa. Polja osnovnih podatkovnih tipov vsebujejo vrednosti deklariranih podatkovnih tipov. Polja referenčnih tipov vsebujejo pomnilniške naslove oz. reference na objekte, ki so elementi polja. Polje polje_nizov deklarirano z izrazom String[] polje_nizov = new String[ 5 ]; vsebuje vrednosti referenc na objekte String. false null Stran 67 ŠC VELENJE

68 Deklaracija polja z inicializacijo vrednosti Ob deklaraciji polja lahko določimo začetne vrednosti elementov polja. Začetne vrednosti določimo s seznamom vrednosti, ki ga zapišemo med zavite oklepaje. int[] polje_stevil3 = { 3, 5, 6, 2, 8, 7, 3, 5, 9, 8 }; Dolžina polja v oglatih oklepajih izpustimo, ker je določena s številom elementov seznama začetnih vrednosti. Zgled: 1. // deklaracija in določitev začetnih vrednosti polja 2. int[] polje_stevil3 = { 3, 5, 6, 2, 8, 7, 3, 5, 9, 8 }; 3. // izpis naslovne vrstice 4. System.out.printf("\tIndeks\tpolje_stevil3\n"); // \t - tabulator (oblikovanje stolpcev) 5. // zanka za vse elemente polja, indeks i ==0.. število elementov polja 6. for (int i=0; i<polje_stevil3.length;i++) 7. // izpis vrednosti indeksa in elementa polja 8. System.out.printf("\t%d\t%d\n",i,polje_stevil3[i]); Primer izvajanja: Indeks polje_stevil Primeri 1. /* V polje se zapišejo ocene izpita predmeta (ocene od 1 do 10). 2. * Uporabnik določi število ocen. 3. * Izračun povprečne ocene predmeta in števila pozitivnih ocen. */ 4. public static void main(string[] args) { 5. // konstanta za število ocen 6. final int stevilo_ocen; 7. // deklacija objekta za vnos podatkov 8. Scanner vhod = new Scanner (System.in); 9. // izpis obvestila 10. System.out.print("Število ocen: "); 11. // vnos števila ocen 12. stevilo_ocen = vhod.nextint(); 13. // deklaracija polja celoštevilčnih vrednosti 14. int [] polje = new int[stevilo_ocen]; 15. // zanka for za vnos ocen izpita, števec => 0.. število ocen for (int i=0; i<polje.length; i++) 17. { // obvestilo za vnos ocene (i+1) 18. System.out.printf("%d. ocena: ",(i+1)); 19. polje[i] = vhod.nextint(); 20. } // for 21. INFORMATIKA, Programiranje 1 in 2 Stran 68

69 22. // izpis vrednosti polja in izračun povprečne ocene ter števila pozitivnih ocen 23. int vsota_ocen = 0; //deklariramo in inicializiramo vsoto ocen //deklariramo in inicializiramo število pozitivnih ocen int stevilo_pozitivnih_ocen = 0; 26. // izpis naslovne vrstice 27. System.out.printf("%8s%10s\n","Indeks","polje[i]"); 28. // zanka for za izpis elementov polja, števec => 0.. dolžina polja for (int i=0; i<polje.length; i++) 30. { // izpis vrednosti indeksa in elementa polja 31. System.out.printf("%8d%10d\n",i,polje[i]); 32. // vrednost elementa prištejemo vsoti 33. vsota_ocen = vsota_ocen + polje[i]; 34. // preverimo če je ocena večja od if (polje[i] > 5) 36. stevilo_pozitivnih_ocen++; // za ena povečamo število pozitivnih ocen 37. } 38. // izpišemo število pozitivnih ocen in povprečje ocen 39. System.out.printf("Število pozitivnih ocen je %d.\n",stevilo_pozitivnih_ocen); 40. System.out.printf("Povprečje vseh ocen je %f.\n",((double)vsota_ocen/polje.length)); 41. } // main Primer izvajanja: Število ocen: 5 1. ocena: 8 2. ocena: 6 3. ocena: 7 4. ocena: 5 5. ocena: 9 Indeks polje[i] Število pozitivnih ocen je 4. Povprečje vseh ocen je 7, /* Število samoglasnikov v besedilu. 2. * Uporabnik vnese besedilo. 3. * Izpis števila samoglasnikov 4. * */ 5. public static void main(string[] args) { 6. // deklaracija objekta niza besedila 7. String besedilo = new String(); 8. // deklaracija objekta za vnos podatkov 9. Scanner vhod = new Scanner(System.in); 10. // izpis obvestila za vnos 11. System.out.print("Besedilo: "); 12. besedilo = vhod.nextline(); 13. // besedilo pretvorimo v velike črke 14. besedilo = besedilo.touppercase(); 15. // deklaracija polja zamoglasnikov 16. String samoglasniki = "AEIOU"; 17. // deklaracija polja za štetje samoglasnikov - AEIOU Stran 69 ŠC VELENJE

70 18. int [] polje_stevilo_samoglasnikov = new int [5]; 19. // zanka za vse znake besedila, števec od 0.. dolžina besedila for (int i=0; i<besedilo.length(); i++) 21. { // mesto i-tega znaka besedila v nizu samoglasniki 22. int indeks_samoglasniki = samoglasniki.indexof(besedilo.substring(i, i+1)); 23. if (indeks_samoglasniki!= -1) // je i-ti znak besedila samoglasnik 24. // povečamo število teh samoglasnikov za polje_stevilo_samoglasnikov[indeks_samoglasniki] = 26. polje_stevilo_samoglasnikov[indeks_samoglasniki] + 1; 27. } // for 28. // izpis števila samoglasnikov 29. // zanka za vse možne samoglasnike, števec od 0 do dolžina niza samoglasniki for (int i=0; i<samoglasniki.length(); i++) 31. { 32. // izpis samoglasnika in števila pojavitev samoglasnika v besedilu 33. System.out.printf("%s%5d\n",samoglasniki.charAt(i), polje_stevilo_samoglasnikov[i]); 34. } // for 35. } // main Primer izvajanja: Besedilo: Število samoglasnikov. A 2 E 1 I 2 O 3 U Izboljšana oblika for stavka Izboljšana oblika for stavka omogoča iteracijo (ponavljanje) skozi elemente polja brez uporabe števca. Pri tej obliki ni možna napaka, da števec zavzame vrednost zunaj območja elementov polja. Sintaksa: for (parameter : ime_polja) stavek; Parameter je podatkovnega tipa elementa polja npr. int ime_polja; ime_polja predstavlja vrednost elementa polja skozi katerega poteka iteracija (ponavljanje) zanke. Primer 1. /* Izračun vsote celoštevilčnega polja z uporabo izboljšanje oblike stavka for. */ 2. public static void main( String[] args ) 3. { 4. // deklaracija in določitev elementov polja 5. int[] polje = { 8, 3, 4, 8, 5, 6, 7, 7, 2 }; 6. int vsota = 0; // vsota, začetna vrednost <= 0 7. // zanka vsak element polja prištejemo vsoti 8. for ( int element_polja : polje ) 9. vsota += element_polja; // vsota <= vsota + element polja 10. // izpis vsote 11. System.out.printf( "Vsota elementov polja je %d\n", vsota ); 12. } // main Primer izvajanja: Vsota elementov polja je 50. INFORMATIKA, Programiranje 1 in 2 Stran 70

71 8.1.1 Prenos polja v metodo razreda Za prenos polja metodi uporabimo ime polja brez oglatih oklepajev. Pri klicu metode se v metodo prenese referenca oz. pomnilniški naslov objekta v pomnilniku. Vsako polje ima določeno dolžino s poljem length. Zaradi tega ni potrebno pri prenosu posredovati še velikosti polja. Primeri Stran 71 // deklaracija polja za urne dnevne temperature double[] dnevnetemperature = new double [24]; // glava metode void spremenitemperature( double[] poljetemperatur ) // klic metode spremenitemperature(dnevnetemperature); V razredu PoljaPrenos1 je polje poljecene deklarirano v metodi main in je lokalno dostopno samo znotraj metode main. Pri klicu metode spremeniodstotek smo uporabili prvi argument ime polja. Prenos polja pomeni, da se prenese kopija reference oz. pomnilniškega naslova, kjer je lokacija polja v pomnilniku. Zaradi tega se spremembe nad poljem poljecene v metodi spremeniodstotek odražajo tudi kot spremembe polja v klicani metodi main. Večina programskih jezikov uporablja prenos parametrov po referenci in po vrednosti. Java podpira samo prenos po vrednosti. Če je argument metode celotno polje ali element polja, ki je posamezen objekt referenčnega podatkovnega tipa, potem klicana metoda prejme kopijo reference oz. pomnilniškega naslova. Če je argument metode posamezen element tabele osnovnega podatkovnega tipa (int, double...), potem klicana metoda prejme kopijo vrednosti elementa. Zgled v nadaljevanju demonstrira razliko med prenosom polja in prenosom vrednosti elementa polja, ki je osnovnega podatkovnega tipa. 1. // Prenos polja metodi razreda; spreminjanje vrednosti polja. 2. public class PoljaPrenos1 { 3. public static void main(string[] args) { 4. double[] poljecene = {56,34,78,34,65,78.6,20}; 5. // izpis osnovnih cen 6. System.out.println("Izpis osnovnih cen."); 7. izpis(poljecene); // klic metode izpis 8. // povečanje cen za 20 odstotokov 9. spremeniodstotek(poljecene, 20); // klic metode spremeniodstotek 10. System.out.println("Povečanje vseh cen za 20 %."); 11. System.out.println("Izpis spremenjenih cen."); 12. izpis(poljecene); // klic metode izpis 13. spremenicena(poljecene[1], 10); // klic metode spremenicena za drugi element polja 14. System.out.printf("Vrednost drugega elementa polja v metodi main je %f.", 15. poljecene[1]); 16. } // main // metoda poveča vrednosti elementov polja za določen odstotek 19. public static void spremeniodstotek(double[] poljecene, double odstotek) 20. { // zanka za vse elemente polja; števec od 0 do dolžina polja for (int i=0; i<poljecene.length; i++) 22. // vrednosti polja povečamo za odstotek 23. poljecene[i] = poljecene[i] * (1+odstotek/100); 24. } //metoda spremeniodstotek ŠC VELENJE

72 // metoda poveča vrednost parametra cena za določen odstotek in izpiše povečano vrednost 27. public static void spremenicena(double cena, double odstotek) 28. { 29. System.out.printf("Vrednost povečane cene drugega eelementa polja (%f)", cena); 30. // vrednost cena povečamo za odstotek 31. cena = cena * (1+odstotek/100); 32. // izpis 33. System.out.printf(" za odstotek (%f) je %f.\n",odstotek,cena); 34. } //metoda spremenicena // izpis polja 37. public static void izpis(double[] poljecene) 38. { //izpis naslovne vrstice 39. System.out.printf("%8s%8s\n","Element", "Cena"); 40. // zanka for za vse elemente polja; števec od 0 do število elementov polja for (int i=0; i<poljecene.length; i++) 42. System.out.printf("%6d%14f\n",(i+1),poljeCene[i]); 43. } //metoda izpis 44. } // razred PoljaPrenos1 Primer izvajanja: Izpis osnovnih cen. Element Cena 1 56, , , , , , , Povečanje vseh cen za 20 %. Izpis spremenjenih cen. Element Cena 1 67, , , , , , , Vrednost povečane cene drugega eelementa polja (40,800000) za odstotek (10,000000) je 44, Vrednost drugega elementa polja v metodi main je 40, Uporaba polja ocen izpita Ustvarimo razred s poljem tabele, ki vsebuje ocene posameznega izpita. Določimo metode: povprečje ocen, število pozitivnih ocen, najslabša ocena, najboljša ocena, izpis /* Razred OceneIzpita */ 2. public class OceneIzpita { 3. private double[] poljeocen; // tabela ocen posameznega izpita predmeta 4. private String nazivpredmeta; //naziv predmeta 5. INFORMATIKA, Programiranje 1 in 2 Stran 72

73 6. // konstruktor razreda 7. public OceneIzpita(double [] tpoljeocen, String tnazivpredmeta) 8. { 9. setnazivpredmeta(tnazivpredmeta); // inicializacija naziva predmeta 10. poljeocen = tpoljeocen; // ocene predmeta 11. } // konstruktor // metoda vrni naziv predmeta 14. public String getnazivpredmeta() { 15. return nazivpredmeta; 16. } // metoda getnazivpredmeta // metoda set naziv predmeta 19. public void setnazivpredmeta(string nazivpredmeta) { 20. this.nazivpredmeta = nazivpredmeta; 21. } // metoda setnazivpredmeta public double najmanjsaocena() 24. { // prva ocena je najmanjša 25. double tnajmanjsaocena = poljeocen[0]; 26. // zanka od druge do zanje ocene 27. for (int i=1; i< poljeocen.length; i++) 28. // je i-ta ocena manjša od najmanjše 29. if (poljeocen[i] < tnajmanjsaocena) 30. tnajmanjsaocena = poljeocen[i]; // t-ta ocena je nova najmanjša 31. return tnajmanjsaocena; 32. } //metoda najmanjsaocena public double povprecnaocena() 36. { // izracun povprečne ocene 37. double vsotaocen = 0; // vsota ocen, inicializacija na // zanka za vse ocene 39. for (int i=0; i< poljeocen.length; i++) 40. // trenutno oceno prištejemo vsoto 41. vsotaocen = vsotaocen + poljeocen[i]; 42. // vračanje povprečja 43. return (vsotaocen / poljeocen.length); 44. } //metoda povprecnaocena public double najvecjaocena() 48. { // prva ocena je največja 49. double tnajvecjaocena = poljeocen[0]; 50. // zanka od druge do zanje ocene 51. for (int i=1; i< poljeocen.length; i++) 52. // je i-ta ocena večja od največje 53. if (poljeocen[i] > tnajvecjaocena) 54. tnajvecjaocena = poljeocen[i]; // t-ta ocena je nova največja 55. return tnajvecjaocena; 56. } //metoda najvecjaocena // metoda za izpis naziva predmeta 59. public void izpisnazivapredmeta() 60. { Stran 73 ŠC VELENJE

74 61. System.out.printf("Predmet: %s.\n",getnazivpredmeta()); 62. } // metoda izpisnazivapredmeta // izpis polja ocen v obliki dveh stolpcev 65. public void izpisocen() 66. { // izpis naslovne vrstice 67. System.out.printf("%-8s%8s\n","Študent","Ocena"); 68. // zanka za vse elemente polja 69. for (int i=0; i < poljeocen.length; i++ ) 70. System.out.printf("%-8d%8f\n",(i+1), poljeocen[i]); 71. } // metoda izpisocen // obdelava ocen 74. public void obdelavaocen() 75. { 76. izpisnazivapredmeta(); // izvršitev metode 77. izpisocen(); // izvršitev metode 78. // izpis povprečne ocene 79. System.out.printf("Povprečna ocena je %f.\n", povprecnaocena()); 80. // izpis najmanjše ocene 81. System.out.printf("Najmanjša ocena je %f.\n", najmanjsaocena()); 82. // izpis največje ocene 83. System.out.printf("Največja ocena je %f.\n", najvecjaocena()); 84. } // metoda obdelavaocen 85. } 1. /* Razred za testiranje delovanja razreda OceneIzpita */ 2. public class TestOceneIzpita { 3. public static void main(string[] args) { 4. // dekaracija in inicializacija polja ocen 5. double [] poljeocen = {6,7,7,6,8,6,5,9}; 6. // deklaracija in ustvarjanje objekta OceneIzpita 7. OceneIzpita toceneizpita = new OceneIzpita(poljeOcen, "Programiranje"); 8. // klic metode 9. toceneizpita.obdelavaocen(); 10. } // main 11. } //razred TestOceneIzpita Primer izvajanja: Predmet: Programiranje. Študent Ocena 1 6, , , , , , , , Povprečna ocena je 6, Najmanjša ocena je 5, Največja ocena je 9, INFORMATIKA, Programiranje 1 in 2 Stran 74

75 8.2 Večdimenzionalna polja (tabele) Večdimenzionalna polja (tabele) si lahko predstavljamo kot polje (tabelo), ki ima za elemente drugo polje (tabelo). Podatki dvodimenzionalne tabele so razporejeni v vrstice in stolpce. V dvodimenzionalni tabeli dostopamo do elementov z dvema indeksoma. Element je določen najprej z indeksom vrstice in nato indeksom stolpca. ime polja stolpec[0] stolpec[1] stolpec[2] stolpec[3] stolpec[4] poljeint vrstica[0] vrstica[1] vrstica[2] vrstica[3] vrstica[4] vrstica[5] vrstica[6] vrstica[7] vrstica[8] vrstica[9] ime polja stolpec[0] stolpec[1] stolpec[2] stolpec[3] stolpec[4] poljeint vrstica[0] poljeint[0][0] poljeint[0][1] poljeint[0][2] poljeint[0][3] poljeint[0][4] vrstica[1] poljeint[1][0] poljeint[1][1] poljeint[1][2] poljeint[1][3] poljeint[1][4] vrstica[2] poljeint[2][0] poljeint[2][1] poljeint[2][2] poljeint[2][3] poljeint[2][4] vrstica[3] poljeint[3][0] poljeint[3][1] poljeint[3][2] poljeint[3][3] poljeint[3][4] vrstica[4] poljeint[4][0] poljeint[4][1] poljeint[4][2] poljeint[4][3] poljeint[4][4] vrstica[5] poljeint[5][0] poljeint[5][1] poljeint[5][2] poljeint[5][3] poljeint[5][4] vrstica[6] poljeint[6][0] poljeint[6][1] poljeint[6][2] poljeint[6][3] poljeint[6][4] vrstica[7] poljeint[7][0] poljeint[7][1] poljeint[7][2] poljeint[7][3] poljeint[7][4] vrstica[8] poljeint[8][0] poljeint[8][1] poljeint[8][2] poljeint[8][3] poljeint[8][4] vrstica[9] poljeint[9][0] poljeint[9][1] poljeint[9][2] poljeint[9][3] poljeint[9][4] Na sliki je dvodimenzionalna tabela, ki vsebuje deset vrstic in pet stolpcev. Vsak element tabele je določen z izrazom ime_tab_spremenljivke[indeks_vrstice][indeks_stolpca]. Vsi elementi prve vrstice imajo indeks vrstice 0, vsi elementi tretjega stolpca imajo indeks stolpca 4. Sintaksa deklaracije: podatkovni_tip[][] ime = new razred_podatkovni_tip[število_elementov][število_elementov]; Primer: int[][] polje_stevil = new int[10][5]; Deklaracija polja z inicializacijo vrednosti Ob deklaraciji polja lahko določimo začetne vrednosti elementov polja. Začetne vrednosti določimo s seznamom vrednosti, ki vsebuje seznam vrednosti vrstice. int[][] poljeint = { {-24,-57,-35,13,-99}, {30,-46,-61,69,7}, {85,98,99,55,-97}, {-14,57,94,-43,72}, {21,59,74,76,-17}, {77,-42,10,-40,3}, {-42,-79,99,52,43}, {98,75,-38,50,2}, {85,30,-13,-11,84}, {-94,-98,-67,-60,27} }; Začetne vrednosti so združene v zavitih oklepajih po posameznih vrsticah. Vrednosti {-24,-57,-35,13,-99} predstavljajo elemente prve vrstice z indeksom vrstice 0, npr. poljeint[0][0] = -24, poljeint[0][1] = -57, poljeint[0][2] = -35, poljeint[0][3] = 13 in poljeint[0][4] = -99. Stran 75 ŠC VELENJE

76 Dvodimenzionalna polja z različnim številom elementov v vrsticah Deklaracija z inicializacijo dveh vrstic z različnim številom elementov double[][] poljevrstice = { {5, 12.5, 8}, {78, 6, 2.1, 5, 9} }; Prva vrstica polja poljevrstice vsebuje tri elemente, druga pa pet elementov. Primeri: 1. /* Primer izpisa dvodimenzionalne tabele celih števil. 2. * Primer inicializacije in izpisa dvodimenzionalne tabele znakov angleške abecede. */ public class PoljaDvodim1 { public static void main(string[] args) { 7. // deklaracija in inicializacija dvodimenzionalnega polja 10 x 5 8. int[][] poljeint = { {-24,-57,-35,13,-99}, {30,-46,-61,69,7}, {85,98,99,55,-97}, 9. {-14,57,94,-43,72}, {21,59,74,76,-17}, {77,-42,10,-40,3}, 10. {-42,-79,99,52,43}, {98,75,-38,50,2}, {85,30,-13,-11,84}, 11. {-94,-98,-67,-60,27} }; char [][] poljechar = new char [5] []; // ustvarimo pet vrstic 14. poljechar[0] = new char [3]; // prva vrstica ima tri stolpce 15. poljechar[1] = new char [2]; // druga vrstica ima dva stolpca 16. poljechar[2] = new char [3]; // tretja vrstica ima tri stolpce 17. poljechar[3] = new char [5]; // četrta vrstica ima pet stolpcev 18. poljechar[4] = new char [5]; // peta vrstica ima pet stolpcev 19. // klic metode za izpis 20. izpis(poljeint); 21. // klic metode za določitev elementov tabele znakov angleške abecede 22. ustvariznake(poljechar); 23. // izpis prazne vrstice 24. System.out.println(); 25. // klic metode za izpis 26. izpis(poljechar); 27. } // main // metoda za izpis dvodimenzionalnega polja celih števil 30. public static void izpis(int[][] poljestevila) 31. { 32. System.out.println("Dvodimenzionalna tabela celih števil"); 33. // zanka vrstice, števec od 0 do število vrstic for (int vrstica = 0; vrstica<poljestevila.length; vrstica++) 35. { 36. // zanka stolpci, števec od 0 do število stolpcev trenutne vrstice for (int stolpec=0; stolpec<poljestevila[vrstica].length; stolpec++ ) 38. // izpis elementa polja 39. System.out.printf("%8d", poljestevila[vrstica][stolpec]); 40. // prehod v novo vrstico 41. System.out.println(); 42. } //zanka vrstice 43. } // izpis // metoda za inicializacijo znakov angleške abecede: A.. Z 46. public static void ustvariznake(char[][] poljeznaki) 47. { // zanka vrstice, števec od 0 do število vrstic for (int vrstica = 0; vrstica<poljeznaki.length; vrstica++) INFORMATIKA, Programiranje 1 in 2 Stran 76

77 49. { // zanka stolpci, števec od 0 do število stolpcev trenutne vrstice for (int stolpec=0; stolpec<poljeznaki[vrstica].length; stolpec++ ) 51. // določitev naključnega znaka 52. poljeznaki[vrstica][stolpec] = (char) (65 + (int) (Math.random()* ( ))); 53. } //zanka vrstice 54. } // ustvariznake // metoda za izpis dvodimenzionalnega polja znakov 57. public static void izpis(char[][] poljeznaki) 58. { 59. System.out.println("Dvodimenzionalna tabela znakov angleške abecede"); 60. // zanka vrstice, števec od 0 do število vrstic for (int vrstica = 0; vrstica<poljeznaki.length; vrstica++) 62. { // zanka stolpci, števec od 0 do število stolpcev trenutne vrstice for (int stolpec=0; stolpec<poljeznaki[vrstica].length; stolpec++ ) 64. // izpis elementa polja 65. System.out.printf("%8c", poljeznaki[vrstica][stolpec]); 66. // prehod v novo vrstico 67. System.out.println(); 68. } //zanka vrstice 69. } // izpis 70. } Primer izvajanja: Dvodimenzionalna tabela celih števil Dvodimenzionalna tabela znakov angleške abecede Y N L J Q F J T J R F E P W M I Y C Stran 77 ŠC VELENJE

78 8.3 Urejanje podatkov Pogosto se v praksi srečamo z nalogo, da moramo podatke urediti po predpisanem vrstnem redu. Podatke lahko uredimo na več možnih načinov Urejanje po metodi izbora najmanjšega elementa poiščemo najmanjše število v neurejeni tabeli, postavimo ga na prvo mesto neurejenega dela tabele, hkrati pa število, ki je bilo do tedaj na prvem mestu neurejenega dela tabele postavimo na mesto, na katerem smo našli najmanjše število v neurejeni tabeli, neurejeni del tabele se s tem zmanjša za eno število, to ponavljamo dokler v neurejenem delu tabele ne ostane samo eno število, ki je hkrati največje v urejeni tabeli. Pomembno je, da si shranimo indeks oz. mesto, na katerem najdemo najmanjše število v neurejenem delu tabele in začetni indeks oz. mesto neurejenega dela tabele. Zgled: Neurejene tabela ima 8 elementov {45,80,32,12,40,60,70,72}. Indeks Indeks min. ele.: Indeks min. ele.: Indeks min. ele.: Indeks min. ele.: Indeks min. ele.: Indeks min. ele.: Indeks min. ele.: urejeni del tabele neurejeni del tabele Primer: 1. // urejanje po metodi izbora najmanjšega elementa 2. public static void urediminimalno(double[] tabelastevil) 3. { 4. // ponavljanje => n-1 krat z vrednostmi indeksov od 0 do dolžina tabele-2 5. for (int i=0; i<=tabelastevil.length-2;i++) 6. { 7. int indeksminimalnega = i; // prvi indeks neurejenega dela tabele določimo za minimalnega 8. /* ponavljanje - vrednosti indeksov neurejenega dela tabele razen prvega elementa neurejenega dela 9. poiščemo indeks najmanjšega elementa v enurejenem delu tabele */ 10. for (int j=i+1; j<=tabelastevil.length-1;j++) 11. if (tabelastevil[j] < tabelastevil[indeksminimalnega]) 12. indeksminimalnega = j; 13. /* če je indeks minimalnega elementa tabele različen od indeksa prvega elementa v neurejenem delu tabele */ 14. if (indeksminimalnega!=i) 15. { // zamenjava elementov v tabeli 16. double pomoznostevilo = tabelastevil[indeksminimalnega]; 17. tabelastevil[indeksminimalnega] = tabelastevil[i]; 18. tabelastevil[i] = pomoznostevilo; 19. } INFORMATIKA, Programiranje 1 in 2 Stran 78

79 20. } // zanka for 21. } // metoda urediminimalno Število primerjav, ki jih opravimo je: prvo pregledovanje: n-1, drugo = n-2,...in pri zadnjem 1. Skupaj je primerjav: n * (n-1) / Urejanje po metodi mehurčkov (bubble sort) Zgled: začnemo na začetku tabele, primerjamo i-ti in i+1-vi element tabele; če nista v predpisanem zaporedju, ju zamenjamo, v enem prehodu skozi tabelo pomaknemo največje število na konec tabele, manjša števila pa pomikamo proti začetku tabele, zgornja koraka ponavljamo dokler ni tabela urejena. Indeks Prehod 1: Prehod 2: Prehod 3: Prehod 4: Primer: 1. // urejanje po metodi mehurčkov 2. public static void uredimehurcki(double[] tabelastevil) 3. { 4. // zastavica - vsaj enea zamenjava v posameznem prehodu 5. boolean urejena = false; 6. // dokler tabela ni urejena 7. while (!urejena) 8. { 9. // zastavica - trenutni prehod je brez zamenjave 10. urejena= true; Stran 79 ŠC VELENJE

80 11. // zanka za en prehod, vrednostmi indeksov od 0 do dolžina tabele for (int j=0; j<=tabelastevil.length-2;j++) 13. // primerjava sosednjih elementov tabele 14. if (tabelastevil[j] > tabelastevil[j+1]) 15. { 16. // zamenjava vrednosti sosednjih elementov 17. double pomoznostevilo = tabelastevil[j]; 18. tabelastevil[j] = tabelastevil[j+1]; 19. tabelastevil[j+1] = pomoznostevilo; 20. // še ni urejena, saj smo opravili vsaj eno zamenjavo v tekočem prehodu 21. urejena = false; 22. } // if 23. } // while 24. } // metoda uredimehurcki Program lahko izboljšamo, če upoštevamo, da je smiselno pregledovati tabelo v naslednjem prehodu le še do mesta, kjer smo v prejšnem prehodu napravili zadnjo zamenjavo. Od mesta zadnje zamenjave naprej so podatki že urejeni Binarno iskanje Problem iskanja določenega elementa v urejenem zaporedju elementov. Pogoj za binarno iskanje je, da so elementi tabele urejeni po velikosti. Urejeno tabelo razdelimo enakomerno na dve polovici. Iskani podatek je lahko v prvi ali v drugi polovici tabele. Ustrezno polovico tabele izberemo s pomočjo primerjave iskanega podatka s sredinskim elementom tabele. Z eno primerjavo izločimo polovico tabele. Iskanje nadaljujemo na isti način v izbrani polovici. Postopek ponavljamo dokler ne najdemo števila, ki ga iščemo ali dokler ne ugotovimo, da iskanega števila ni v tabeli. Indeks Ugotovimo, če je število 32 element tabele? spodaj= 0 zgoraj= 7 sredina=: 3 Iskano število 32 je manjše ali enako kot 45. spodaj= 0 zgoraj= 3 sredina=: 1 Iskano število 32 je manjše ali enako kot 32. spodaj= 0 zgoraj= 1 sredina=: 0 Iskano število 32 je večje kot 12. spodaj= 1 zgoraj= 1 sredina=: 1 Število 32 je v tabeli na indeksu 1. Primer 1. // binarno iskanje števila v urejenem polju 2. public static int iskanjebinarno 3. (double[] tabelastevil, // polje števil 4. double iskanostevilo ) // število, ki ga iščemo v tabeli 5. { 6. // spodaj - spodnji indeks tabele, zgoraj - zgornji indeks tabele 7. // v katerem iščemo iskano število INFORMATIKA, Programiranje 1 in 2 Stran 80

81 8. int spodaj, zgoraj, sredina; 9. spodaj = 0; 10. zgoraj = tabelastevil.length -1; 11. while (spodaj < zgoraj) 12. { 13. sredina = (spodaj + zgoraj) / 2; 14. if (iskanostevilo > tabelastevil[sredina]) 15. spodaj = sredina + 1; 16. else 17. zgoraj=sredina; 18. } 19. if (iskanostevilo == tabelastevil[spodaj]) 20. return spodaj; 21. else 22. return -1; 23. } Urejanje z vstavljanjem Navadno vstavljanje Vse elemente od drugega mesta do konca tabele vstavimo na ustrezno mesto v urejeni del tabele. Vedno primerjamo vrednost elementa, ki ga vstavljamo z vsemi predhodnimi elementi, dokler ne naletimo na prvega manjšega v urejeni tabeli. Pri tem vse večje elemente pomikamo za eno mesto v desno, da pridobimo prostor za vstavljanje na ustrezno mesto v urejeni del tabele. Z ustreznim vstavljanjem enega elementa se urejeni del tabele poveča za ena. Običajno si pomagamo s stražarjem (v tabelo pred prvi element vstavimo element, ki ga vstavljamo), da lažje zaključimo vstavljanje. 1. // urejanje z vstavljanjem 2. public static void uredizvstavljanjem (double[] tabelastevil) 3. { 4. // od drugega do zadnjega elementa 5. for (int i = 1; i<=tabelastevil.length-1;i++) 6. { 7. // shranimo vrednost itega elementa 8. double itielement=tabelastevil[i]; 9. int j; 10. boolean premik = false; 11. for (j=i-1;j>=0 && tabelastevil[j]>itielement;j--) 12. { 13. tabelastevil[j+1]=tabelastevil[j]; // premik elementov v desno 14. premik=true; 15. } 16. // če je bil premik v desno 17. if (premik) 18. // vstavimo na ustrezno mesto itega 19. tabelastevil[j+1]=itielement; 20. } // for 21. } // uredizvstavljanjem Stran 81 ŠC VELENJE

82 Binarno vstavljanje Vse elemente od drugega mesta do konca tabele vstavimo na ustrezno mesto v urejeni del tabele. Elementi, ki se nahajajo v tabeli levo od elementa, ki ga vstavljamo, so urejeni. To nam omogoča uporabo binarnega iskanja mesta, na katerega bomo ta element vstavili. Ko ugotovimo mesto, premaknemo vse elemente urejenega dela tabele od mesta vstavljanja elementa do konca urejenega dela tabele za eno mesto v desno. Primer 1. // urejanje z binarnim vstavljanjem 2. public static void uredizbinarnimvstavljanjem 3. (double tabelastevil[]) 4. { 5. // od drugega do n-tega elementa 6. for (int i = 1; i<=tabelastevil.length-1;i++) 7. { 8. // shranimo vrednost itega elementa 9. double itielement=tabelastevil[i]; 10. // leva in desna meja področja iskanja (v urejenem delu) 11. int levi1=0,desni1=i-1; 12. while (levi1 <= desni1) 13. { 14. // indeks sredinskiinskega 15. int sredinski= (levi1 + desni1) / 2; 16. // primerjamo itielement z vrednostjo sredinskiinskega 17. if (itielement < tabelastevil[sredinski]) 18. // nov desni indeks področja iskanja 19. desni1=sredinski - 1; 20. else 21. // nov levi indeks področja iskanja 22. levi1 = sredinski +1 ; 23. } //while 24. // prepis v desno 25. for (int j=i-1; j >= levi1; j--) 26. tabelastevil[j+1] = tabelastevil [j]; 27. // postavimo itielement na ustrezno prosto mesto 28. tabelastevil[levi1] = itielement; 29. } // for 30. } // uredizbinarnimvstavljanjem INFORMATIKA, Programiranje 1 in 2 Stran 82

83 9 RAZRED 9.1 Uvod v razrede, objekte in metode Java je objektno (predmetno) usmerjen programski jezik. Programska koda je sestavljena iz dveh ali več razredov. Razred z metodami (angl. methods) in polji (lastnostmi) ima določene aktivnosti razreda. Razredi predstavljajo komponente za razvoj programov. Metodam razreda pravimo tudi funkcije. Metode in razredne spremenljivke (polja) določajo razred. Ustvarimo lahko več objektov (primerkov) istega razreda. Ustvarimo definicijo razreda Izpiti, ki bo osnova za podatke o izpitih. V razredu Izpiti najprej določimo metodi za izpis obvestila besedilne konstante in vrednosti vhodnega argumenta. 1. /* Izpiti.java razred Izpiti z dvema metodama za izpis obvestila 2. public class Izpiti 3. { 4. // metoda razreda, izpis pozdravnega obvestila 5. public void izpisobvestila() 6. { 7. System.out.println("Dobrodošli v izpitni sistem.\n"); 8. } //konec metode 9. // metoda razreda, izpis obvestila vrednosti vhodnega argumenta 10. public void izpisobvestila (String besedilo) 11. { 12. System.out.println(besedilo); 13. } // konec metode 14. } // konec razreda Najavo razreda začnemo z rezerviranko public. V začetnih programih vsak razred določimo public. Vsaka najava razreda vsebuje rezerviranko class, ki ji sledi ime razreda in med zavitima oklepajema določene metode in spremenljivke razreda (polja). Razred Izpiti vsebuje metodi izpisobvestila() in izpisobvestila (String besedilo). Razred ne vsebuje metode main, ki predstavlja mesto začetka izvajanja programa. Začetek izvajanja bomo v tem primeru določili v drugem razredu, ki ga bomo uporabili za testiranje razreda Izpiti. V metodah smo uporabili rezerviranki public in void. Rezerviranka public določa, da lahko metodo uporabljamo oz. izvedemo klic metode tudi v drugih razredih. Rezerviranka void določa, da metoda ne vrača nobene vrednosti. Podatkovnemu tipu rezultata metode sledi ime metode (izpisobvestila). Ime metode zapišemo z malo začetnico. Če je ime sestavljeno iz več besed, potem vsako novo besedo zapišemo z veliko začetnico. Za imenom v okroglih oklepajih določimo parametre metode. V drugi metodi smo uporabili vhodni parameter besedilo podatkovnega tipa razreda String. Obe metodi vsebujeta le stavek za izpis System.out.println. V prvi metodi izpišemo vrednost besedilne konstante, v drugi pa vrednost vhodnega parametra metode. Za preverjanje delovanja moramo zapisati še testni razred, ki vsebuje tudi metodo main. /* TestIzpiti.java */ 1. //najava uporabe razreda Scanner 2. import java.util.scanner; //razred IzpitiTest z metodo za začetek izvajanja programa 5. public class TestIzpiti 6. { 7. public static void main(string[] args) 8. { // metoda main 9. Stran 83 ŠC VELENJE

84 10. // ustvarimo primerek objekta oz. predmet razreda Izpiti 11. Izpiti tizpit = new Izpiti(); 12. // ustvarimo primerek objekta razreda Scanner za vnos 13. Scanner besedilo = new Scanner(System.in); 14. // izpis obvestila za vnos naziva izpita 15. System.out.println("Vnesite obvestilo: "); 16. // vnos besedila 17. String tobvestilo = besedilo.nextline(); 18. // izpis vnesenega besedila 19. System.out.print("Izpis obvestila: "); 20. // izpis z uporabo metode izpisobvestila razreda Izpiti 21. tizpit.izpisobvestila(tobvestilo); 22. } //konec metode main 23. } //konec razreda IzpitiTest V 2. vrstici najavimo uporabo razreda Scanner. V razredu TestIzpiti ustvarimo javno statično metodo main, ki ima vhodni parameter, ki predstavlja polje predmetov String in se imenuje args. V polju args so shranjeni vsi vhodni parametri ukazne funkcije, ki jih lahko posredujemo ob zagonu programa. S stavkom Izpiti tizpit = new Izpiti() v 11. vrstici ustvarimo nov objekt tizpit razreda Izpiti. Nato ustvarimo nov objekt besedilo razreda Scanner, v katerega shranimo uporabnikov vnos besedila v zaslonskem oknu. Z metodo besedilo.nextline() v spremenljivko tobvestilo zapišemo vrednost vpisanega besedilo uporabnika. V vrstici 19 izpišemo na zaslon besedilo "Izpis obvestila: ". V 21. vrstici s stavkom tizpit.izpisobvestila(tobvestilo) izvedemo metodo izpisobvestila(tobvestilo) razreda Izpiti. tobvestilo predstavlja argument metode, ki se prenese v vhodni parameter besedilo metode izpisobvestila. Metoda izpiše na zaslon vrednost vhodnega parametra. Prevajanje programa z več razredi v ukaznem oknu V ukaznem oknu se premaknemo v mapo, ki vsebuje izvorno kodo programa in vpišemo ukaz: javac Izpiti.java TestIzpiti.java Ukaz prevede oba navedena dokumenta programske kode. Če imamo v mapi samo dokumente te aplikacije, potem lahko uporabimo krajši ukaz: javac *.java Znak * predstavlja vse dokumente, ki imajo v imenu dokumenta priponko "java". Zakaj ni potrebno najaviti deklaracije uporabe razreda String, System in v našem primeru razreda Izpiti? Razreda String in System sta v paketu java.lang. Paket java.lang ima privzeto samodejno najavo, zato razredov tega paketa ni potrebno najavljati z import stavkom. Razredi, ki so v isti mapi se obravnavajo kot da so v istem paketu (angl. default package) in jih prav tako ne najavljamo s stavkom import. Primer izvajanja: Vnesite obvestilo: Test delovanja metode razreda. Izpis obvestila: Test delovanja metode razreda. Najava uporabe (deklaracija) razreda Scanner v vrstici 2 ni potrebna, če na vseh mestih v programu uporabljamo sklic celotnega imena paketa in imena razreda. V našem primeru moramo potem vrstico 13. zapisati v obliki: java.util.scanner besedilo = new java.util.scanner(system.in); Celotno ime paketa razreda Scanner je "java.util". UML razredni diagram razreda Izpiti INFORMATIKA, Programiranje 1 in 2 Stran 84

85 Stran 85 Izpiti +izpisobvestila(string besedilo) Iz UML diagrama je razvidno, da ima razred Izpiti javno metodo izpisobvestila (znak "+" pred metodo določa, da je metoda javna). Spremenljivke, set in get metode Spremenljivke deklarirane znotraj metode so lokalne in jih lahko uporabljajo samo v metodi v kateri so deklarirane. Objekt (predmet) običajno ima lastnosti oz. atribute. Lastnosti razreda obstajajo pred, med in po izvršitvi metode razreda. Razredi imajo eno ali več metod za spreminjanje in dostop do vrednosti polj oz. razrednih spremenljivk. Razredne spremenljivke so deklariranje znotraj razreda pred razrednimi metodami (zunaj področja metod). Vsak predmet oz. objekt razreda uporablja oz. vzdržuje svoje kopije razrednih spremenljivk, ki jih imenujemo tudi izvodne spremenljivke. Razred Izpiti razširimo z razredno spremenljivko. Za spreminjanje in dostop do vrednosti razredne spremenljivke uporabimo metode. 1. // razred Izpiti z razredno spremenljivko izpit 2. public class Izpiti { 3. // razredna spremenljivka oz. polje razreda 4. private String izpit; // metoda - konstruktor za določitev začetne vrednosti 7. public Izpiti(String tizpit) 8. { 9. izpit = tizpit; 10. } // konec metode Izpiti // metoda vrne vrednost razredne spremenljivke 13. public String getizpit() 14. { 15. // vračanje vrednosti 16. return izpit; 17. } // konec metode // metoda določi vrednost razredne spremenljivke 20. public void setizpit(string tizpit) 21. { 22. // določitev vrednosti 23. izpit = tizpit; // v razredno spremenljivko zapišemo vrednost vhodnega parametra 24. } // konec metode setizpit public void izpis() 27. { 28. // izpis 29. System.out.print(getIzpit()); 30. } // konec metode izpis 31. } // konec razreda Izpiti V 4. vrstici je deklarirana razredna spremenljivka izpit kot razredna spremenljivka razreda String. private String izpit; Rezerviranka private določa, da je razredna spremenljivka dosegljiva oz. vidna samo znotraj razreda v katerem je deklarirana (v našem primeru znotraj razreda Izpiti). Do privatnih razrednih spremenljivk dostopamo z metodami razreda. ŠC VELENJE

86 Če deklariramo razredno spremenljivko z rezerviranko public, potem je razredna spremenljivka dostopna oz. dosegljiva tudi v ostalih razredih. Ta način redko uporabimo, ker so s tem programi nepregledni in je večja verjetnost napak. Pomni! Vsako razredno spremenljivko oz. polje in metodo deklariramo s pridevnikom dostopa. Konstruktor Metodo razreda z enakim imenom kot je ime razreda imenujemo konstruktor. Konstruktor je metoda, ki določi privzete (začetne vrednosti) vrednosti razrednih spremenljivk in ne vrne nobene vrednosti (ne vsebuje stavka return). Če razred nima določenega konstruktorja, se uporabi privzeti Java konstruktor (brez argumentov), ki ne izvede aktivnosti oz. ne določi privzete vrednosti razrednih spremenljivk. Razred lahko vsebuje več konstruktorjev, ki se med seboj razlikujejo po številu vhodnih argumentov. Konstruktor razreda Izpiti ima vhodni parameter tizpit. Ob ustvarjanju novega predmeta razreda Izpiti uporabimo parameter za določitev začetne vrednost razredne spremenljivke oz. polja razreda. Metoda setizpit (vrstice 20-24) določi vrednost razredne spremenljivke in ne vrne nobene vrednosti (rezerviranka void). Metoda ima vhodni argument, ki sprejme vrednost, ki se shrani kot nova vrednost razredne spremenljivke izpit. Metoda getizpit vrne vrednost razredne spremenljivke izpit. Ta metoda omogoča dostop do razredne spremenljivke izpit zunaj razreda Izpiti. Metoda nima argumentov in za izvajanje ne potrebuje dodatnih informacij. Metoda vrne vrednost tipa razreda String. Metodam, ki vračajo vrednosti, moramo določiti podatkovni tip rezultata (podatkovni tip je različen od void). Te metode po uspešni izvršitvi aktivnosti vrnejo rezultat metodi iz katere je bila metoda klicana. Return stavek v 16. vrstici vrne vrednost izvodne razredne spremenljivke izpit (vrednost se vrne v stavek v katerem je bil uporabljen klic metode getizpit). Metoda izpis ne vrne vrednosti in nima vhodnih parametrov. Metoda izpiše vrednost razredne spremenljivke. Testni razred za preverjanje delovanja razreda Izpiti. 1. // najava uporabe (deklaracija) razreda Scanner 2. import java.util.scanner; //razred TestIzpiti 5. public class TestIzpiti 6. { 7. // metoda main 8. public static void main(string[] args) 9. { // izpis obvestila za vnos naziva izpita 10. System.out.print("Vpišite naziv izpita: "); 11. // ustvarjanje primerka objekta Scanner za vnos v ukaznem oknu 12. Scanner tvnos = new Scanner(System.in); 13. // branje vnosa v predmet razreda String 14. String strizpit = tvnos.nextline(); 15. // ustvarjanje predmeta razreda Izpiti 16. Izpiti tizpit = new Izpiti(strIzpit); 17. // izvršitev metode izpis() razreda Izpiti 18. tizpit.izpis(); 19. } // konec metode main 20. } // konec razreda TestIzpiti Primer izvajanja: INFORMATIKA, Programiranje 1 in 2 Stran 86

87 Vpišite naziv izpita: Programiranje Programiranje Razred TestIzpiti ustvari predmet razreda Izpiti in demonstrira uporabo metode izpis(). V prvem delu metode main izvedemo branje oz. vnos naziva izpita v lokalno spremenljivko strizpit. V vrstici 16 ustvarimo nov predmet razreda Izpiti in ga shranimo v lokalno spremenljivko tizpit podatkovnega tipa razreda Izpiti. V vrstici 18 izvršimo metodo izpis() razreda Izpiti. Metoda na zaslon izpiše vrednost razredne spremenljivke oz. polja razreda Izpiti. Set in get metode Privatna polja razreda upravljamo (uporabljamo) preko razrednih metod. Razredi vsebujejo javne metode za spreminjanje in branje vrednosti polj. V razredu Izpiti je get metoda getizpit(); set metoda pa setizpit(string tizpit). UML razredni diagram razreda Izpiti Izpiti -izpit: String <constructor> Izpiti(String tizpit) +getizpit() : String +setizpit(string tizpit) +izpis() Oglejmo si še primer preprostega programa za vodenje stanja na dveh transakcijskih računih. 1. // razred transakcijski račun - TRR 2. public class TRR 3. { 4. private double stanje; // stanje na računu 5. private String stevilkatr; // številka transakcijskega računa public TRR(String ttr, double tstanje) // konstruktor 8. { 9. stanje = tstanje; 10. stevilkatr = ttr; 11. } // konec konstruktorja public void setstevilkatr(string ttr ) // metoda za spremembo številke TR 14. { 15. stevilkatr = ttr; 16. } // konec metode za spremembo številke TR public void setstanje(double tstanje) // metoda za določitev stanja na TR 19. { 20. stanje = tstanje; 21. } // konec metode za določitev stanja na TR public double getstanje() // metoda vrne stanja TR 24. { 25. return stanje; 26. } // konec metode vrne stanja TR Stran 87 ŠC VELENJE

88 public String getstevilkatr() // metoda vrne številko TR 29. { 30. return stevilkatr; 31. } // konec metode vrne številko TR public void transakcija(double tsprememba) // metoda spremeni stanje TR 34. { 35. stanje = stanje + tsprememba; 36. } // konec metode spremeni stanje TR } //konec razreda TRR 1. // testni razred 2. import java.util.scanner; 3. public class TestTRR { public static void main(string[] args) 6. { // metoda main 7. // ustvarimo primerek objekta rezreda Scanner za vnos podatkov 8. Scanner vnos = new Scanner(System.in); 9. // izpis obvestila za vnos 10. System.out.println("Podatki o 1. računu: "); 11. System.out.print("Številka računa: "); 12. // vnos uporabnika shranimo v razredno spremenljivko tipa Razreda String 13. String tstevilka1 = vnos.nextline(); 14. // deklaracija oz. najava spremenljivk za dva transakcijska računa - tipa razreda TRR 15. TRR tracun1; 16. TRR tracun2; 17. // v predmetno spremenlivko shranimo izvod predmeta TRR 18. tracun1 = new TRR(tStevilka1,0.0); 19. // izpis obvestila za vnos 20. System.out.println("Podatki o 2. računu: "); 21. System.out.print("Številka računa: "); 22. // vnos uporabnika shranimo v razredno spremenljivko tipa Razreda 23. String tstevilka2 = vnos.nextline(); 24. // v predmetno spremenlivko shranimo izvod predmeta TRR 25. tracun2 = new TRR(tStevilka2,0.0); 26. // izpis obvestila za vnos pologa na prvi račun 27. System.out.print("Znesek pologa na račun 1: "); 28. // vnos uporabnika shranimo v spremenljivko tipa Double 29. Double tznesek = vnos.nextdouble(); 30. // klic metode transakcija s posredovanjem vrednosti pologa 31. tracun1.transakcija(tznesek); 32. // izpis številke in stanja prvega TR 33. System.out.println("Stanje na računih"); 34. System.out.println(" "); 35. System.out.print(tRacun1.getStevilkaTR()); 36. System.out.print(" "); 37. System.out.printf("=> %f\n",tracun1.getstanje()); 38. // izpis številke in stanja drugega TR 39. System.out.println(" "); 40. System.out.print(tRacun2.getStevilkaTR()); 41. System.out.print(" "); 42. System.out.printf("=> %f",tracun2.getstanje()); 43. } // konec metode main INFORMATIKA, Programiranje 1 in 2 Stran 88

89 44. } // konec TestTRR Izvajanje Podatki o 1. računu: Številka računa: Podatki o 2. računu: Številka računa: Znesek pologa na račun 1: 630 Stanje na računih => 630, => 0, Povzetek Deklaracija javnega razreda (rezerviranka public) je vedno shranjena v dokumentu, ki ima enako ime kot je ime razreda in ima priponko ".java". Deklaracija oz. najava razreda vsebuje rezerviranko class, ki ji sledi ime razreda. Z rezerviranko public so deklarirane metode, ki jih lahko uporabljamo oz. izvršimo v drugem razredu. Z rezerviranko void so določene metode, ki po izvršitvi aktivnosti ne vrnejo vrednosti. Po dogovoru ime metode začnemo z malo črko in nato vse sestavljene besedo zapišemo z veliko začetnico (npr. spremenistanjeracuna). Če so za imenom metode prazni oklepaji, potem metoda ne potrebuje parametrov za izvršitev aktivnosti metode. Telo metode je zapisano znotraj zavitih oklepajev - { }. Izvajanje programa se začne v metodi z imenom main. Nov izvod objekta (predmeta) razreda ustvarimo z rezerviranko new. Klic metode objekta izvršimo tako, da imenu spremenljivke sledi ločilo oz. znak ".", ime metode in znotraj okroglih oklepajev seznam argumentov metode, ki so med seboj ločeni z vejico. Razred v UML notaciji predstavimo s pravokotnikom, ki vsebuje tri dele: na vrhu je ime razreda; v srednjem delu so razredne spremenljivke oz. polja razreda; v spodnjem delu so metode (aktivnosti) razreda. Znak plus (+) pred spremenljivko ali metodo predstavlja javne metode (public); znak minus (-) pa zasebne (private). Spremenljivke deklarirane znotraj metode so lokalne in se lahko uporabljajo samo znotraj metode. Razred običajno vsebuje eno ali več metod za upravljanje razrednih spremenljivk (polj) razreda. Razredne spremenljivke imenujemo tudi polja razreda. Polja razreda so deklarirana zunaj telesa razreda. Vsak izvod objekta razreda vzdržuje svoje kopije polj razreda. Polja razreda predstavljajo izvodne spremenljivke razreda. Spremenljivke in metode deklarirane z rezerviranko private so dostopne samo v metodah razreda v katerem so deklarirane. Razredne spremenljivke (polja razreda) lahko uporabljajo vse razredne metode. Razlika med poljem in lokalno spremenljivko je tudi v tem, da polja vsebujejo privzete oz. začetne vrednosti, lokalne spremenljivke pa ne. Privzeta vrednost polja podatkovnega tipa String je null. Po izvršitvi klica metode, ki vrača vrednost, se vrne vrednost na mesto klica metode. Razredi omogočajo dostop do vrednosti zasebnih polj preko javnih metod Razredi (angl. Classes) Osnovni koncepti objektnega programiranja so razred, objekt, atribut in metoda. Stran 89 ŠC VELENJE

90 Ustvarjanje razredov: o deklaracija glave razreda, o deklaracija atributov oz. polj, o deklaracija konstruktorjev, o deklaracija metod. Ustvarjanje objektov o operator new ustvari objekt med izvajanjem programa, o objekt v pomnilniku predstavljajo vrednosti atributov, o objekti nekega razreda imajo iste atribute z različnimi vrednostmi atributov. Programske komponente so objekti (angl. objects), ki predstavljajo elemente realnega sveta. Razred (angl. class) sestavljajo vsi objekti iste vrste (tipa razreda). Objekt je primerek (angl. instance) določenega razreda. Npr. razred osebe združuje vse osebe. Posamezna oseba (recimo Janez Novak) je objekt razreda osebe. Vsak objekt vsebuje polja oz. atribute (angl. attributes) in metode (angl. methods) razreda. Atributi opisujejo lastnosti (stanje) objekta. Metode določajo aktivnosti oz. operacije objekta. Sintaksa razreda: [ public ] [ ( abstract final ) ] class <ime_razreda> { // atributi oz. polja razreda // metode razreda } // konec razreda Z rezerviranko public določimo, da je razred dostopen oz. je na voljo vsem razredom v vseh paketih. Če izpustimo rezerviranko public, potem je razred na voljo samo razredom v istem paketu. V enem dokumentu (*.java) lahko deklariramo samo en public razred. V public razredu je ime dokumenta enako imenu razreda (<ime_dokumenta> = <ime_razreda>). Npr. // MojClass.java public class MojClass { } Z rezerviranko abstract določimo, da je razred abstrakten. Abstrakten razred vsebuje le glave metod. Vsebina metod je določena v nasledniku (potomcu) razreda. Objekta (predstavnika) abstraktnega razreda ne moremo ustvariti. Z rezerviranko final določimo, da razreda ni možno razširiti (nima naslednikov oz. potomcev). Program vsebuje enega ali več razredov. Zagonski razred (z metodo main) predstavlja začetno mesto izvajanja programa. INFORMATIKA, Programiranje 1 in 2 Stran 90

91 9.2 Atributi oz. polja razreda Atributi oz. polja razreda opisujejo stanje oz. lastnosti razreda. Sintaksa deklaracije polja: [ ( public private protected ) ] [ ( final volatile ) ] [ static ] [ transient ] <podatkovni_tip> <ime_polja> [ = <izraz> ] ; Primer: public class Cas { // glava razreda // privatni atributi oz. polja private int ure; private int minute; private int sekunde; } Razred Cas vsebuje tri celoštevilčne atribute ure, minute in sekunde. Določila dostopa V deklaraciji polja lahko opcijsko uporabimo določilo dostopa public ali private ali protected. Določila dostopa določajo dostopnost polj v drugih razrednih. Običajno uporabljamo princip skrivanja podatkov, kar pomeni, da so polja dostopna samo znotraj razreda. Dostopno določilo brez določila public private protected Dostop Vsi razredi v istem paketu. Vsi razredi ne glede na paket. Samo znotraj razreda. Iz kateregakoli razreda v istem paketu in iz kateregakoli podrazreda ne glede na paket. Z rezerviranko final določimo, da je polje konstanta. Vrednost konstante se po začetni inicializaciji ne spreminja. Po dogovoru zapišemo imena konstant z velikimi črkami. Z rezerviranko volatile določimo, da do polja dostopa več niti (angl. threads). Vsi objekti polja deklariranega z rezerviranko static dostopajo do iste kopije polja (si delijo isto vrednost). Polja objektov (angl. instance field) deklariramo brez rezerviranke static. V tem primeru ima vsak objekt svojo kopijo vrednosti polja. Z rezerviranko transient določimo, da med serializacijo ne bo shranjena vrednost polja objekta. Zgled: 1. // primer razreda za čas 2. public class Cas { // glava razreda 3. // privatni atributi oz. polja 4. private int ure; // private int minute; // private int sekunde; // // metoda za določitev časa 9. public void setcas( int u, int m, int s ) 10. { 11. // preverjanje ustreznosti podatkov Stran 91 ŠC VELENJE

92 12. if ( (u>=0 && u<24) && (m>=0 && m<60) && (s>=0 && s<60) ) 13. { 14. ure = u; 15. minute = m; 16. sekunde = s; 17. } 18. else 19. throw new IllegalArgumentException("Vrednost časa je zunaj območja." ); 20. } // konec metode setcas // metoda vrne čas v obliki uu:mm:ss (10:22:30) 23. public String vrnicas() 24. { 25. return String.format( "%02d:%02d:%02d", ure, minute, sekunde ); 26. } // konec metode vrnicas 27. } 1. // testni razred 2. public class TestCas { 3. public static void main(string[] args) { 4. Cas ura = new Cas(); // ustvarimo objekt razreda 5. // izpis vrednosti po ustvarjanju objekta 6. System.out.println(ura.vrniCas()); 7. // določimo vrednost z uporabo metode razreda 8. ura.setcas(11, 20, 25); 9. // izpis vrednosti po določitvi vrednosti 10. System.out.println(ura.vrniCas()); 11. } 12. } Primer izvajanja: 00:00:00 11:20: Metode razreda Metode razreda določajo aktivnosti oz. operacije objekta. Sintaksa deklaracije metode: [ ( public private protected ) ] ( [ abstract ] [ final ] [ static ] [ native ] [ synchronized ] ) <podatkovni_tip_rezultata> <ime_metode> ( [ <seznam_formalnih_parametrov> ] ) { // stavki metode [return <izraz>]; } Dostopno določilo brez določila public private protected Dostop Vsi razredi v istem paketu. Vsi razredi ne glede na paket. Samo znotraj razreda. Iz kateregakoli razreda v istem paketu in iz kateregakoli podrazreda ne glede na paket. INFORMATIKA, Programiranje 1 in 2 Stran 92

93 Z rezerviranko static deklariramo razredno metodo, ki lahko dostopa samo do razrednih polj. Brez rezerviranke static deklariramo objektno metodo, ki lahko dostopa do vseh polj razreda. Z določilom abstract določimo abstraktno metodo, ki vsebuje le glavo metode brez bloka oz. telesa metode. Če razred vsebuje abstraktne metode, potem mora tudi razred biti deklariran z določilom abstract. Abstraktna metoda ne sme v deklaraciji uporabljati določil final, static, native, synchronized ali private. Z rezerviranko native deklariramo metodo, ki vsebuje le glavo metode. Metoda je zapisana v jeziku C++ (shranjena je v posebni knjižnici). Z rezerviranko synchronized deklariramo metodo, ki se lahko istočasno izvaja le v eni niti (angl. thread). Primer razredne metode: 1. // razred zaposleni 2. class Zaposleni 3. { 4. private static int stevilozaposlenih; // razredno polje 5. // razredna metoda 6. static void setstevilozaposlenih (int stevzaposlenih) 7. { 8. stevilozaposlenih = stevzaposlenih; 9. } 10. } // razred zaposleni 9.4 Lokalne in globalne spremenljivke Lokalne spremenljivke so deklarirane v telesu oz. bloku metode in obstajajo samo v bloku v katerem so deklarirane. Globalne spremenljivke razreda so deklarirane v bloku razreda pred metodami razreda. Globalne spremenljivke razreda imenujemo tudi atributi oz. polja razreda. Vsak objekt razreda ima svoje vrednosti polj. Polja razreda obstajajo oz. so dostopna znotraj vseh metod razreda. Primer zgradbe razreda 1. public class DosegSpremenljivk { 2. /* vsak objekt razreda DosegSpremenljivk ima tri globalne atribute oz. polja, ki so dostopni celemu razredu */ 3. private double polje1; // atribut oz. polje 4. private int polje2; // atribut oz. polje 5. private char polje3; // atribut oz. polje public int metoda1() 8. { 9. // lokalni spremenljivki dostopni samo v metodi metoda1 10. int stevilo1 = 2; 11. double stevilo2 = 4.5; 12. /* 13. * obstajajo stevilo1, stevilo2, polje1, polje2, polje3 14. * * */ 16. return stevilo1; 17. } public char metoda2() 20. { 21. // lokalna spremenljivka dostopna samo v metodi metoda2 22. char znak = 'a'; 23. /* 24. * obstajajo znak, polje1, polje2, polje3 25. * * */ Stran 93 ŠC VELENJE

94 27. return znak; 28. } 29. } V razredu DosegSpremenljivk so polja razreda: polje1, polje2, polje3. Polja obstajajo (so na voljo) v metodah metoda1 in metoda2. V metodi metoda1 so deklarirane lokalne spremenljivke stevilo1 in stevilo2, ki obstajata znotraj bloka metode metoda1. V metodi metoda1 obstajajo tudi polja razreda polje1, polje2 in polje3. V metodi metoda2 je deklarirana lokalna spremenljivka znak, ki obstajata znotraj bloka metode metoda2. V metodi metoda2 obstajajo tudi polja razreda polje1, polje2 in polje3. Primer razreda z metodo main: 1. public class DosegSpremenljivk2 { 2. // globalni spremenljivki dostopni v celemu razredu 3. private double polje1 = 3.2; 4. private int polje2 = 12; public static void main(string[] args) { 7. // lokalna spremenljivka dostopna samo v metodi main 8. int stevilo1 = 2; 9. /* 10. * obstajajo stevilo2 = 2, polje1 = 3.2, polje2 = * */ 12. } public int metoda1() 15. { 16. // lokalna spremenljivka dostopna samo v metodi metoda1 17. int stevilo2 = 4; 18. /* 19. * obstajajo stevilo2 = 4, polje1 = 3.2, polje2 = * */ 21. return stevilo2; 22. } 23. } Statične spremenljivke (ang. class variables) tipične so za razrede, ki predstavljajo aplikacije, vendar lahko nastopajo tudi v razredih, ki opisujejo zgradbo objektov, deklarirane so z rezerviranko static, sprememba vrednosti je dostopna vsem objektom in metodam v razredu, obstaja samo ena kopija spremenljivke, vrednost iste kopije spremenljivke uporabljajo vse metode in vsi objekti, spremenljivka obstaja tudi v primeru, ko ne ustvarimo nobenega objekta. Spremenljivke oz. polja objekta (angl. instance variables) nastopajo v razredih, ki opisujejo definicijo oz. zgradbo objektov, deklaracija brez dostopnega določila static, vsak objekt ima svojo kopijo spremenljivke (svojo vrednost polja), sprememba vrednosti se odraža samo znotraj objekta. INFORMATIKA, Programiranje 1 in 2 Stran 94

95 9.4.1 Večkratno definirane metode Metode z enakim imenom in različnim številom parametrov imenujemo večkratno definirane metode (angl. overloading). Prevajalnik izbere ustrezno metodo na osnovi števila parametrov in podatkovnih tipih posameznih parametrov. // večkratno definirana metoda izpis // metoda izpis brez parametrov void izpis () { System.out.println ("Višja šola"); } // metoda izpis z enim parametrom void izpis (String besedilo) { System.out.println (besedilo); } Večkratno definirana metoda se ne sme razlikovati samo v podatkovnem tipu rezultata, ki ga vrača metoda Konstruktor Konstruktor (angl. constructor) je posebna metoda, ki se izvrši ob ustvarjanju objekta in določi začetne vrednosti atributov oz. polj objekta (inicializacija). Konstruktor je metoda z enakim imenom, kot je ime razreda. Konstruktor ne vrača vrednosti (ni določen podatkovni tip rezultata). Če razred ne vsebuje konstruktorja, potem prevajalnik ustvari privzeti konstruktor brez parametrov. 1. // razred XY 2. class XY 3. { 4. private int stevilo; // polje stevilo XY (int st) // konstruktor 7. { 8. //this predstavlja naslov objekta, na katerega se nanaša klic metode 9. this.stevilo = st; 10. } // konstruktor } // razred XY // razred TestXY 15. class TestXY 16. { public static void main (String [] args) // metoda main 19. { 20. // deklaracija in ustvarjanje objekta razreda XY z uporabo konstruktorja 21. XY objektxy1 = new XY (25); 22. XY objektxy2 = new XY (22); 23. } // metoda main } // razred TestXY Stran 95 ŠC VELENJE

96 Primer dveh konstruktorjev: 1. // razred krog 2. public class Krog { 3. // polja 4. private int x, y; // koordinate 5. private int polmer; // polmer Krog () // konstruktor 8. { 9. this (0, 0, 1); 10. } Krog (int x, int y, int polmer) // konstruktor 13. { 14. this.x = x; 15. this.y = y; 16. this.polmer = polmer; 17. } // metode vrni (angl. get) in določi (angl. set) 20. public int vrnipolmer() { return polmer; } public void dolocipolmer(int polmer) { this.polmer = polmer; } public void dolocix(int x) { this.x = x; } int vrnix () { return x; } public void dolociy(int y) { this.y = y; } int vrniy () { return y; } } // razred krog 1. // razred TestKrog 2. public class TestKrog { public static void main(string[] args) { 5. // ustvarjanje objekta brez parametrov 6. Krog krog1 = new Krog(); 7. System.out.printf("Krog 1:\n"); 8. System.out.printf("Središče (%d,%d).\n", krog1.vrnix(), krog1.vrniy()); 9. System.out.printf("Polmer %d.\n", krog1.vrnipolmer()); // ustvaranje objekta z dejanskimi parametri (začetne vrednosti) 12. Krog krog2 = new Krog(50,80,100); 13. System.out.printf("Krog 2:\n"); 14. System.out.printf("Središče (%d,%d).\n", krog2.vrnix(), krog2.vrniy()); 15. System.out.printf("Polmer %d.\n", krog2.vrnipolmer()); 16. } // main 17. } // razred TestKrog INFORMATIKA, Programiranje 1 in 2 Stran 96

97 Objekti razreda Krog v metodi main(): Slika 30: Prenos parametrov Primer razreda datum Ustvarimo razred datum. Polja: dan, mesec, leto. Metode: Datum(int dan, int mesec, int leto), void dolocidatum(int dan, int mesec, int leto), String izpis(), String izpisimemeseca(), boolean prestopnoleto(int leto). 1. // razred Datum 2. public class Datum { 3. // polja oz. atributi 4. int dan; 5. int mesec; 6. int leto; // konstante imen mesecov 9. static final String [ ] meseci = {"", "januar", "februar", "marec", "april", "maj", "junij","julij", Stran 97 ŠC VELENJE

98 10. "august","september", "oktober", "november","december" 11. } ; // število dni v mesecu 14. static final int [ ] mesecdni = {0,31,29,31,30,31,30,31,31,30,31,30,31} ; // konstruktor Datum 17. public Datum(int dan, int mesec, int leto) { 18. if (mesec>=1 && mesec<=12) 19. if ( (dan>=1 && dan<=mesecdni[mesec]) ) 20. { 21. this.dan = dan; 22. this.mesec = mesec; 23. this.leto = leto; 24. } 25. else 26. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 27. else 28. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 29. // prestopno leto 30. if ((mesec == 2) && (dan==29) &&!prestopnoleto(leto) ) 31. throw new IllegalArgumentException( "Vrednost datuma je zunaj območja." ); 32. } // konstruktor Datum // določi Datum 35. public void dolocidatum(int dan, int mesec, int leto) { 36. if (mesec>=1 && mesec<=12) 37. if ( (dan>=1 && dan<=mesecdni[mesec]) ) 38. { 39. this.dan = dan; 40. this.mesec = mesec; 41. this.leto = leto; 42. } 43. else 44. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 45. else 46. throw new IllegalArgumentException( "Vrednost datuma je zunaj območja." ); 47. // prestopno leto 48. if ((mesec == 2) && (dan==29) &&!prestopnoleto(leto) ) 49. throw new IllegalArgumentException( "Vrednost datuma je zunaj območja." ); 50. } // dolocidatum // izpis v obliki d.m.llll 53. public String izpis() { 54. return dan + "." + mesec + "." + leto; 55. } // izpis // izpis v obliki d.mesec.llll 58. public String izpisimemeseca() { 59. return dan + ". " + meseci[mesec] + " " + leto; 60. } //izpisimemeseca // prestopno leto 63. public boolean prestopnoleto(int leto) 64. { 65. boolean prestopno; INFORMATIKA, Programiranje 1 in 2 Stran 98

99 66. if (leto % 4 == 0) 67. prestopno = true; 68. else 69. prestopno = false; 70. if (leto % 100 == 0 && leto % 400 == 00) 71. prestopno = true; 72. else 73. if (leto % 100 == 0) 74. prestopno = false; 75. return prestopno; 76. } // prestopno leto } // razred Datum 1. // test delovanja razreda Datum 2. public class DemoDatum { public static void main(string[] args) { 5. Datum datum1 = new Datum(16,2,2015); 6. System.out.printf("Vrednost datuma je %s. \n", datum1.izpis()); 7. System.out.printf("Vrednost datuma je %s. \n", datum1.izpisimemeseca()); 8. datum1.dolocidatum(16, 5, 1980); 9. System.out.printf("Vrednost datuma je %s. \n", datum1.izpis()); 10. System.out.printf("Vrednost datuma je %s. \n", datum1.izpisimemeseca()); 11. } // main } // razred DemoDatum 10 OSNOVNE KNJIŽNICE Knjižnice v razvojnih okoljih programerjem olajšajo izdelavo programov. Java vsebuje veliko razredov, ki so združeni v sorodne pakete. Ti paketi predstavljajo Java API (angl. Application Programming Interface). Skupno število paketov je izjemno veliko in se dopolnjuje z novimi verzijami različic Jave (npr. Java SE 8). Na voljo so paketi za vhodno izhodne operacije, tiskanje, delo z omrežjem, delo z zbirkami podatkov, risanje v grafičnem načinu, grafični vmesnik... Paket java.lang (angl. Java Language) java.util (angl. Java Utilities) java.io (angl. Java Input/Output) java.awt (angl. Java Abstract Window Toolkit ) java.applet (angl. Java Applet) java.net (angl. Java Networking) java.sql (angl. Java SQL) Stran 99 Opis Osnovni razredi jezika. Delo s števili (Number), matematične funkcije (Math), delo z nizi (String, StringBuffer) in drugi sistemski razredi. Paket je samodejno vključen v program. Delo z datumi in časi (Date), generatorji naključnih števil (Random), vhodno izhodne operacije (Scanner), shranjevanje in obdelava večje količine podatkov. Vhodno izhodne operacije (Files, Streams, Object Serialization). Razredi za delo v grafičnem načinu v prejšnjih verzijah Jave. V novejših verzijah Jave se za grafični vmesnik uporabljajo razredi paketa javax.swing. Razredi za izdelavo apletov, ki se uporabljajo v HTML dokumentih in se izvajajo v brskalnikih. Razredi za delo in komunikacijo v medmrežju (Internet). Razredi za delo z zbirkami podatkov. ŠC VELENJE

100 Paket javax.swing (angl. Java Swing GUI Components) javax.media (angl. Java Media Framework) javax.swing.event (angl. Java Swing Event) javax.xml.ws (angl. JAX-WS) Opis Razredi za delo z grafičnimi vmesniki. Razredi za multimedije. Razredi za upravljanje dogodkov. Razredi za spletne storitve (angl. services). Dokumentacija paketov in razredov verzije JSE8 je objavljena na Oraclovem spletišču ( ) Razred Math Razred Math je v paketu java.lang (v naprej deklariranem paketu). Razred Math vsebuje veliko statičnih metod, ki jih lahko uporabimo za izračun standardnih matematičnih kalkulacij. Metoda Opis Primer abs( x ) absolutna vrednost abs( 45.8 ) = 45.8 abs( ) = 12.2 ceil( x ) zaokroži x na najmanjše celo število, ki ni manjše od x ceil( 9.2 ) = 10.0 ceil( -9.8 ) = -9.0 cos( x ) kosinus kota (x v radianih) cos( 0.0 ) = 1.0 exp( x ) e na potenco števila x exp( 1.0 ) = exp( 2.0 ) = floor( x ) zaokroži število x na največje celo število, ki ni večje kot x floor( 9.2 ) = 9.0 floor( -9.7 ) = -10,0 log( x ) logaritem števila x (osnova e) log( Math.E ) = 1,0 log( Math.E * Math.E ) = 2,0 max( x, y ) večja vrednost od števil x in y max( 1.3, 11.5) = 11.5 max( -2.8, -10. ) = -2,8 min( x, y ) manjša vrednost od števil x in y min( 1.3, 11.5 ) = 2.3 min( -2.8, -10. ) = -10. pow( x, y ) potenco števila x na y pow( 2.0, 8.0 ) = 256,0 pow( 9.0, 0.5 ) = 3,0 sin( x ) sinus kota (x v radianih) sin( 0,0 ) = 0,0 sqrt( x ) kvadratni koren števila x sqrt( 900,0 ) = 30,0 Razred Math vsebuje dva polja, ki predstavljata matematični konstanti PI in E. Polja sta določena z določili public, final in static. Math.PI ( ) Math.E ( ) 10.2 Razred Character Razred Character vsebuje metode za delo z znaki. Metoda Opis Primer INFORMATIKA, Programiranje 1 in 2 Stran 100

101 Metoda Opis Primer boolean isuppercase(char znak) Je velika črka. Character.isUpperCase(znak) boolean islowercase(char znak) Je mala črka. Character.isLowerCase('o') char touppercase(char znak) Pretvori v veliko črko. Character.toUpperCase('h') char tolowercase(char znak) Pretvori v malo črko. Character.toLowerCase('Z') boolean isletterordigit(char znak) Je črka ali številka. Character.isLetterOrDigit('8') boolean isdigit(char znak) Je števka ('0'.. '9') Character.isDigit('4') boolean isletter(char znak) Je črka. Character.isLetter(znak) boolean iswhitespace(char znak) Je neviden presledek (presledek, tabulator, nova vrstica, vnašalka ali pomik naprej). Character.isWhiteSpace(znak) String tostring(char znak) Pretvori znak v niz oz. besedilo. Character.toString(znak) 1. /* Primer uporabe metod razreda Character */ 2. public class MZnaki { 3. public static void main(string[] args) { 4. char znak1, znak2; // deklaracija spremenljivk znak1, znak2 5. // določitev vrednosti 6. znak1 = 'A'; 7. znak2 = 49; // '1' 8. // izpis 9. if (Character.isDigit(znak1)) // je znak1 števka 10. System.out.printf("Znak %s je števka.\n",znak1); 11. else 12. System.out.printf("Znak %s ni števka.\n",znak1); 13. if (Character.isDigit(znak2)) // je znak2 števka 14. System.out.printf("Znak %s je števka.\n",znak2); 15. else 16. System.out.printf("Znak %s ni števka.\n",znak2); 17. String niz1; // ustvarjanje objekta tipa String 18. // določitev vrednosti niza (znak1 v niz1, znak2 v niz2) 19. niz1 = Character.toString(znak1); 20. // ustvarjanje objekta niza z določitvijo začetnih vrednosti 21. String besedilo1 = "Vrednost niza znaka " + znak1 + " je " + niz1 + ".\n"; 22. // izpis 23. System.out.println(besedilo1); 24. } 25. } Primer izvajanja: Znak A ni števka. Znak 1 je števka. Vrednost niza znaka A je A Razred String Najpogostejše metode razreda String Spoznali smo že, da podatkovni tip char omogoča delo s posameznim znakom. Vrednost spremenljivke char zapišemo v enojnih narekovajih. Stran 101 ŠC VELENJE

102 char znak = 'D'; Vrednost znakovne spremenljivke je pozitivna celoštevilčna vrednost, ki predstavlja ta znak v Unicode kodni tabeli. String je zaporedje znakov oz. besedilo oz. niz, ki se obravnava kot podatkovni element. String je objekt oz. predmet razreda String. String vrednost je besedilo med dvojnimi narekovaji. String vrednost Pomen "Janez Kotnik" ime in priimek "Celjska 5" naslov "3000 Celje" poštna številka in kraj telefonska številka Besedilno vrednost shranimo v String referenco oz. kazalec. String imepriimek1 = new String ("Janez Kotnik"); //ali String imepriimek2 = "Janez Kotnik"; Prvi deklaracijski stavek inicializira spremenljivko imepriimek1, da njena vrednost vsebuje pomnilniški naslov na katerem je v pomnilniku shranjeno besedilo Janez Kotnik. Spremenljivka imepriimek1 se sklicuje na besedilni objekt v pomnilniku. Razred String vsebuje več konstruktorjev za inicializacijo objektov. 1. /* Primer uporabe različnih konstruktorjev razreda String */ 2. public class String1_1 { public static void main( String[] args ) 5. { // polje oz tabela znakov 6. char[] tab_besedilo = { 'r', 'o', 'j', 's', 't', 'n', 'i', ' ', 'd', 'a', 'n' }; 7. // string objekti 8. String besedilo = new String( "vse najboljše" ); 9. // uporaba String konstruktorjev 10. String besedilo1 = new String(); 11. String besedilo2 = new String( besedilo ); 12. String besedilo3 = new String( tab_besedilo ); 13. String besedilo4 = new String( tab_besedilo, 8, 3 ); 14. // izpis 15. System.out.printf( "besedilo1 = %s\nbesedilo2 = %s\nbesedilo3 = %s\n 16. besedilo4 = %s\n",besedilo1, besedilo2, besedilo3, besedilo4 ); 17. } // main 18. } // razred Primer izvajanja: besedilo1 = besedilo2 = vse najboljše besedilo3 = rojstni dan besedilo4 = dan Vse metode razreda String so javne (public). Indeks prvega polja besedilne vrednosti je 0. Metoda char charat(int pos) int compareto(string s) Opis Vrne znak z določenega položaja v besedilu. String besedilo = new String( "vse najboljše" ); char znak = besedilo.charat(4); //vrne n Primerjava dveh nizov. Vrednost: 0 - niza sta enaka, INFORMATIKA, Programiranje 1 in 2 Stran 102

103 Metoda boolean equals(string s) boolean equalsignorecase(string s) String [ static method ] format(string oblika, Object... arg) int indexof(char ch) int length( ) String[ ] split(string regex) String substring(int n, int m) String tolowercase( ) String touppercase( ) String trim( ) String [ static method ] valueof(<osnovni podatkovni tip> n) Opis negativno število - klican niz je manjši od argumenta, pozitivno število - klican niz je večji od argumenta. String besedilo1 = new String( "Andrej" ); String besedilo2 = new String( "Boris" ); int primerjava = besedilo1.compareto(besedilo2); //-1 =>besedilo1 < besedilo2 Primerjava enakosti nizov. String besedilo1 = new String( "Andrej" ); boolean enaka = besedilo1.equals("andrej"); // true Primerjava enakosti nizov brez razlikovanja velikih in malih znakov. String besedilo1 = new String( "Andrej" ); boolean enaka = besedilo1. equalsignorecase ("andrej"); // true Vrne oblikovano besedilo glede na oblikovna določila in argumente.argumenti so enaki kot pri metodi System.out.printf(). besedilo1 = String.format( Skupni znesek je %9.2f Eurov\n, ); // besedilo1 = Skupni znesek je 202,45 Eurov Mesto prve pojavitve znaka v nizu. Če najde znak v nizu, vrne mesto pojavitve, sicer vrne -1. String besedilo = new String( "vse najboljše" ); int kje = besedilo.indexof('e'); // 2 Dolžina niza. String besedilo = new String( "vse najboljše" ); int dolzina = besedilo.length(); // 13 Delitev niza glede na izraz ujemanja. Vrne polje nizov. String stavek = "Razdelitev stavka na besede."; String besede[]; besede = stavek.split(" "); for (int i=0; i < besede.length;i++) System.out.println(besede[i]); // " " izraz ujemanja Vrne podniz niza od indeksa n do indeksa m-1. String stavek = "Vrne podniz danega niza."; String podniz = stavek.substring(3, 6);// del Pretvori v male črke. String stavek = "Pretvori v male črke."; stavek = stavek.tolowercase(); Pretvori v velike črke. String stavek = "Pretvori v velike črke."; stavek = stavek.touppercase(); Vrne niz brez presledkov na začetku in koncu niza. String stavek = " Besedilo s presledki na začetku in koncu besedila. "; stavek = stavek.trim(); // odstranitev začetnih in končnih presledkov Pretvori osnovni podatkovni tip v String. int n = 123; String s = String.valueOf(n); 10.4 Razred Stringbuffer V primerjavi z razredom String razred StringBuffer omogoča dinamično spreminjanje dolžine niza. Razred java.lang.stringbuffer podpira delo z zaporedjem znakov oz. nizi. Dolžino in vsebino niza lahko spreminjamo z metodami razreda. Stran 103 ŠC VELENJE

104 Konstruktorji: StringBuffer(), StringBuffer(CharSequence seq), StringBuffer(int capacity), StringBuffer(String str). Ustvarjanje objekta: StringBuffer imepriimek1 = new StringBuffer ("Janez Kotnik"); // ali StringBuffer imepriimek2 = "Janez Kotnik"; 1. /* Primer uporabe razreda StringBuffer */ 2. public class R12 { 3. /* Primer uporabe različnih konstruktorjev razreda StringBuffer */ 4. public static void main( String[] args ) 5. { 6. // deklaracija in ustvarjanje stringbuffer objekta 7. StringBuffer besedilo = new StringBuffer( "vse najboljše" ); 8. // uporaba konstruktorjev 9. StringBuffer besedilo1 = new StringBuffer(); 10. besedilo1.append("slavljenec "); 11. StringBuffer besedilo2 = new StringBuffer( besedilo ); 12. StringBuffer besedilo3 = new StringBuffer(20); 13. besedilo3.append("za rojstni dan."); 14. // izpis 15. System.out.printf("besedilo1 = %s\nbesedilo2 = %s\nbesedilo3 = %s\n", 16. besedilo1, besedilo2, besedilo3); 17. } // main 18. } // razred Primer izvajanja: besedilo1 = Slavljenec besedilo2 = vse najboljše besedilo3 = za rojstni dan. Metoda StringBuffer append(char[] str) StringBuffer append(char[] str, int offset, int len) Opis Na konec niza doda niz str. Na konec niza doda podniz niza str. Začetek podniza - indeks offset, dolžina podniza - len. StringBuffer besedilo1 = new StringBuffer("dober "); System.out.println("Besedilo pred dodajanjem = " + besedilo1); char[] besedilo2 = new char[] {'l','e','p',' ','d','a','n'}; besedilo1.append(besedilo2, 4, 3); // dodajanje 3 znakov od indeksa 4 naprej System.out.println("Besedilo po dodajanju = " + besedilo1); // izpis Besedilo pred dodajanjem = dober Besedilo po dodajanju = dober dan StringBuffer append(int i) Na konec niza doda besedilno vrednost celega števila i. StringBuffer besedilo1 = new StringBuffer("Število je: "); besedilo1.append(25); // dodajanje besedila 25 int capacity() Kapaciteta oz. razpoložljivost niza. StringBuffer besedilo = new StringBuffer("Besedilo vsebuje 27 znakov."); System.out.printf("Dolžina niza je %d.\n", besedilo.length()); System.out.printf("Kapaciteta niza je %d.\n", besedilo.capacity()); // izpis Dolžina niza je 27. Kapaciteta niza je 43. INFORMATIKA, Programiranje 1 in 2 Stran 104

105 StringBuffer delete(int start, int end) StringBuffer insert(int offset, String str) void setlength(int newlength) Brisanje podniza. Brisanje od indeksa start do indeksa end. StringBuffer besedilo = new StringBuffer("Besedilo vsebuje 27 znakov."); besedilo.delete(8, 19); // brisanje od indeksa 8 do 19 System.out.printf("Besedilo po brisanju: %s", besedilo); Vstavljanje niza str v niz na mestu offset. StringBuffer besedilo = new StringBuffer("Šolski Velenje."); besedilo.insert(7, "Center "); // vstavljanje System.out.printf("Besedilo po vstavljanju: %s", besedilo); // izpis Besedilo po vstavljanju: Šolski Center Velenje. Določi dolžino niza. StringBuffer besedilo = new StringBuffer("Šolski Center Velenje."); besedilo.setlength(13); System.out.printf("Besedilo po spremembi dolžine: %s", besedilo); // izpis Besedilo po spremembi dolžine: Šolski Center 10.5 Naključna števila Ustvarjanje naključnih števil z uporabo metod razreda java.util.random Vključimo uporabo metod razreda Random. import java.util.random; Konstruktor ustvari nov generator naključnih števil. Privzeta vrednost seed (semena) je sistemski čas v milisekundah. Metoda double nextdouble() Opis Vrne naključno število med 0.0 in 1.0 (manjše od 1.0). Random generator = new Random(); double nakljucnodouble; // vrne naključno število med 0.0 in 1.0 (manjše od 1.0) nakljucnodouble = generator.nextdouble(); int nextint() Vrne naključno celo število iz obsega celih števil (int) od do Random generator = new Random(); int nakljucnostevilo; // naključno celo število iz obsega celih števil nakljucnostevilo = generator.nextint( ); 4int nextint(n) Vrne naključno celo število med 0 in n-1. Random generator = new Random(); int nakljucnostevilo; // naključno celo število med 0 in 9 nakljucnostevilo = generator.nextint(10); Naključno celo število iz območja med x in y (x in y sta celi števili). nakljucnostevilo = x + generator.nextint(y-x+1); Naključno celo število iz območja med 5 in 10. nakljucnostevilo = 5 + generator.nextint(10-5+1); Stran 105 ŠC VELENJE

106 Ustvarjanje naključnih števil z uporabo metode random() razreda java.lang.math Metoda Opis double random() Vrne naključno število med 0.0 in 1.0 (manjše od 1.0). int nakljucnostevilo; // naključno celo število med 5 in 10; 5 - spodnja meja, 10 - zgornja meja nakljucnostevilo = 5 + (int) (Math.random()*(10-5+1)); // naključno vrednost med 0 in 1 pomnožimo z (zgornja meja -spodnja meja +1) // dobljeno vrednost pretvorimo v celo število // dobljeni vrednosti prištejemo spodnjo mejo 10.6 Besedilni dokumenti Aktivnost Branje Pisanje Opis Vsebino besedilnega dokumenta preberemo z uporabo metod objekta razreda Scanner. Vsebino besedilnega dokumenta ustvarjamo oz. spreminjamo z uporabo metod objekta razreda PrintWriter Branje Ustvarimo vhodni objekt razreda Scanner, objekta razreda File. Scanner branjedokument = new Scanner( new File("ImeDokumenta.txt") ); Do vrednosti dokumenta dostopamo z metodami nextint(), nextdouble()... razreda Scanner. int stevilo1, stevilo2; double stevilo3; stevilo1 = branjedokument.nextint(); // branje celoštevilčne vrednosti stevilo2 = branjedokument.nextint(); // branje celoštevilčne vrednosti stevilo3 = branjedokument.nextdouble(); // branje decimalne vrednosti Zapremo dokument z metodo close(). branjedokument.close(); // zapremo besedilni dokument Primer: 1. /* Program izpiše seznam celih števil besedilnega dokumenta in izračuna vsoto števil. */ 2. import java.util.scanner; // uporaba Scanner razreda 3. import java.io.*; // uporaba razreda file stream in exception 4. public class Vnos_dokument1 { public static void main(string[] args) { 7. // deklaracija spremenljivk 8. Scanner besdokument = null; // objekt razreda Scanner 9. int stevilo, vsota = 0; // trenutno število, vsota števil 10. try 11. { // ustvarimo objekt razreda Scanner za branje vrednosti iz besedilnega dokumenta 12. besdokument = new Scanner( new File("C:\\Users\\Srečko\\eclipse\\ 13. besedilni_dokument1_1\\bin\\stevila.txt") ); 14. } 15. catch (FileNotFoundException e) // izjema dokument ne obstaja 16. { 17. System.out.printf("Dokument stevila.txt ne obstaja."); INFORMATIKA, Programiranje 1 in 2 Stran 106

107 18. System.exit(1); 19. } 20. System.out.printf("Seznam števil: "); 21. while (besdokument.hasnext()) 22. { 23. stevilo = besdokument.nextint(); // branje celoštevilčne vrednosti 24. System.out.printf("%d, ",stevilo); 25. vsota = vsota + stevilo; 26. } 27. System.out.printf("\nVsota števil v dokumentu je %d.",vsota); 28. besdokument.close(); // zapremo besedilni dokument 29. } 30. } Pisanje Ustvarimo izhodni objekt razreda PrintWriter, ki je podrazred razreda PrintStream. Scanner besdokument = new Scanner( new File("ImeDokumenta.txt") ); Uporabimo metode razreda PrintStream (printf(), print(), println()). int stevilo1, stevilo2, vsota;... vsota = stevilo1 + stevilo2; // izpis v besedilni dokument besdokument.printf("vsota števil %d in %d je %d.",stevilo1, stevilo2, vsota); Zapremo dokument z metodo close(). besdokument.close(); // zapremo besedilni dokument 10.7 Razred Enum Razred java.lang.enum podpira uporabo naštevnega podatkovnega tipa. Naštevni podatkovni tip uporabimo, kadar imamo seznam veljavnih vrednosti. Enum tip je referenčni podatkovni tip. Enum podatkovni tip je deklariran z rezerviranko enum. 1. // naštevni podatkovni tip 2. public enum Ocena { 3. nzd(5), zd(6), db(7), pdb(8), pdb_(9), odl(10); // seznam ocen 4. int ocena; // atribut oz. polje naštevnega tipa 5. Ocena(int tocena) // konstruktor 6. { 7. ocena = tocena; 8. } int VrniOcena() // metoda vrne oceno 11. { 12. return ocena; 13. } 14. } // enum Ocena Stran 107 ŠC VELENJE

108 1. // uporaba naštevnega tipa Ocena 2. public class DemoOcena { 3. public static void main(string[] args) 4. { 5. // izpis 6. System.out.println("Ocene:"); 7. // zanka za vse elemente naštevnega seznama Ocena 8. for (Ocena oc : Ocena.values() ) 9. { // izpis naziva ocene in številčne vrednosti 10. System.out.println(oc + " (" + oc.vrniocena() + ")"); 11. } // for 12. } //main 13. } // DemoOcena Primer izvajanja: Ocene: nzd (5) zd (6) db (7) pdb (8) pdb_ (9) odl (10) Metoda String name() int ordinal() Opis Vrne vrednost enum konstante. Vrne ordinalno (zaporedno) mesto konstante. Ocena oc = Ocena.db; System.out.println("Zaporedno mesto je " + oc.ordinal() + "."); System.out.println("Ime konstante ocene dobro je " + oc.name() + "."); INFORMATIKA, Programiranje 1 in 2 Stran 108

109 11 IZJEME Programska koda mora biti zanesljiva in trdoživa. K temu pripomore tudi mehanizem izjem, ki je vgrajen v jezik in izvajalno okolje. Z izjemami predvidimo neobičajne okoliščine delovanja in nanje ustrezno reagiramo. Izjeme so torej nepričakovani dogodki ali napake, ki se pojavijo med izvajanjem programa, ki povzročijo prekinitev izvajanja programa. Izjeme povzročijo dogodki kot so deljenje z nič, branje neobstoječe datoteke, nepravilen URL naslov, dostop do elementa polja z indeksom izven meja tabele... Vsaka metoda lahko poleg običajne vrnjene vrednosti vrne tudi objekt, ki opisuje izjemni dogodek. Temu rečemo, da metoda sproži izjemo (angl. throws an exception). Izvajanje metode se zaključi v trenutku, ko sproži izjemo. Takrat se ustvari nov objekt,ki opisuje to izjemo, in ta potuje nazaj po klicnem skladu (method call stack), dokler ne najde primernega prestreznika izjem (exception handler) Vrste izjem Razred Throwable je skupni predhodnik vseh izjemnih dogodkov. Iz njega sta izpeljana razreda Error in Exception. Razred Error je namenjen opisu izjemnih napak, zaradi katerih se program ne more več nadaljevati. Razred Exception opisuje izjeme, katerih obravnavo vključimo v kodo programa. Razred RuntimeException je neposredno izpeljan iz razreda Exception. Opisuje izjeme, ki so posledica napake v programu (dostop do elementa polja, ki ne obstaja). Izjemam te vrste se s previdnejšim kodiranjem izognemo in jih v kodi ne prestrezamo. Ostali potomci razreda Exception opisujejo izjeme, ki jih v programu težko zaznamo in preprečimo (npr. nedovoljen dostop do dokumenta). Zanje poskrbimo s programsko obravnavo (prestrezanjem) izjem. Kadar med delovanjem metode lahko pride do izjeme, tako metodo posebej označimo. V glavi metode z rezerviranko throws označimo tip možne izjeme. public int ustvaridokument(string imedokumenta) throws FileNotFoundException, IOException Ko v metodi zaznamo neobičajni dogodek, ki povzroči nepravilno delovanje metode, znotraj metode sprožimo izjemo: throw new IOException("Dokument ne obstaja."); S stavkom throw prekinemo izvajanje metode ter posredujemo izjemo (novo ustvarjeni objekt IOException z opisom izjeme mora biti tipa Throwable) po klicnem skladu do ustreznega prestreznika izjem. Kjer kličemo metode, ki razglašajo izjeme, imamo tri možnosti za obravnavo izjem: - izjemo lahko spustimo nazaj po klicnem skladu, - izjemo prestrežemo in jo ustrezno obdelamo ali - izjemo prestrežemo in sprožimo drugo izjemo (novo izjemo obravnavamo v drugem delu kode). Kadar se odločimo za možnost, da izjemo spustimo nazaj po klicnem skladu, moramo v glavi metode le razglasimo njen tip (npr. throws IOException). S tem določimo, da metoda ne obravnava izjem, ampak jih posreduje po klicnem skladu. Obravnava izjem (angl. exception handling) pomeni prestrezanje sproženih izjem z ustreznim odzivom. Prestreznik izjem zapišemo s stavkom try (try catch finally). Sintaksa stavka try: try { // stavki, ki lahko sprožijo izjemo } catch (Exception1 e) { // obravnava izjeme Exception1 } catch (Exception2 e) { // obravnava izjeme Exception2 } finally { Stran 109 ŠC VELENJE

110 // stavki za ustrezen konec aktivnosti } // finally } // try Kodo pri kateri lahko pride do izjeme, postavimo v blok try. Vsako posamezno izjemo obravnava lasten prestreznik catch. Pri tem lahko izjeme tudi združujemo in jih več obravnavamo v istem prestrezniku. Ker so vse izjeme izpeljane iz razreda Exception, lahko univerzalni prestreznik za vse izjeme zapišemo: catch (Exception e) { // obravnava vseh izjem } Obravnava izjem z izpisom sporočila izjeme: catch (Exception e) { System.out.println(e.getMessage()); e.printstacktrace(); } // metoda getmessage vrne sporočilo izjeme // izpis klicnega sklada Stavki znotraj bloka finally se izvedejo v vsakem primeru (če je do izjeme prišlo ali tudi če do izjeme ni prišlo). Blok finally je opcijski in ni potrebno, da ga uporabimo. Primer: Slika 31: Del izpeljanih razredov razreda Throwable 1. /* Izračun količnika dveh števil. */ 2. import java.util.scanner; 3. public class Izjeme1 { 4. public static void main(string[] args) { 5. double stevilo1, stevilo2; 6. Scanner vhod = new Scanner (System.in); //objekt za vnos števil; branje s tipkovnice 7. // branje števil 8. System.out.print("Vpiši 1. število (deljenec):"); 9. stevilo1 = vhod.nextdouble(); 10. System.out.print("Vpiši 2. število (delitelj):"); 11. stevilo2 = vhod.nextdouble(); // izpis količnika INFORMATIKA, Programiranje 1 in 2 Stran 110

111 14. System.out.printf("%f / %f = %f", stevilo1, stevilo2, 15. kolicnik(stevilo1, stevilo2) ); 16. vhod.close(); // zapremo delo z vhodnim tokom; 17. } // metoda main public static double kolicnik (double deljenec, double delitelj) 20. { 21. return deljenec / delitelj; 22. } //metoda kolicnik } // razred Primer izvajanja: Vpiši 1. število (deljenec):56 Vpiši 2. število (delitelj):napaka Exception in thread "main" java.util.inputmismatchexception at java.util.scanner.throwfor(unknown Source) at java.util.scanner.next(unknown Source) at java.util.scanner.nextdouble(unknown Source) at Izjeme1.main(Izjeme1.java:12) Izvajanje programa se v primeru neustreznega vnosa prekine in izpiše se obvestilo, da je v programu prišlo do izjeme InputMismatchException. V nadaljevanju je izpisano obvestilo klicev sklada (angl. stack trace). Program spremenimo v bolj trdoživ program. Upoštevamo možne napake in jih vključimo v proženje izjem. Možne napake: neustrezen vnos števil (vsebuje črke), deljenec je enak 0 (deljenje z nič). 1. /* Izračun količnika dveh števil s prestrezanjem izjem. */ 2. import java.util.inputmismatchexception; 3. import java.util.scanner; 4. public class Izjeme1 { 5. public static void main(string[] args) { 6. double stevilo1, stevilo2; 7. Scanner vhod = new Scanner (System.in); // objekt za vnos števil; branje s tipkovnice 8. boolean ponovivnos = true; // napaka pri vnosu 9. // zanka oz. ponavljanje do veljavnega vnosa in izračuna 10. do 11. { 12. try 13. { // blok možnosti izjem 14. // branje števil 15. System.out.print("Vpiši 1. število (deljenec):"); 16. stevilo1 = vhod.nextdouble(); 17. System.out.print("Vpiši 2. število (delitelj):"); 18. stevilo2 = vhod.nextdouble(); 19. // izpis količnika 20. System.out.printf("%f / %f = %f", stevilo1, stevilo2, 21. kolicnik(stevilo1, stevilo2) ); 22. ponovivnos = false; // brez napake 23. } 24. catch (InputMismatchException inputmismatchexception) 25. { 26. System.err.printf( "\nizjema: %s\n", Stran 111 ŠC VELENJE

112 27. inputmismatchexception ); 28. vhod.nextline(); // razveljavimo vnos 29. System.out.println("Vpisati morate števila. Ponovite vnos.\n" ); 30. } 31. catch (ArithmeticException arithmeticexception) 32. { 33. System.err.printf( "\ndeljenje z nič:: %s\n", 34. arithmeticexception ); 35. vhod.nextline(); // razveljavimo vnos 36. System.out.println("Deljenec mora biti različen od nič. Ponovite vnos.\n" ); 37. } 38. } while (ponovivnos); 39. vhod.close(); // zapremo delo z vhodnim tokom; 40. } // metoda main public static double kolicnik (double deljenec, double delitelj) 43. throws ArithmeticException 44. { 45. if (delitelj == 0) // delitelj je enak nič 46. throw new ArithmeticException("Izjema: delitelj je enak nič."); // proženje izjeme 47. return deljenec / delitelj; 48. } //metoda kolicnik } // razred Izjeme Primer izvajanja: Vpiši 1. število (deljenec):40 Vpiši 2. število (delitelj):10st Izjema: java.util.inputmismatchexception Vpisati morate števila. Ponovite vnos. Vpiši 1. število (deljenec):40 Vpiši 2. število (delitelj):10 40, / 10, = 4, Grafika (awt, swing) Platforma JFC (Java Foundation Classes) vključuje dva paketa knjižnic za gradnjo grafičnih uporabniških vmesnikov (angl. Graphical User Interface ali GUI), to sta AWT (angl. Abstract Windowing Toolkit) in Swing. AWT je starejši in je hkrati osnova grafičnih gradnikov. Swing je novejši in nudi grafične elemente, katerih videz je neodvisen od okolja operacijskega sistema. Gradniki swing so izpeljani iz gradnikov AWT in se začnejo na J, npr. JFrame, JButton... Programsko okno si predstavljamo kot platno katerega vsebino mora določiti program. Vsaka komponenta je predstavljena v vsebniku (angl. Container). INFORMATIKA, Programiranje 1 in 2 Stran 112

113 Koordinatni sistem: Slika 32: Koordinatni sistem Gradniki vsebnika imajo lego in velikost določeno glede na koordinatni sistem vsebnika. Slika 33: Koordinate gradniki 12.1 Enostavno okno Osnova programa z grafičnim uporabniškim vmesnikom je okno, ki je objekt razreda JFrame. Okno ima vlogo vsebnika, v katerega lahko vstavimo druge gradnike. Razred JFrame se nahaja v paketu javax.swing, zato moramo napovedati uporabo razreda: import javax.swing.jframe; Ustvarimo nov objekt razreda JFrame: JFrame okno = new JFrame(); Objekt okna prikažemo na zaslonu (naredimo vidnega) s klicem metode setvisible(true). Z metodo setdefaultcloseoperation() določimo privzeto operacijo, ki se izvede ob zapiranju okna. Kot dejanski parameter ji podamo celo število, ki določa vrsto operacije. Definirana konstanta EXIT_ON_CLOSE razreda JFrame določa, da se ob zaprtju okna program konča z uporabo metode exit razreda System. okno.setdefaultcloseoperation(jframe.exit_on_close); Stran 113 ŠC VELENJE

114 Oknu določimo ime z uporabo metode settitle(). okno.settitle("risanje"); Ustvarimo nov objekt razreda JPanel: JPanel p = new JPanel(); Ustvarjen objekt dodamo vsebini okna in oknu določimo velikost 600x400. okno.add(p); // vstavljanje plošče okno.setsize(600, 400); // velikost okna Izvajanje: Slika 34: Enostavno okno Primer programa: 1. /* Prazno programsko okno (komponenti JFrame in JPanel). */ 2. import javax.swing.jframe; 3. import javax.swing.jpanel; public class G1 { 6. public static void main(string[] args) { 7. JFrame okno = new JFrame(); // okno 8. // zapiranje okna predstavlja izhod iz programa 9. okno.setdefaultcloseoperation(jframe.exit_on_close); 10. okno.setvisible(true); // okno vidno 11. okno.settitle("risanje"); 12. JPanel p = new JPanel(); // plošča 13. // v okno dodamo ploščo 14. okno.add(p); 15. okno.setsize(600, 400); // velikost okna 16. } //main } // razred G1 Grafični vmesnik vključuje veliko elementov oz. gradnikov (angl. components). Osnovni gradniki so gumbi (angl. button), stikala (angl. checkbox), radijski gumbi (angl. radio button), vnosna polja (text field), seznami (angl. list), oznake (label), menujske vrstice (menu bar), orodne vrstice (toolbar) in drugi. Zanimiv gradnik je vsebnik (razred Container), ki lahko vsebuje druge gradnike. Vsebniki so lahko osnovni ali vmesni. Osnovni vsebniki, kot sta na primer JFrame ali JApplet, določajo samostojna okna in tako predstavljajo osnovni gradnik, zato jih ne moremo vključevati v druge vsebnike. Vsak grafični program mora vsebovati vsaj en osnovni vsebnik. Vmesni vsebniki je npr. plošča (JPanel) v katero vstavljamo druge gradnike. Gradnike lahko združujemo v skupine... INFORMATIKA, Programiranje 1 in 2 Stran 114

115 12.2 Metode razreda Graphics za risanje geometrijskih likov Opis public abstract void drawline(int x1, int y1, int x2, int y2) Črta med točkama (x1, y1) in (x2, y2). public void drawrect(int x,int y,int width,int height) Pravokotnik določen z levo zgornjo točko (x, y) ter širino (width) in višino (height). public abstract void drawroundrect(int x,int y,int width,int height,int arcwidth, int archeight) Pravokotnik z zaobljenimi robovi določen z levo zgornjo točko (x, y), širino (width) in višino (height) ter širino (arcwidth) in višino (archeight) loka. public abstract void fillroundrect(int x,int y, int width, int height,int arcwidth, int archeight) Pravokotnik s polnilom z zaobljenimi robovi določen z levo zgornjo točko (x, y), širino (width) in višino (height) ter širino (arcwidth) in višino (archeight) loka. Polnilo je trenutne barve. public abstract void drawoval(int x,int y,int width, int height) Elipsa določena z levo zgornjo točko (x, y), širino (width) in višino (height). public abstract void filloval(int x,int y,int width, int height) Elipsa s polnilom določena z levo zgornjo točko (x, y), širino (width) in višino (height). public abstract void drawarc(int x, int y, int width, int height, int startangle, int arcangle) Krožni izsek iz začetne točke (x, y) določen s širino (width) in višino (height) ter začetnim (startangle) in končnim kotom (arcangle). public abstract void drawpolyline(int[] xpoints,int[] ypoints, int npoints) Poligon povezanih črt določenih s poljem x in y koordinat. Lik je zaprt, če sta koordinati prve in zadnje točka enaki. public abstract void drawstring(string str, int x,int y) Izpis besedila dejanskega parametra str. Najbolj levi znak se začne na položaju točke (X,Y). Razred Color vsebuje konstante in metode za delo z barvami Konstruktorji in metode razreda Color Opis public Color( int red, int green, int blue ) Ustvari barvo za parametre rdeča (angl. red), zelena (angl. green), modra (angl. blue) iz intervala med 0 in 255. public Color( float red, float green, float blue ) Ustvari barvo za parametre rdeča (angl. red), zelena (angl. green), modra (angl. blue) iz intervala med 0.0 in 1.0. public int getred(); public int getgreen(); public int getblue() Vrne vrednost med 0 in 255, ki predstavlja vsebino barve (rdečo ali zeleno ali modro vsebino). public Color getcolor() Vrne vrednost Color objekta. public void setcolor( Color c ) Določi vrednost barve parametra. Stran 115 ŠC VELENJE

116 Tabela konstant barv Konstanta barve RGB vrednost RED 255,0,0 GREEN 0,255,0 BLUE 0,0,255 ORANGE 255,200,0 PINK 255,175,175 CYAN 0,255,255 MAGENTA 255,0,255 YELLOW 255,255,0 BLACK 0,0,0 WHITE 255,255,255 GRAY 128,128,128 LIGHT_GRAY 192,192,192 DARK_GRAY 64,64,64 Primer: 1. /* Demonstracija risanja geometrijskih likov */ 2. import java.awt.color; 3. import java.awt.graphics; 4. import javax.swing.jcomponent; 5. import javax.swing.jframe; 6. import javax.swing.jpanel; class Platno extends JComponent { 9. public void paint(graphics g) { 10. g.drawline(10, 40, 200, 40); //črta 11. g.drawrect (10, 50, 200, 200); //pravokotnik 12. g.drawoval(80, 100, 70, 70); // elipsa 13. g.setcolor(color.blue); // modra barva 14. g.fillroundrect(200, 200, 50, 70,5,5); // pravokotnik s polnilom 15. g.drawstring("uporaba metod razreda Graphics", 200, 20); 16. g.setcolor(color.dark_gray); // temno siva 17. g.fillarc(300,300,50,50,0,180); // krožni izsek 18. } 19. } public class G2 { 22. public static void main(string[] a) { 23. JFrame okno = new JFrame(); // okno 24. // zapiranje okna predstavlja izhod iz programa 25. okno.setdefaultcloseoperation(jframe.exit_on_close); 26. okno.setvisible(true); // določi vidno 27. okno.settitle("risanje geometrijskih likov"); // naslov 28. okno.setsize(600, 400); // velikost okna 29. okno.getcontentpane().add(new Platno()); // dodajanje 30. } // main 31. } // razred INFORMATIKA, Programiranje 1 in 2 Stran 116

117 Izvajanje: Slika 35: Geometrijski liki 12.3 Applet Apleti so javanski programčki, ki se ne izvajajo samostojno. Uporabljamo jih za razširitev zmogljivosti izvajalnega okolja. Aplet se izvaja v pregledovalniku Applet Viewer ali v oknu brskalnika (vstavimo ga v HTML dokument). Telo apleta je razred, ki je izpeljan iz razreda Applet (java.applet) ali pa iz njega izpeljanega razreda JApplet (Swing komponenta). Oba razreda vsebujeta metode za vzpostavitev, zagon, zaustavitev in uničenje apleta (init(), start(), stop(), destroy()). V samostojnih programih se izvajanje kode začne v zagonski metodi main(), v apletu pa je zagonska metoda init(). Struktura apleta: public class <ImeAppleta> extends Applet { // metoda paint public void paint(graphics g) { } // paint } // class public class <ImeAppleta> extends JApplet { // metoda init public void init() { } // init } // class Applet je sestavljen iz javnega (public) razreda (class), ki je razširitev (extends) oziroma podrazred razreda Applet. Razred vsebuje javno (public) metodo z imenom paint, ki dobi za parameter objekt razreda Graphics z imenom g in ne vrača nobenega rezultata (void). Metoda paint običajno vsebuje stavke, ki se izvedejo vsakič, ko je potrebno obnoviti sliko. Stran 117 ŠC VELENJE

118 Razreda Applet in Graphics sta že definirana. Razred Applet pripada paketu java.applet, razred Graphics pa paketu java.awt. Značka za vključitev appleta v HTML dokument je applet in ima tri obvezne parametre. Z lastnostma width in height določimo velikost pravokotnega področja, ki je na voljo appletu, s code pa določimo v katerem dokumentu je preveden razred appleta. Primer: 1. /* Applet demo risanje geometrijskih likov. */ 2. import java.applet.applet; 3. import java.awt.color; 4. import java.awt.graphics; public class Applet1 extends Applet { public void paint(graphics g) 9. { 10. g.drawline(10, 40, 200, 40); //črta 11. g.drawrect (10, 50, 200, 200); //pravokotnik 12. g.drawoval(80, 100, 70, 70); // elipsa 13. g.setcolor(color.blue); // modra barva 14. g.fillroundrect(200, 200, 50, 70,5,5); // pravokotnik s polnilom 15. g.drawstring("uporaba metod razreda Graphics", 200, 20); 16. g.setcolor(color.dark_gray); // temno siva 17. g.fillarc(300,300,50,50,0,180); // krožni izsek 18. } 19. } 1. <!-- html dokument --> 2. <!DOCTYPE html> 3. <html> 4. <head> 5. <title>primer appleta</title> 6. </head> 7. <body> <applet width="600" height="400" code="applet1.class"> 10. </applet> </body> 13. </html> Delovanje apleta testiramo tako, da v ukaznem oknu odpremo pregledovalnik apletov, ki mu kot dejanski parameter (argument) določimo html dokument: appletviewer aplet.html Običajno html dokument odpremo v spletnem brskalniku. INFORMATIKA, Programiranje 1 in 2 Stran 118

119 Izvajanje v brskalniku: Slika 36: Applet geometrijski liki Primer: 1. // Aplet pretvori znesek v eurih v dolarje. 2. import java.awt.borderlayout; 3. import java.awt.container; 4. import java.awt.event.actionevent; 5. import javax.swing.japplet; 6. import javax.swing.jbutton; 7. import javax.swing.jlabel; 8. import javax.swing.jpanel; 9. import javax.swing.jtextfield; public class PretvoriEuroDolar extends JApplet { 13. // gradniki vmesnika 14. JLabel lblznesekeur = new JLabel("Znesek v EUR"); 15. JLabel lbltecaj = new JLabel("Tečaj (EUR->$)"); 16. JTextField txtznesekeur = new JTextField(10); 17. JTextField txttecaj$ = new JTextField("1.1298",10); 18. JButton btnizracun = new JButton("Izračun"); 19. JLabel lblrezultat = new JLabel(); // zagonska metoda apleta 22. public void init() 23. { Stran 119 ŠC VELENJE

120 24. // gradnike vstavimo v plošče 25. JPanel plosca1 = new JPanel(); 26. plosca1.add(lblznesekeur); 27. plosca1.add(txtznesekeur); 28. JPanel plosca2 = new JPanel(); 29. plosca2.add(lbltecaj); 30. plosca2.add(txttecaj$); 31. JPanel plosca3 = new JPanel(); 32. plosca3.add(btnizracun); 33. plosca3.add(lblrezultat); // vsebnik 36. Container vsebina = getcontentpane(); 37. // plošče vstavimo v vsebnik 38. vsebina.add(plosca1, BorderLayout.NORTH); 39. vsebina.add(plosca2, BorderLayout.CENTER); 40. vsebina.add(plosca3, BorderLayout.SOUTH); // metoda poslušalca odzivnega dogodka 43. btnizracun.addactionlistener(new ActionListner () 44. { 45. // odzivni dogodek 46. public void actionperformed(actionevent d) { 47. String rezultat; 48. rezultat = txtznesekeur.gettext() + " eurov je " Math.round(Double.parseDouble(txtZnesekEur.getText()) * 50. Double.parseDouble(txtTecaj$.getText()) * 100)/ " $." ; 51. lblrezultat.settext(rezultat); 52. } //actionperformed 53. } // addactionlistener 54. ); 55. } // init 56. } // razred PretvoriEuroDolar Izvajanje: Slika 37: Pretvorba eurov v dolerje INFORMATIKA, Programiranje 1 in 2 Stran 120

121 Ustvarjanje Sierpinskih trikotnikov 1. Ustvarimo enakostranični trikotnik. 2. Trikotnik razdelimo na štiri manjše enakostranične trikotnike. 3. Ponavljamo korak 2 na vseh trikotnikih. Slika 38: Sierpinski trikotniki 1. // Izris Sierpinskih trikotnikov */ 2. import javax.swing.*; 3. import java.awt.* ; 4. public class Ser extends JFrame{ 5. public static final int VELIKOSTOKNA = 400; // velikost okna 6. public static final int KONECPOSTOPKA=10; // kriterij zaključka risanja 7. public static int tocka1x, tocka1y, tocka2x, tocka2y, tocka3x, tocka3yy ; // točke trikotnika public Ser() { 10. super ("Ser"); 11. setsize(velikostokna, VELIKOSTOKNA); 12. // A simple triangle 13. tocka1x = (int) getsize().getwidth() / 2 ; // 1/2 širine okna 14. tocka1y = 40; 15. tocka2x = 20; 16. tocka2y = (int) getsize().getheight() - 20; 17. tocka3x = (int) getsize().getwidth() - 20; 18. tocka3y = (int) getsize().getheight() - 20; 19. setvisible (true) ; 20. setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); 21. } public Point vrnisredino ( Point p1, Point p22 ) { 24. return new Point ( ( int ) ( p1.getx() + p2.getx())/2, (int) (p1.gety() + p2.getyy ())/2); 25. } public void paint ( Graphics g ) { 28. super.paint (g) ; 29. trikotrisi (new Point (tocka1x, tocka1y), new Point (tocka2x, tocka2y t ), new Point (tocka3x, tocka3y )); 30. } public void trikotrisi ( Point p1, Point p2, Point p3 ) { 33. // pogoj zaključka 34. if (p1.distance (p2) < KONECPOSTOPKA && p1.distance (p3) < 35. KONECPOSTOPKA && p2.distance ( p3 ) < KONECPOSTOPKA) return ; 36. // riši trikotnikk 37. Graphics g = getgraphics(); 38. g.drawline ( (int) p1.getx(),(int) p1.gety(),(int) p2. getx(),(int) p2.gety()); 39. g.drawline ( (int) p2.getx(),(int) p2.gety(),(int) p3. getx(),(int) p3.gety()); 40. g.drawline ( (int) p3.getx(),(int) p3.gety(),(int) p1. getx(),(int) p1.gety()); Stran 121 ŠC VELENJE

122 41. // rekurzivni izris treh trikotnikov 42. Point m12 = vrnisredino(p1,p2); 43. Point m23 = vrnisredino(p2,p3); 44. Point m31 = vrnisredino(p3,p1); 45. // rekurzivni klici 46. trikotrisi (p1, m12, m31); 47. trikotrisi(p2, m23, m12); 48. trikotrisi (p3, m31, m23); 49. } public static void main ( String [ ] args ) { 52. new Ser(); 53. } 54. } Izvajanje: Slika 39: Sierpinski trikotniki primer izvajanja 13 POGOVORNA OKNA Do sedaj smo v primerih uporabljali izhodno okno za izpis obvestil in informacij. V programih pogosto izpisujemo obvestila v pogovornih oknih. Razred JOptionPane iz paketa javax.swing vsebuje metode za izpis sporočil v pogovornih oknih. Paket javax.swing vsebuje razrede grafičnega vmesnika (angl. graphical user interfaces - GUIs). GUI komponente olajšajo izdelavo programskih vmesnikov (vnosne maske, prikazi oz. izpisi...). import javax.swing.joptionpane; Izpis obvestila Metodo showmessagedialog uporabljamo za izpis obvestila v pogovornem oknu. JOptionPane.showMessageDialog(null, "Sporočilo v pogovornem oknu.\n INFORMATIKA, Programiranje 1 in 2 Stran 122

123 (Uporaba razreda JOptionPane.)","Sporočilo", JOptionPane.INFORMATION_MESSAGE); Parameter Prvi parameter Drugi parameter Tretji parameter Četrti parameter Opis Komponenta znotraj katere se prikaže pogovorno okno. Vrednost null predstavlja privzeti okvir (pogovorno okno je na sredini zaslona). Besedilo sporočila. Naslov pogovornega okna. Vrsta sporočila: JOptionPane.ERROR_MESSAGE - napaka, JOptionPane.INFORMATION_MESSAGE - informacija, JOptionPane.WARNING_MESSAGE - opozorilo, JOptionPane.QUESTION_MESSAGE - vprašanje, JOptionPane.PLAIN_MESSAGE - besedilo. 1. /* najava uporabe razreda JOptionPane iz paketa javax.swing 2. paket javax.swing vsebuje razrede grafičnega vmesnika (ang. graphical user interfaces GUIs) */ 3. import javax.swing.joptionpane; public class P2_4_okna 6. { 7. public static void main(string[] args) 8. { 9. // z metodo showmessagedialog razreda JOptionPane izpišemo sporočilo v pogovornem oknu 10. JOptionPane.showMessageDialog(null, "Sporočilo v pogovornem oknu.\n 11. (Uporaba razreda JOptionPane.)", "Sporočilo", JOptionPane.INFORMATION_MESSAGE); 12. } // konec metode 13. } // konec razreda Slika 40: Izpis sporočila Vnos vrednosti Metodo showinputdialog uporabimo za vnos vrednosti v pogovornem oknu. JOptionPane.showInputDialog(String); Primer 1: 1. // najava uporabe razreda JOptionPane iz paketa javax.swing 2. import javax.swing.joptionpane; public class P2_5Okna_2 { public static void main(string[] args) Stran 123 ŠC VELENJE

124 7. { 8. //z metodo showinputdialog razreda JOptionPane v pogovornem oknu 9. //izvedemo vnos vrednosti oz. branje 10. String tizpit = JOptionPane.showInputDialog("Vpišite predmet: "); 11. // v pogovornem oknu izpišemo vneseno informacijo 12. JOptionPane.showMessageDialog(null, "Naziv predmeta: " + tizpit, 13. "Sporočilo", JOptionPane.INFORMATION_MESSAGE); 14. } // konec metode 15. } // konec razreda Slika 41: Vnos predmeta Slika 42: Izpis predmeta Primer 2: String ime_priimek; // ime in priimek ime_priimek = JOptionPane.showInputDialog("Ime in priimek"); String besedilo_stevilo; //vnos v besedilno spremenljivko int stevilo_studentov; // celoštevilčna spremenljivka //vnos in pretvorba v celo število besedilo_stevilo = JOptionPane.showInputDialog( "Število študentov" ); stevilo_studentov = Integer.parseInt( besedilo_stevilo ); 14 RAZREDI (NADALJEVANJE) 14.1 Preverjanje vrednosti parametrov konstruktorjev Ustrezne vrednosti parametrov konstruktorjev preverjamo s klicem konstruktorja v bloku s prestrezanjem izjem. Zgled preverjanja parametrov konstruktorja razreda Cas1: 1. // razred čas z dvema konstruktorjema 2. public class Cas1 { 3. // polja razreda 4. private int ure; // private int minute; // private int sekunde; // // konstruktor brez parametrov 9. public Cas1() 10. { 11. this.ure = 0; 12. this.minute = 0; 13. this.sekunde = 0; 14. } // Cas1 15. INFORMATIKA, Programiranje 1 in 2 Stran 124

125 16. // konstruktor s parametri 17. public Cas1(int u, int m, int s ) 18. { 19. this.ure = u; 20. this.minute = m; 21. this.sekunde = s; 22. } // Cas // določitev časa 25. public void setcas( int u, int m, int s ) 26. { 27. // preverjanje ustreznosti podatkov 28. if ( (u>=0 && u<24) && (m>=0 && m<60) && (s>=0 && s<60) ) 29. { 30. ure = u; 31. minute = m; 32. sekunde = s; 33. } 34. else 35. throw new IllegalArgumentException("Vrednost časa je zunaj območja." ); 36. } // setcas // čas v obliki uu:mm:ss (10:22:30) 39. public String vrnicas() 40. { 41. return String.format( "%02d:%02d:%02d", ure, minute, sekunde ); 42. } // vrnicas } // Cas1 1. // testni razred 2. public class Cas1_Demo2 { public static void main(string[] args) { 5. Cas1 cas1 = new Cas1(14,10,0); // ustvarjanje objekta razreda 6. // izpis vrednosti 7. System.out.printf("Vrednost časa: %s",cas1.vrnicas()); // določitev neustrezne vrednosti časa 10. try 11. { // klic konstruktorja z neustrezno vrednostjo 12. cas1.setcas(28, 30, 0); 13. } // try 14. catch (IllegalArgumentException izjema) // neustrezna vrednost argumenta 15. { // izpis sporočila izjeme 16. System.out.printf("\n\n Napaka: %s", izjema.getmessage()); 17. } // catch 18. } // main } // class Primer izvajanja: Vrednost časa: 14:10:00 Napaka: Vrednost časa je zunaj območja. Stran 125 ŠC VELENJE

126 14.2 Kontrola dostopa do polj razreda Določilo dostopa (public, private, protected) določa dostopnost polj. Določilo private določa dostopnost samo znotraj razreda. Dostop do privatnih polj v drugem razredu povzroči napako v izvajanju programa. 1. // razred Cas1 2. public class Cas1 { 3. // polja razreda 4. private int ure; // private int minute; // private int sekunde; // // konstruktor brez parametrov 9. public Cas1() 10. { 11. this.ure = 0; 12. this.minute = 0; 13. this.sekunde = 0; 14. } // Cas // konstruktor s parametri 17. public Cas1(int u, int m, int s ) 18. { 19. this.ure = u; 20. this.minute = m; 21. this.sekunde = s; 22. } // Cas // določitev časa 25. public void setcas( int u, int m, int s ) 26. { 27. // preverjanje ustreznosti podatkov 28. if ( (u>=0 && u<24) && (m>=0 && m<60) && (s>=0 && s<60) ) 29. { 30. ure = u; 31. minute = m; 32. sekunde = s; 33. } 34. else 35. throw new IllegalArgumentException("Vrednost časa je zunaj območja." ); 36. } // setcas // čas v obliki uu:mm:ss (10:22:30) 39. public String vrnicas() 40. { 41. return String.format( "%02d:%02d:%02d", ure, minute, sekunde ); 42. } // vrnicas } // Cas1 Primer napačne uporabe polj razreda Cas1: 1. // testni razred INFORMATIKA, Programiranje 1 in 2 Stran 126

127 2. public class Cas1_Demo3 { public static void main(string[] args) { 5. Cas1 cas1 = new Cas1(10,15,0); // ustvarjanje objekta razreda 6. // napaka dostopa 7. cas1.ure = 11; // polje ure je private 8. cas1.minute = 20; // polje minute je private 9. cas1.sekunde = 0; // polje sekunde je private } // main } // class V razredu Cas1_Demo3 je uporabljen neposredni dostop do polj oz. atributov razreda Cas1. Polja ure, minute in sekunde so privatna polja, ki so neposredno dostopna samo znotraj definicije razreda Cas1. Neposredni dostop do privatnih polj v drugem razredu je programska napaka. Slika 43: Nepravilna raba privatnih atributov Privatna polja razreda niso neposredno dostopna v drugih razredih Rezerviranka this predstavlja sklic na trenutni objekt razreda. This predstavlja naslov objekta, na katerega se nanaša klic metode. Ta naslov omogoča, da dostopamo do atributov pravega objekta. Pred vsakim sklicevanjem na atribut oz. spremenljivko objekta je referenca this. Če je programer ne vključi, potem jo avtomatsko vstavi prevajalnik. Do privatnih polj razreda dostopamo s set (določi) in get (vrni) metodami. 1. // razred čas s set in get metodami 2. public class Cas1 { 3. // polja razreda 4. private int ure; // private int minute; // private int sekunde; // // konstruktor brez parametrov 9. public Cas1() 10. { 11. this.ure = 0; 12. this.minute = 0; 13. this.sekunde = 0; 14. } // Cas // konstruktor s parametri 17. public Cas1(int u, int m, int s ) 18. { 19. this.ure = u; 20. this.minute = m; 21. this.sekunde = s; 22. } // Cas1 23. Stran 127 ŠC VELENJE

128 24. // get metode 25. public int geture() { 26. return ure; 27. } public void seture(int ure) { 30. this.ure = ure; 31. } public int getminute() { 34. return minute; 35. } // set metode 38. public void setminute(int minute) { 39. this.minute = minute; 40. } public int getsekunde() { 43. return sekunde; 44. } public void setsekunde(int sekunde) { 47. this.sekunde = sekunde; 48. } // določitev časa 51. public void setcas( int u, int m, int s ) 52. { 53. // preverjanje ustreznosti podatkov 54. if ( (u>=0 && u<24) && (m>=0 && m<60) && (s>=0 && s<60) ) 55. { 56. this.ure = u; 57. this.minute = m; 58. this.sekunde = s; 59. } 60. else 61. throw new IllegalArgumentException("Vrednost časa je zunaj območja." ); 62. } // setcas // čas v obliki uu:mm:ss (10:22:30) 65. public String vrnicas() 66. { 67. return String.format( "%02d:%02d:%02d", this.ure, this.minute, this.sekunde ); 68. } // vrnicas } // Cas1 1. // testni razred, spreminjanje vrednosti privatnih polj s set metodami 2. public class Cas1_Demo4 { public static void main(string[] args) { 5. Cas1 cas1 = new Cas1(10,15,0); // ustvarjanje objekta razreda 6. // spreminjanje vrednosti polj objekta s set metodami 7. cas1.seture(11); INFORMATIKA, Programiranje 1 in 2 Stran 128

129 8. cas1.setminute(20); 9. cas1.setsekunde(0); 10. } // main } // class Razred običajno vsebuje javne (public) metode s katerimi dostopamo do privatnih polj razreda. Dostop z uporabo set in get metod omogoča dodatne možnosti. Vrednosti polj predstavimo v ustrezni obliki npr. čas v obliki hh:mm:ss, pri določitvi vrednosti polj preverimo veljavnost podatkov in po potrebi prožimo izjemo. Set metode običajno ne vračajo vrednosti (void) in v primerih neveljavnih vrednosti podatkov prožijo izjeme Privzeti konstruktor Vsak razred mora imeti vsaj en konstruktor. Če konstruktor ni določen, potem prevajalnik ustvari privzeti konstruktor brez formalnih parametrov. Privzeti konstruktor določi privzete vrednosti atributov oz. polj razreda glede na deklaracijo (podatkovni tip). Standarden konstruktor nastavi začetne vrednosti atributov in sicer: numerični atributi imajo privzeto vrednost 0, atributi tipa char imajo privzeto vrednost Unicode '\u0000', atributi tipa boolean imajo privzeto vrednost false, atributi objektnega tipa imajo privzeto vrednost null. Če razred vsebuje konstruktor, potem prevajalnik ne ustvari privzetega standardnega konstruktorja. Če je potrebno določiti privzete vrednosti atributov razreda, potem razredu določimo tudi konstruktor brez formalnih parametrov. Namesto standardnega konstruktorja lahko napišemo svojega in z njim določimo drugačne začetne vrednosti atributov. Ob kreiranju objekta lahko izvršimo še dodatne aktivnosti. Konstruktorju lahko dodamo dejanske parametre. Ob kreiranju objekta se vedno izvedeta dva konstruktorja: konstruktor osnovnega razreda in konstruktor podrazreda. Najprej se izvede konstruktor osnovnega razreda, nato pa konstruktor izpeljanega razreda. Velja pravilo, da konstruktor nadrazreda inicializira atribute nadrazreda, konstruktor podrazreda pa inicializira atribute deklarirane v podrazredu Razred vsebuje objekte drugih razredov Atributi razreda so lahko tudi objekti drugih razredov. Oglejmo si primer, ko objekt razreda osebe vsebuje priimek, ime, datum rojstva in EMŠO. Atribut datum rojstva je objekt razreda Datum1. Primer: 1. // razred Datum1 2. public class Datum1 { 3. // zasebni atributi 4. private int dan; 5. private int mesec; 6. private int leto; // polje - imena mesecov 9. static final String [ ] meseci = { 10. "", "januar", "februar", "marec", "april", "maj", "junij","julij","august","september", "oktober", 11. "november","december" } ; Stran 129 ŠC VELENJE

130 // polje - število dni v mesecu 14. static final int [ ] mesecdni = {0,31,29,31,30,31,30,31,31,30,31,30,31} ; // konstruktor s parametri 17. public Datum1(int dan, int mesec, int leto) { 18. if (mesec>=1 && mesec<=12) 19. if ( (dan>=1 && dan<=mesecdni[mesec]) ) 20. { 21. this.dan = dan; 22. this.mesec = mesec; 23. this.leto = leto; 24. } 25. else 26. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 27. else 28. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 29. // prestopno leto 30. if ((mesec == 2) && (dan==29) &&!prestopnoleto(leto) ) 31. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 32. } // konstruktor s parametri // konstruktor brez parametrov 35. public Datum1() 36. { 37. this.dan = 1; 38. this.mesec = 1; 39. this.leto = 1900; 40. } // konstruktor brez parametrov // določi Datum 43. public void dolocidatum(int dan, int mesec, int leto) { 44. if (mesec>=1 && mesec<=12) 45. if ( (dan>=1 && dan<=mesecdni[mesec]) ) 46. { 47. this.dan = dan; 48. this.mesec = mesec; 49. this.leto = leto; 50. } 51. else 52. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 53. else 54. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 55. // prestopno leto 56. if ((mesec == 2) && (dan==29) &&!prestopnoleto(leto) ) 57. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 58. } // dolocidatum // prestopno leto 61. public boolean prestopnoleto(int leto) 62. { 63. boolean prestopno ; 64. if (leto % 4 == 0) 65. prestopno = true; 66. else 67. prestopno = false; INFORMATIKA, Programiranje 1 in 2 Stran 130

131 if (leto % 100 == 0 && leto % 400 ==00) 70. prestopno = true; 71. else 72. if (leto % 100 == 0) 73. prestopno = false; 74. return prestopno; 75. } // prestopno leto // vrne datum v obliki d.m.llll 78. public String vrnidatumoblika1() { 79. return dan + "." + mesec + "." + leto; 80. } // vrnidatumoblika // vrne datum v obliki d.mesec.llll 83. public String vrnidatumoblika2() { 84. return dan + ". " + meseci[mesec] + " " + leto; 85. } // vrnidatumoblika } // razred Datum1 1. // razred Osebe 2. public class Osebe { 3. private String priimek; 4. private String ime; 5. private Datum1 datumrojstva; // objekt razreda Datum1 6. private String EMSO; // konstruktor 9. public Osebe(String priimek, String ime, Datum1 datumrojstva, String EMSO) 10. { 11. this.priimek = priimek; 12. this.ime = ime; 13. this.datumrojstva = datumrojstva; 14. this.emso = EMSO; 15. } // set in get metode 18. public String vrnipriimek() { 19. return this.priimek; 20. } public void dolocipriimek(string priimek) { 23. this.priimek = priimek; 24. } public String vrniime() { 27. return this.ime; 28. } public void dolociime(string ime) { 31. this.ime = ime; 32. } public Datum1 vrnidatumrojstva() { Stran 131 ŠC VELENJE

132 35. return this.datumrojstva; 36. } public void dolocidatumrojstva(datum1 datumrojstva) { 39. this.datumrojstva = datumrojstva; 40. } public String vrniemso() { 43. return this.emso; 44. } public void dolociemso(string emso) { 47. EMSO = emso; 48. } // vrne podatke o osebi v obliki besedila 51. public String tostring() { 52. return "Podatki o osebi: [priimek=" + priimek + ", ime=" + ime + ", datumrojstva=" datumrojstva.vrnidatumoblika1() + ", EMSO=" + EMSO + "]"; 54. } // tostring } // razred Osebe 1. // razred OsebeDemoX 2. public class OsebeDemoX { public static void main(string[] args) { 5. Datum1 datumrojstva = new Datum1(10,11,1985); // ustvarimo objekt razreda Datum1 6. // ustvarimo objekt razreda Osebe 7. Osebe oseba1 = new Osebe("Spuha","Ines",datumRojstva," "); 8. // System.out.println(oseba1.toString()); // izpis vrednosti v obliki besedila 10. } // main } // razred OsebeDemoX Primer izvajanja: Podatki o osebi: [priimek=spuha, ime=ines, datumrojstva= , EMSO= ] 14.5 Enum (podrobneje) Enum naštevni podatkovni tip uporabimo za določitev vrednosti iz seznama definiranih vrednosti. Enum je referenčni (naslovni) podatkovni tip. Enum podatkovni tip deklariramo z enum deklaracijo, ki predstavlja z vejico ločen seznam konstantnih vrednosti. Enum deklaracija lahko vsebuje tudi elemente razreda kot so konstruktor, atribute oz. polja in metode. Enum deklaracijski blok mora na začetku vsebovati seznam konstant. Enum deklaracija ima v primerjavi z deklaracijo razreda naslednje omejitve: enum konstante so vedno določene z določilom final (ne morejo spreminjati vrednosti), enum konstante so vedno statične, ustvarjanje objekta tipa enum z operatorjem new predstavlja napako. Enum konstante uporabljamo na mestih konstant kot so switch stavek, izboljšana oblika for stavka... INFORMATIKA, Programiranje 1 in 2 Stran 132

133 Primer uporabe enum podatkovnega tipa za seznam knjig. // deklaracija naštevnega podatkovnega tip za knjige public enum Knjige { // naštevni seznam knjig JHTP9E("Java How To Program 9th Edition", 2012), VCSHTP("Visual C# 2010 How to Program", 2011), JIJ3E("Thinking in Java, 3rd Edition", 2002); // atributa private final String naslov; private final int letoizdaje; // konstruktor Knjige(String naslovk, int letoizd) { naslov = naslovk; letoizdaje = letoizd; } // konstruktor // metoda vrne naslov public String vrninaslov() { return naslov; } // vrninaslov // metoda vrne leto izdaje public int vrniletoizdaje() { return letoizdaje; } // vrniletoizdaje } // enum Knjige Uporaba naštevnega podatkovnega tipa: // najava uporabe razreda EnumSet import java.util.enumset; // testni razred public class EnumKnjigeDemo { public static void main(string[] args) { // izpis glave System.out.printf("%-50s \t\t %s \n","knjiga","leto izdaje"); // izpis vseh elementov naštevnega seznama Knjige for (Knjige tknjige : Knjige.values() ) { System.out.printf("%-50s \t %d \n",tknjige.vrninaslov(), tknjige.vrniletoizdaje() ); } // for } // main } // EnumKnjigeDemo Stran 133 ŠC VELENJE

134 Primer izvajanja: Knjiga Leto izdaje Java How To Program 9th Edition 2012 Visual C# 2010 How to Program 2011 Thinking in Java, 3rd Edition Sproščanje pomnilniškega prostora Vsak razred v Javi vsebuje metode razreda Object (Object ima metodo finalize). Vsak objekt uporablja sistemske vire kot je pomnilniški prostor. Uporabljen pomnilniški prostor je potrebno sprostiti, ko se ta ne potrebuje oz. ne rabi več. JVM samodejno izvaja sproščanje pomnilnika, ki so ga zasedli objekti, ko ti niso več v uporabi. Čistilec pomnilniškega prostora (angl. garbage collection) izvrši metodo finalize za sproščanje pomnilniškega prostora. Problem z izvršitvijo metode finalize je v tem, da ni zagotovljeno, da se bo čistilec pomnilniškega prostora izvršil v predvidenem času. Velikokrat se izvrši šele ob zaključku izvajanja programa. Zaradi tega se programerji izogibajo uporabi metode finalize. Razredi, ki uporabljajo sistemske vire kot so dokumenti na disku..., vsebujejo metode, ki sprostijo sistemske vire, ko se le ti ne uporabljajo več. Veliko razredov Java API v ta namen vsebuje metodo close ali dispose. Spoznali smo že, da razred Scanner vsebuje metodo close Statična najava deklaracije Spoznali smo statične atribute in metode razreda Math. Statične atribute in metode smo uporabljali tako, da smo uporabili ime razreda Math in za piko (Math.) uporabili atribut ali metodo. Statična najava deklaracije (import static) omogoča najavo uporabe vseh statičnih atributov in metod razreda. Atribute in metode lahko uporabljamo brez imena razreda in pike. Sintaksa: import static imepaketa.imerazreda.imestatičnegačlana; Primer: import static java.lang.math.pi; // najava uporabe konstante PI Sintaksa za vse statične atribute in metode: import static imepaketa.*; Primer: import static java.lang.math.*; // najava uporabe atributov in metod razreda Math 14.8 Ustvarjanje paketov Vsak razred v Java API pripada paketu, ki vsebuje skupino sorodnih razredov. Paketi olajšajo izdelavo kompleksnejših programov in olajšajo ponovno uporabo programske kode. V paket združimo sorodne javne razrede, ki jim na začetek kode dodamo deklaracijo paketa. V Javi je predpisan naslednji vrstni red kode: 1. deklaracija paketa (če obstaja); 2. deklaracija najav uporabe (če obstaja); 3. deklaracija razreda. Ime paketa je običajno sestavljeno iz domene (ime domene je v obratnem vrstnem redu). Primer deklaracije paketa: package si.scv.jhtp.datumpaket; INFORMATIKA, Programiranje 1 in 2 Stran 134

135 Deklaracija določa natančno mesto, kjer je shranjen razred paketa. Razred zgornje deklaracije bo razred shranjen v imeniku si scv jhtp datumpaket V ukaznem oknu prevedemo razred paketa z opcijo -d, da prevajalnik izdela ustrezno strukturo map na osnovi deklaracije paketa. javac -d. ImeRazreda.java Pika (.) za -d predstavlja trenutno mapo. Primer: Izdelan razred za datumom vstavimo v paket datumpaket1. Razredu Datum2 dodamo na začetku deklaracijo paketa. 1. // deklaracija paketa 2. package datumpaket1; // deklaracija razreda 5. public class Datum2 { 6. // zasebni atributi 7. private int dan; 8. private int mesec; 9. private int leto; // polje - imena mesecov 12. static final String [ ] meseci = { 13. "", "januar", "februar", "marec", "april", "maj", "junij","julij","avgust","september", "oktober", 14. "november","december" } ; // polje - število dni v mesecu 17. static final int [ ] mesecdni = {0,31,29,31,30,31,30,31,31,30,31,30,31} ; // konstruktor s parametri 20. public Datum2(int dan, int mesec, int leto) { 21. if (mesec>=1 && mesec<=12) 22. if ( (dan>=1 && dan<=mesecdni[mesec]) ) 23. { 24. this.dan = dan; 25. this.mesec = mesec; 26. this.leto = leto; 27. } 28. else 29. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 30. else 31. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 32. // prestopno leto 33. if ((mesec == 2) && (dan==29) &&!prestopnoleto(leto) ) 34. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 35. } // konstruktor s parametri // konstruktor brez parametrov 38. public Datum2() 39. { Stran 135 ŠC VELENJE

136 40. this.dan = 1; 41. this.mesec = 1; 42. this.leto = 1900; 43. } // konstruktor brez parametrov // določi Datum 46. public void dolocidatum(int dan, int mesec, int leto) { 47. if (mesec>=1 && mesec<=12) 48. if ( (dan>=1 && dan<=mesecdni[mesec]) ) 49. { 50. this.dan = dan; 51. this.mesec = mesec; 52. this.leto = leto; 53. } 54. else 55. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 56. else 57. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 58. // prestopno leto 59. if ((mesec == 2) && (dan==29) &&!prestopnoleto(leto) ) 60. throw new IllegalArgumentException("Vrednost datuma je zunaj območja." ); 61. } // dolocidatum // prestopno leto 64. public boolean prestopnoleto(int leto) 65. { 66. boolean prestopno ; 67. if (leto % 4 == 0) 68. prestopno = true; 69. else 70. prestopno = false; if (leto % 100 == 0 && leto % 400 ==00) 73. prestopno = true; 74. else 75. if (leto % 100 == 0) 76. prestopno = false; 77. return prestopno; 78. } // prestopno leto // vrne datum v obliki d.m.llll 81. public String vrnidatumoblika1() { 82. return dan + "." + mesec + "." + leto; 83. } // vrnidatumoblika // izpis v obliki d.mesec.llll 86. public String vrnidatumoblika2() { 87. return dan + ". " + meseci[mesec] + " " + leto; 88. } //vrnidatumoblika } //razred Datum2 Testna uporaba razreda Datum2 iz paketa. 1. //najava uporabe razreda Datum2 iz paketa datumpaket1 2. import datumpaket1.datum2; 3. INFORMATIKA, Programiranje 1 in 2 Stran 136

137 4. public class TestPaketDatum2 { public static void main(string[] args) { 7. Datum2 tdatum = new Datum2(12,5,2000); 8. System.out.printf("Uporaba razreda Datum2 iz paketa datumpaket1.\n"); 9. System.out.printf("%s",tdatum.vrniDatumOblika2()); 10. } // main } // TestPaketDatum2 Primer izvajanja: Uporaba razreda Datum2 iz paketa datumpaket maj Primer naključnega izrisa črt 1. // Razred za izris črte s koordinatami začetne in končne točke ter barvo črte. 2. import java.awt.color; 3. import java.awt.graphics; public class Crte { 7. private int x1; // začetna x koordinata 8. private int y1; // začetna y koordinata 9. private int x2; // končna x koordinata 10. private int y2; // končna y koordinata 11. private Color barva; // barva črte // konstruktor določi privzete vrednosti 14. public Crte(int x1, int y1, int x2, int y2, Color barva) { 15. this.x1 = x1; 16. this.y1 = y1; 17. this.x2 = x2; 18. this.y2 = y2; 19. this.barva = barva; 20. } // Crte // izris črte 23. public void IzrisCrte(Graphics g) 24. { 25. g.setcolor(this.barva); 26. g.drawline(this.x1, this.y1, this.x2, this.y2); 27. } // IzrisCrte } // razred Crte // Razred je naslednik razreda JPanel in ustvari podatke za naključne črte in jih izriše na plošči. 2. import java.awt.color; 3. import java.awt.graphics; 4. import java.util.random; 5. import javax.swing.jpanel; public class IzrisPlosca extends JPanel { Stran 137 ŠC VELENJE

138 8. private Random nakljucnigenerator = new Random(); 9. private Crte[] poljecrt; // konstruktor ustvari naključne podatke za izris in jih shrani v atribut tabele poljecrt 12. public IzrisPlosca() 13. { 14. this.setbackground(color.white); 15. poljecrt = new Crte[10 + nakljucnigenerator.nextint(10) ]; // zanka za vse elemente polja 18. for (int i=0; i<poljecrt.length; i++) 19. { 20. // ustvarimo naključne koordinate med 0 in int x1 = nakljucnigenerator.nextint(601); 22. int y1 = nakljucnigenerator.nextint(601); 23. int x2 = nakljucnigenerator.nextint(601); 24. int y2 = nakljucnigenerator.nextint(601); 25. // ustvarimo objekt naključne barve 26. Color barva = new Color (nakljucnigenerator.nextint(256), 27. nakljucnigenerator.nextint(256), nakljucnigenerator.nextint(256)); 28. // ustvarjene podatke shranimo v tabelo - objekt Crte 29. poljecrt[i] = new Crte(x1,y1,x2,y2, barva); 30. } // for 31. } // konstruktor IzrisPlosca // izris crt 34. public void paintcomponent(graphics g) 35. { 36. super.paintcomponent(g); 37. // zanka vse črte v tabeli 38. for (Crte crta : poljecrt) 39. { 40. crta.izriscrte(g); 41. } // for 42. } // paintcomponent } // IzrisPlosca // Ustvarimo okno (JFrame) za prikaz izrisa 2. import javax.swing.jframe; public class TestRisanjeCrt { public static void main(string[] args) { IzrisPlosca plosca = new IzrisPlosca(); // ustvarjanje izrisa na panelu JFrame okno = new JFrame(); 11. okno.setdefaultcloseoperation(jframe.exit_on_close); 12. okno.add(plosca); // dodajanje panela v okvir okna 13. okno.setsize(600, 600); // določitev velikosti 14. okno.setvisible(true); 15. } // main 16. } // TestRisanjeCrt INFORMATIKA, Programiranje 1 in 2 Stran 138

139 Primer izvajanja: Slika 44: Risanje naključnih črt Dedovanje (angl. inheritence) Dedovanje je osnovna značilnost objektno orientiranega programiranja (angl. object-oriented programming (OOP)). Dedovanje predstavlja mehanizem, ki omogoča, da nek razred podeduje atribute in metode obstoječega razreda. To pomeni, da pri ustvarjanju razreda ne deklariramo vseh atributov in metod ampak določimo, da nov razred deduje elemente obstoječega razreda (atribute in metode). Razred, ki je naslednik razreda imenujemo podrazred (angl. subclass) oz. izpeljan razred (angl. derived class). Razred iz katerega izpeljan razred deduje imenujemo nadrazred (angl. superclass) oz. osnovni razred (angl. base class). Uporabljata se tudi izraza starš (angl. parent class) in otrok (angl. child class). Izpeljan razred je poseben primer bolj splošnega osnovnega razreda. Izpeljan razred lahko vsebuje svoje atribute in metode in predstavlja bolj specifične objekte. Razredna hierarhija definira relacije dedovanja med razredi. Npr. razred Oseba je osnovni razred (super class), razred Delavec je izpeljan razred (sub class). Razred oseba vsebuje atribute ime, priimek, datum rojstva, emšo... in metode starostosebe, vrninizosebe... Razred delavec vsebuje vse elemente razreda oseba (atribute in metode) in dodatne atribute: datumzaposlitve, podjetje, vrstazaposlitve... in metode stevilodnidelovnedobe... Koncept dedovanje omogoča, da atributov in metod razreda Oseba ni potrebno še enkrat deklarirati. Na novo deklariramo le atribute in metode, ki so specifične za izpeljan razred (sub class). Razredna hierarhija likov: Stran 139 ŠC VELENJE

140 Slika 45: Razredna hierarhija likov Prednosti dedovanja so: krajši čas razvoja (uporaba obstoječih atributov in metod), manj napak (uporaba testiranih metod). V Javi je razred Object začetni razred razredne hierarhije. Java podpira enkratno dedovanje, kar pomeni, da je vsak razred izpeljan iz natanko enega razreda. Java direktno ne podpira večkratnega dedovanja (razred je izpeljan iz več razredov). Večkratno dedovanje izvedemo z vmesniki (angl. interface). UML Tools Wiki: Redefinicija metod V podrazredu lahko ponovno deklariramo podedovane metode. Do metode nadrazreda dostopamo z rezerviranko super npr. super.imemetode(). Dostopno določilo protected določa v podrazredih neposreden dostop (brez uporabe metod) do podedovanih atributov. V Javi z rezerviranko extends za imenom razreda določimo, da izpeljujemo nov razred iz obstoječega razreda. Sintaksa: class RazredA { // atributi in metode razreda } class RazredB extends RazredA { // podedovani so atributi in metode razreda RazredA. // dodatni atributi in metode razreda RazredB } Primeri osnovnih in izpeljanih razredov Osnovni razred Izpeljan razred Oseba Delavec, Student, Brezposeln... Zival Pes, Riba, Macka... Lik Trikotnik, Krog, Pravokotnik... BancniRacun OsnovniRacun, VarcevalniRacun, PrviRacun... INFORMATIKA, Programiranje 1 in 2 Stran 140

141 Oglejmo si primer preprostega dedovanja geometrijskih likov za like krog, pravokotnik in trikotnik. Vsak lik naj ima osnovno lego (x,y), barvo in metodo za izračun ploščine. Za vsak lik določimo svoj razred, torej v našem primeru razrede Krog, Pravokotnik in Trikotnik. Določimo osnovni razred Lik, ki združuje vse omenjene like in iz njega izpeljimo nove razrede. Razredu Lik določimo kar je skupnega vsem likom. Skupni podatki so barva lika, položaj oz. lega (x, y)... Specifični podatki pa so polmer za krog, stranici a in b za pravokotnik ter položaj vozlišč za trikotnik. Z določilom abstract določimo, da je razred abstrakten. Abstrakten razred vsebuje abstraktne metode, ki imajo določene le glave metode. Vsebina metode se določi v izpeljanem razredu. 1. // Lik.java 2. import java.awt.color; // abstraktni razred Lik 5. public abstract class Lik { 6. // izhodišče (x, y) 7. protected double x; 8. protected double y; 9. protected Color barva; // barva lika // konstruktorja 12. public Lik(double x1, double y1) 13. { 14. this.x = x1; 15. this.y = y1; 16. } public Lik(double x1, double y1, Color barva1) { 19. this.x = x1; 20. this.y = y1; 21. this.barva = barva1; 22. } // konstruktorja public double getx() { 25. return x; 26. } public void setx(double x) { 29. this.x = x; 30. } public double gety() { 33. return y; 34. } public void sety(double y) { 37. this.y = y; 38. } public Color getbarva() { 41. return barva; 42. } 43. Stran 141 ŠC VELENJE

142 44. public void setbarva(color barva) { 45. this.barva = barva; 46. } // premik izhodišča 49. public void premakniizhodisce(double dx, double dy) 50. { 51. this.x = this.x + dx; 52. this.y = this.y + dy; 53. } // premakniizhodisce // izračun ploščine, abstrakta metoda je določena v izpeljanem razredu 56. public abstract double ploscina(); 57. } // Lik 1. // Krog.java 2. import java.awt.color; 3. public class Krog extends Lik { // krog izpeljemo iz lika 4. private double polmer; // polmer kroga public Krog(double x1, double y1, Color barva1, double r1) { 7. super(x1, y1, barva1); // konstruktor osnovnega razreda 8. this.polmer = r1; 9. } // konstruktor public double getpolmer() { 12. return polmer; 13. } public void setpolmer(double polmer) { 16. this.polmer = polmer; 17. } 18. // prekrivanje 20. public double ploscina() { 21. return Math.PI* Math.pow(polmer, 2); 22. } // ploscina 23. } // razred krog 1. // Pravokotnik.java 2. import java.awt.color; 3. public class Pravokotnik extends Lik { 4. // stranici pravokotnika 5. private double stranicaa; 6. private double stranicab; public Pravokotnik(double x1, double y1, Color barva, double stranicaa, double stranicab) { 9. super(x1, y1, barva); // klic konstruktorja osnovnega razreda 10. this.stranicaa = stranicaa; 11. this.stranicab = stranicab; 12. } // konstruktor public double getstranicaa() { 15. return stranicaa; 16. } INFORMATIKA, Programiranje 1 in 2 Stran 142

143 public void setstranicaa(double stranicaa) { 19. this.stranicaa = stranicaa; 20. } public double getstranicab() { 23. return stranicab; 24. } public void setstranicab(double stranicab) { 27. this.stranicab = stranicab; 28. } public double ploscina() { 32. return this.stranicaa * this.stranicab; 33. } // ploscina } // Pravokotnik 1. // Trikotnik.java 2. import java.awt.color; 3. public class Trikotnik extends Lik { 4. double x2, y2; // drugo ogljišče 5. double x3, y3; // tretje ogljišče public Trikotnik(double x1, double y1, Color barva1, double x2, double y2, double x3, double y3) { 9. super(x1, y1, barva1); // konstruktor osnovnega razreda 10. this.x2 = x2; // drugo ogljišče 11. this.y2 = y2; 12. this.x3 = x3; // tretje ogljišče 13. this.y3 = y3; 14. } // konstruktor public double getx2() { 17. return x2; 18. } public void setx2(double x2) { 21. this.x2 = x2; 22. } public double gety2() { 25. return y2; 26. } public void sety2(double y2) { 29. this.y2 = y2; 30. } public double getx3() { 33. return x3; 34. } Stran 143 ŠC VELENJE

144 public void setx3(double x3) { 37. this.x3 = x3; 38. } public double gety3() { 41. return y3; 42. } public void sety3(double y3) { 45. this.y3 = y3; 46. } public double ploscina() { 50. // ploscina = 1/2 * abs( (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1) ) 51. return 1/2 * Math.abs( (x2-x)*(y3-y) - (x3-x) * (y2-y) ); 52. } // ploscina } // Trikotnik 1. // demonstracija uporabe 2. import java.awt.color; 3. public class TestniLiki { public static void main(string[] args) { 6. // objekt krog 7. Krog krog = new Krog(10,10, Color.gray, 2); 8. System.out.printf("Ploščina kroga s polmerom 2 je: %4.2f. \n", krog.ploscina()); 9. // objekt pravokotnik 10. Pravokotnik pravokotnik = new Pravokotnik(5,4, Color.black, 5, 4); 11. System.out.printf("Ploščina pravokotnika s stranicama %4.2f in %4.2f je: %4.2f. \n.", 12. pravokotnik.getstranicaa(), pravokotnik.getstranicab(), pravokotnik.ploscina()); 13. } // main 14. } // TestniLiki Primer izvajanja: Ploščina kroga s polmerom 2 je: 12,57. Ploščina pravokotnika s stranicama 5,00 in 4,00 je: 20,00. INFORMATIKA, Programiranje 1 in 2 Stran 144

145 14.11 Oblike dedovanja Oblika Predloga kode Slika enkratno dedovanje (angl. single inheritance) class RazredA {...} class RazredB extends RazredA {... } večstopenjsko dedovanje (angl. multi level inheritence) class RazredA {...} class RazredB extends RazredA {... } class RazredC extends RazredB {... } hierarhično dedovanje (angl. hierarchical inheritence) class RazredA {...} class RazredB extends RazredA {... } class RazredC extends RazredA {... } večkratno dedovanje (angl. multiple inheritence) Java ne podpira! class RazredA {...} class RazredB {... } class RazredC extends RazredA, RazredB {... } // Java ne podpira! Oglejmo si primer dedovanja metod in lastnosti živali. Razred Zivali vsebuje skupne atribute ime, višino in dolžino živali. Višina in dolžina je podana v centimetrih. Trenutni položaj živali določata atributa koordinati x in y. Značilne metode razreda Zivali: tostring() izpiše vrednosti vseh atributov, sehrani() izpiše obvestilo Žival se hrani (Zival.seHrani). sepremika(int hitrost) izpiše obvestilo Žival se premika (Zival.sePremika) in hitrost premikanja. Iz tega razreda izpeljemo razred Pes, ki vsebuje dodatne atribute rep (ima rep), vrsta dlake in pasma. Značilne metode razreda Pes: sprehajanje() izpiše obvestilo Pes se sprehaja (Klic metode: Pes.sprehajanje) in izvede metodo sepremika nadrejenega razreda (hitrost 2). tek() izpiše obvestilo Pes teče (Klic metode: Pes.tek) in izvede metodo sepremika nadrejenega razreda (hitrost 6). sehrani() izpiše obvestilo Pes se hrani (Klic metode: Pes.seHrani) in izvede metodo sehrani() nadrejenega razreda. tostring() izpiše vrednosti vseh atributov. Stran 145 ŠC VELENJE

146 1. // Razred Zivali 2. public class Zivali { 3. private String ime; // ime oz. vzdevek 4. private float x; // x - koordianata položaja 5. private float y; // y - koordianata položaja 6. private int visina; // višina v cm 7. private int dolzina; // dolžina v cm public Zivali(String ime, int visina, int dolzina) { 11. super(); 12. this.ime = ime; 13. this.x = 0; // privzeta vrednost položaja koordinata x 14. this.y = 0; // privzeta vrednost položaja koordinata y 15. this.visina = visina; 16. this.dolzina = dolzina; 17. } // konstruktor Zivali // prekrivanje metode tostring razreda Object 21. public String tostring() { 22. return "Živali [ime= " + ime + ", x= " + x + ", y= " + y + ", visina= " + visina ", dolzina= " + dolzina + "]"; 24. } // tostring // metode za vračanje vrednosti atributov 27. public String vrniime() { 28. return this.ime; 29. } public float vrnix() { 32. return this.x; 33. } public float vrniy() { 36. return this.y; 37. } public int vrnivisina() { 40. return this.visina; 41. } public int vrnidolzina() { 44. return this.dolzina; 45. } // metode za določitev vrednosti atributov 48. public void dolociime(string ime) { 49. this.ime = ime; 50. } public void dolocixy(float x, float y) { 53. this.x = x; 54. this.y = y; INFORMATIKA, Programiranje 1 in 2 Stran 146

147 55. } public void dolocivelikost(int visina, int dolzina) { 58. this.visina = visina; 59. this.dolzina = dolzina; 60. } public void sehrani() { 63. System.out.println("Žival se hrani (Zival.seHrani)."); 64. } public void sepremika(int hitrost) { 67. System.out.println("Žival se premika (Zival.sePremika)."); 68. System.out.println("Hitrost premikanja: " + hitrost); 69. } } // razred Zivali 1. // Testni razred preverjanje razreda Zivali 2. public class DemoZivali { public static void main(string[] args) { Zivali z1 = new Zivali("Pes", 60, 90); 7. System.out.println(z1.toString()); 8. z1.sepremika(5); Zivali z2 = new Zivali("Piton", 6, 120); 11. System.out.println(z2.toString()); 12. z2.sepremika(2); 13. } // main 14. } // DemoZivali 1. // razred Pes podeduje atribute in metode razreda Zivali 2. public class Pes extends Zivali { 3. private int rep; 4. private String vrstadlake; 5. private String pasma; public Pes(String ime, int visina, int dolzina, int rep, String vrstadlake, String pasma) { 8. super(ime, visina, dolzina); // klic konstruktorja nadrejenega razreda 9. // določitev privzetih vrednosti atributov razreda Pes 10. this.rep = rep; 11. this.vrstadlake = vrstadlake; 12. this.pasma = pasma; 13. } // metode za določanje in vračanje vrednosti atributov razreda Pes 16. public String vrnivrstadlake() { 17. return vrstadlake; 18. } public void dolocivrstadlake(string vrstadlake) { 21. this.vrstadlake = vrstadlake; Stran 147 ŠC VELENJE

148 22. } public String vrnipasma() { 25. return pasma; 26. } public void dolocipasma(string pasma) { 29. this.pasma = pasma; 30. } // metode razreda Pes 33. public void sprehajanje() 34. { 35. System.out.println("Pes se sprehaja (Klic metode: Pes.sprehajanje)."); 36. super.sepremika(2); 37. } public void tek() 40. { 41. System.out.println("Pes teče (Klic metode: Pes.tek)."); 42. super.sepremika(6); 43. } // prekrivanje metode tostring() 47. public String tostring() { 48. return "Pes [ime= " + ime + ", x= " + x + ", y= " + y + ", visina= " + visina ", dolzina= " + dolzina + ", rep= " + rep + ", vrsta dlake= " + vrstadlake + ", pasma= " + pasma + "]"; 50. } // prekrivanje metode sehrani() 54. public void sehrani() { 55. System.out.println("Pes se hrani (Klic metode: Pes.seHrani)."); 56. super.sehrani(); 57. } } // razred Pes 1. // Testni razred preverjanje razreda Pes 2. public class DemoPes { 3. public static void main(string[] args) { 4. Pes pes1 = new Pes("Iskra", 60, 90,1,"dolgodlak","škotski ovčar"); 5. System.out.println (pes1.tostring()); 6. // sprehajanje 7. pes1.sprehajanje(); 8. // tek 9. pes1.tek(); 10. } } // razred DemoPes INFORMATIKA, Programiranje 1 in 2 Stran 148

149 14.12 Kompozicija (angl. composition) Kompozicija predstavlja koncept zgradbe objekta iz drugih objektov - odvisnost ima oz. vsebuje (angl. has). Kompozicija je uporaba objektov, ki so ustvarjeni s konstruktorjem enega razred. Razred lahko poleg atributov in metod vsebuje tudi objekte, ki predstavljajo sklice (reference) na druge objekte. Oglejmo si primer kompozicije na razredu računalnik, ki vsebuje objekte, ki predstavljajo sestavne dele računalnika in sicer: ohišje, osnovna plošča, procesor, monitor. 1. // razred Dimenzije, dimenzije ohišja 2. public class Dimenzije { 3. private float sirina; 4. private float visina; 5. private float globina; public Dimenzije(float sirina, float globina, float visina) { 8. this.sirina = sirina; 9. this.visina = visina; 10. this.globina = globina; 11. } // konstruktor Dimenzije public String getdimenzije() { 14. return ("ŠxVxG: " + this.sirina + "x" + this.visina + "x" + this.globina); 15. } public void setsirina(float sirina) { 18. this.sirina = sirina; 19. } public void setvisina(float visina) { 22. this.visina = visina; 23. } public void setglobina(float globina) { 26. this.globina = globina; 27. } 28. } // razred Dimenzije 1. // razred ohišje 2. import java.awt.color; 3. public class Ohisje { 4. private String model; 5. private String proizvajalec; 6. private String napajalnanapetost; 7. private Dimenzije dimenzije; // referenca na objekt razreda Dimenzije 8. private int stikalovklop; 9. private float teza; 10. private Color barva; public Ohisje(String model, String proizvajalec, String napajalnanapetost, 13. Dimenzije dimenzije, float teza, Color barva) { 14. super(); 15. this.model = model; 16. this.proizvajalec = proizvajalec; 17. this.napajalnanapetost = napajalnanapetost; Stran 149 ŠC VELENJE

150 18. this.dimenzije = dimenzije; 19. this.stikalovklop = 0; 20. this.teza = teza; 21. this.barva = barva; 22. } // konstruktor Ohisje public String vrnimodel() { 25. return model; 26. } public String vrniproizvajalec() { 29. return proizvajalec; 30. } public String vrninapajalnanapetost() { 33. return napajalnanapetost; 34. } public Dimenzije vrnidimenzije() { 37. return dimenzije; 38. } public int vrnistikalovklop() { 41. return stikalovklop; 42. } public float getteza() { 45. return teza; 46. } public void setteza(float teza) { 49. this.teza = teza; 50. } public Color getbarva() { 53. return barva; 54. } public void setbarva(color barva) { 57. this.barva = barva; 58. } public void vklop() { 61. System.out.println("Pritisnjen gumb za vklop. (Ohisje.vklop)"); 62. this.stikalovklop = 1; 63. } public void izklop() { 66. System.out.println("Pritisnjen gumb za izklop. (Ohisje.izklop)"); 67. this.stikalovklop = 0; 68. } 69. } // razred Ohisje 1. // razred resolucija monitorja 2. public class Resolucija { INFORMATIKA, Programiranje 1 in 2 Stran 150

151 3. private int sirina; 4. private int visina; public Resolucija(int sirina, int visina) { 7. super(); 8. this.sirina = sirina; 9. this.visina = visina; 10. } // konstruktor Resolucija public int vrnisirina() { 13. return sirina; 14. } public int vrnivisina() { 17. return visina; 18. } 19. } // razred Resolucija 1. // razred računalniški monitor 2. public class Monitor { 3. private String model; 4. private String proizvajalec; 5. private String velikost; 6. private Resolucija resolucija; public Monitor(String model, String proizvajalec, String velikost, Resolucija resolucija) { 9. this.model = model; 10. this.proizvajalec = proizvajalec; 11. this.velikost = velikost; 12. this.resolucija = resolucija; 13. } public String vrnimodel() { 16. return model; 17. } public String vrniproizvajalec() { 20. return proizvajalec; 21. } public String vrnivelikost() { 24. return velikost; 25. } public Resolucija vrniresolucija() { 28. return resolucija; 29. } 30. } // razred Monitor 1. // razred osnovna plošča 2. public class OsnovnaPlosca { 3. private String model; 4. private Procesor procesor; // referenca na objekt 5. private int notranjipomnilnikreze; 6. private int notranjipomnilnikmaxvelikost; Stran 151 ŠC VELENJE

152 7. 8. public OsnovnaPlosca(String model, Procesor procesor, int notranjipomnilnikreze,int notranjipomnilnikmaxvelikost) { 9. super(); 10. this.model = model; 11. this.procesor = procesor; 12. this.notranjipomnilnikreze = notranjipomnilnikreze; 13. this.notranjipomnilnikmaxvelikost = notranjipomnilnikmaxvelikost; 14. } // konstruktor OsnovnaPlosca public String vrnimodel() { 17. return model; 18. } public Procesor vrniprocesor() { 21. return procesor; 22. } public int vrninotranjipomnilnikreze() { 25. return notranjipomnilnikreze; 26. } public int vrninotranjipomnilnikmaxvelikost() { 29. return notranjipomnilnikmaxvelikost; 30. } 31. } // razred OsnovnaPlosca 1. // razred procesor 2. public class Procesor { 3. private String model; 4. private String procesorhitrost; 5. private int stevilojeder; 6. private String velikostpredpomnilnik; public Procesor(String model, String procesorhitrost, int stevilojeder, String velikostpredpomnilnik) { 9. super(); 10. this.model = model; 11. this.procesorhitrost = procesorhitrost; 12. this.stevilojeder = stevilojeder; 13. this.velikostpredpomnilnik = velikostpredpomnilnik; 14. } // konstruktor Procesor public String vrnimodel() { 17. return model; 18. } public String vrniprocesorhitrost() { 21. return procesorhitrost; 22. } public int vrnistevilojeder() { 25. return stevilojeder; 26. } public String vrnivelikostpredpomnilnik() { 29. return velikostpredpomnilnik; INFORMATIKA, Programiranje 1 in 2 Stran 152

153 30. } 31. } // razred Procesor 1. // razred računalnik 2. public class Racunalnik { 3. // reference na objekte 4. private OsnovnaPlosca osnovnaplosca; 5. private Procesor procesor; 6. private Ohisje ohisje; 7. private Monitor monitor; public Racunalnik(OsnovnaPlosca osnovnaplosca, Procesor procesor, Ohisje ohisje, Monitor monitor) { 10. this.osnovnaplosca = osnovnaplosca; 11. this.procesor = procesor; 12. this.ohisje = ohisje; 13. this.monitor = monitor; 14. } // konstruktor Racunalnik public OsnovnaPlosca vrniosnovnaplosca() { 17. return osnovnaplosca; 18. } public Procesor vrniprocesor() { 21. return procesor; 22. } public Ohisje vrniohisje() { 25. return ohisje; 26. } public Monitor vrnimonitor() { 29. return monitor; 30. } 31. } // razred Racunalnik 1. // testni razred 2. import java.awt.color; public class DemoRacunalnik { public static void main(string[] args) { 7. // ustvarjanje objektov, delov računalnika 8. Monitor monitor = new Monitor("BX2240W", "Samsung", "22 '' ", new Resolucija(1680,1050)); 9. Procesor procesor = new Procesor("Intel Quad Core i5-2400", "3.10 GHz", 4, "L2 6 MB"); 10. OsnovnaPlosca osnovnaplosca = new OsnovnaPlosca("Asus XY", procesor, 2,8); 11. Dimenzije dimenzija = new Dimenzije(17, 44, 44); 12. Ohisje ohisje = new Ohisje("HP", "HP", "250", dimenzija, 8, Color.gray ); // ustvarjanje objekta za računalnik 15. Racunalnik pc_hp = new Racunalnik(osnovnaPlosca, procesor, ohisje, monitor); // test delovanja 18. pc_hp.vrniohisje().vklop(); // vklop računalnika Stran 153 ŠC VELENJE

154 19. if (pc_hp.vrniohisje().vrnistikalovklop() == 1) 20. System.out.println("Računalnik je vklopljen. (pc_hp.vrniohisje().vrnistikalovklop())"); 21. System.out.println("Podatki računalnika: " + pc_hp.vrniprocesor().vrnimodel() + " " + pc_hp.vrniprocesor().vrniprocesorhitrost() ); 22. System.out.println("Velikost monitorja: " + pc_hp.vrnimonitor().vrnivelikost() ); 23. } 24. } // razred DemoRacunalnik Primer izvajanja: Pritisnjen gumb za vklop. (Ohisje.vklop) Računalnik je vklopljen. (pc_hp.vrniohisje().vrnistikalovklop()) Podatki računalnika: Intel Quad Core i GHz Velikost monitorja: 22 '' Ograjevanje (angl. encapsulation) Ograjevanje je skrivanje implementacije objekta pred ostalimi razredi. To pomeni, da objekt skriva svoje metode in podatke pred uporabniki. Objektu lahko spreminjamo stanje le preko njegovih metod. Za uporabnika je pomembno le, katere operacije oz. metode ima objekt na voljo, kaj so vhodni parametri za te operacije in katere informacije vračajo metode razreda. Pomembno je, da pred uporabnikom skrijemo vse podrobnosti in ohranimo vmesnike objekta čim bolj preproste. Oglejmo si kodo brez pravilne uporabe ograjevanja. 1. // definicija razreda brez ograjevanja, "neustrezno!" 2. import java.text.parseexception; 3. import java.text.simpledateformat; 4. import java.util.calendar; 5. import java.util.date; public class PesBrezOgrajevanja { 9. // atributi, dostop iz vseh razredov 10. public String imevzdevek; 11. public String pasma; 12. public String datumrojstva; // "dd.mm.llll hh:mm:ss" 13. public int visina; // višina v cm 14. public int dolzina; // dolzina v cm /* metoda izračuna starost iz rojstnega datuma (String) in trenutnega sistemskega časa 17. * Oba datuma pretvorimo v milisekunde in izračunamo razliko 18. * Starost v milisekundah pretvorimo v starost v dneh. Upoštevamo 1000 milliseconds = 1 sekunda, sekund = 1 minuta, 60 minut = 1 ura, 24 ur = 1 dan 20. * Izračun = razlika_datumov / (24 * 60 * 60 * 1000); 21. * */ 22. public long starostdni() { 23. // ustvarimo objekt oblike datuma razreda SimpleDateFormat 24. SimpleDateFormat oblikadatuma = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 25. Date datumrojstvapsa = null; 26. try { 27. // atribut datumrojstva pretvorimo v datum z objektom SimpleDateFormat 28. datumrojstvapsa = oblikadatuma.parse(datumrojstva); 29. } catch (ParseException e) { 30. e.printstacktrace(); 31. } INFORMATIKA, Programiranje 1 in 2 Stran 154

155 32. long razlikadatum = trenutnisistemskidatum().gettime() - datumrojstvapsa.gettime(); 33. long starostdni = razlikadatum / (24*60*60*1000); 34. return starostdni; 35. } // starostdni // vrne sistemski datum glede na lokalne nastavitve 38. public static Date trenutnisistemskidatum() { 39. // ustvarimo objekt koledarja 40. Calendar koledar = Calendar.getInstance(); // vrne koledar z lokalnimi nastavitvami sistema 41. return koledar.gettime(); // trenutni sistemski datum 42. } // trenutnisistemskidatum } // razred PesBrezOgrajevanja 1. // testni razred 2. import java.text.simpledateformat; public class DemoPesBrezOgrajevanja { public static void main(string[] args) { 7. PesBrezOgrajevanja pes1 = new PesBrezOgrajevanja(); // inicializacija brez preverjanja vrednosti; ni preverjanja veljavnosti podatkov 10. // večja verjetnost napak, slabša preglednost pes1.imevzdevek = "Čarli"; 12. pes1.pasma = "Labradorec"; 13. pes1.datumrojstva = " :00:00"; 14. pes1.visina = 25; 15. pes1.dolzina = 40; 16. System.out.println("Vzdevek: " + pes1.imevzdevek); 17. System.out.println("Datum rojstva: " + pes1.datumrojstva); 18. System.out.printf("Sistemski datum: %s \n", PesBrezOgrajevanja.trenutniSistemskiDatum() ); 19. System.out.println("Starost (dni): " + pes1.starostdni()); 20. } // main 21. } // razred DemoPesBrezOgrajevanja Primer izvajanja: Vzdevek: Čarli Datum rojstva: :00:00 Sistemski datum: Sun Sep 27 12:32:30 CEST 2015 Starost (dni): 366 Kodo spremenimo v pravilno uporabo ograjevanja 1. // definicija razreda z ograjevanjem 2. import java.text.parseexception; 3. import java.text.simpledateformat; 4. import java.util.calendar; 5. import java.util.date; public class PesZOgrajevanjem { 8. // atributi, dostop znotraj razreda 9. private String imevzdevek; 10. private String pasma; 11. private String datumrojstva; // "dd.mm.llll hh:mm:ss" Stran 155 ŠC VELENJE

156 12. private int visina; // višina v cm 13. private int dolzina; // dolzina v cm // konstruktor, določitev privzetih vrednosti s preverjanjem vrednosti 17. public PesZOgrajevanjem(String imevzdevek, String pasma, String datumrojstva, int visina, int dolzina) { 18. this.imevzdevek = imevzdevek; 19. this.pasma = pasma; 20. SimpleDateFormat oblikadatuma = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); try { 24. Date datumrojstva1 = oblikadatuma.parse(datumrojstva); ; 25. // atribut datumrojstva pretvorimo v datum z objektom SimpleDateFormat 26. this.datumrojstva = datumrojstva; 27. } catch (ParseException e) { 28. throw new IllegalArgumentException("Napaka..."); 29. } 30. if (visina >= 0 ) 31. this.visina = visina; 32. else 33. throw new IllegalArgumentException("Napaka..."); 34. if (dolzina >= 0 ) 35. this.dolzina = dolzina; 36. else 37. throw new IllegalArgumentException("Napaka..."); 38. } // PesZOgrajevanjem // metode za dostop do atributov public String vrniimevzdevek() { 43. return imevzdevek; 44. } public String vrnipasma() { 47. return pasma; 48. } public String vrnidatumrojstva() { 51. return datumrojstva; 52. } public int vrnivisina() { 55. return visina; 56. } public int vrnidolzina() { 59. return dolzina; 60. } // vrne sistemski datum glede na lokalne nastavitve 63. public static Date trenutnisistemskidatum() { 64. // ustvarimo objekt koledarja 65. Calendar koledar = Calendar.getInstance(); // vrne koledar z lokalnimi nastavitvami sistema 66. return koledar.gettime(); // trenutni sistemski datum 67. } // trenutnisistemskidatum INFORMATIKA, Programiranje 1 in 2 Stran 156

157 /* metoda izračuna starost iz rojstnega datuma (String) in trenutnega sistemskega časa 70. * Oba datuma pretvorimo v milisekunde in izračunamo razliko 71. * Starost v milisekundah pretvorimo v starost v dneh. Upoštevamo 1000 milliseconds = 1 sekunda, sekund = 1 minuta, 60 minut = 1 ura, 24 ur = 1 dan 73. * Izračun = razlika_datumov / (24 * 60 * 60 * 1000); 74. * */ 75. public long starostdni() { 76. // ustvarimo objekt oblike datuma razreda SimpleDateFormat 77. SimpleDateFormat oblikadatuma = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 78. Date datumrojstva1 = null; 79. try { 80. // atribut datumrojstva pretvorimo v datum z objektom SimpleDateFormat 81. datumrojstva1 = oblikadatuma.parse(datumrojstva); 82. } catch (ParseException e) { 83. e.printstacktrace(); 84. } 85. long razlikadatum = trenutnisistemskidatum().gettime() - datumrojstva1.gettime(); 86. long starostdni = razlikadatum / (24*60*60*1000); 87. return starostdni; 88. } // starostdni } // razred PesZOgrajevanjem 1. // testni razred, veljavne vrednosti 2. public class DemoPesZOgrajevanjem { public static void main(string[] args) { 5. // inicializacija s konstruktorjem, preverjanje vrednosti 6. PesZOgrajevanjem pes1 = new PesZOgrajevanjem("Čarli", "Labradorec", " :00:00", 25,40); 7. System.out.println("Vzdevek: " + pes1.vrniimevzdevek()); 8. System.out.println("Datum rojstva: " + pes1.vrnidatumrojstva()); 9. System.out.printf("Sistemski datum: %s \n", PesZOgrajevanjem.trenutniSistemskiDatum() ); 10. System.out.println("Starost (dni): " + pes1.starostdni()); 11. } // main 12. } // razred DemoPesZOgrajevanjem Primer izvajanja: Vzdevek: Čarli Datum rojstva: :00:00 Sistemski datum: Sun Sep 27 12:32:30 CEST 2015 Starost (dni): 366 Preverjanje delovanja, če so neustrezne vrednosti dejanskih parametrov pri ustvarjanju objekta razreda. // testni razred, neveljavne vrednosti parametrov public class DemoPesZOgrajevanjem { public static void main(string[] args) { // inicializacija s konstruktorjem, preverjanje vrednosti PesZOgrajevanjem pes1 = new PesZOgrajevanjem("Čarli", "Labradorec", "26.09\\ :00:00", 25,-40); System.out.println("Vzdevek: " + pes1.vrniimevzdevek()); System.out.println("Datum rojstva: " + pes1.vrnidatumrojstva()); System.out.printf("Sistemski datum: %s \n", PesZOgrajevanjem.trenutniSistemskiDatum() ); System.out.println("Starost (dni): " + pes1.starostdni()); Stran 157 ŠC VELENJE

158 } // main } // razred DemoPesZOgrajevanjem Primer izvajanja: Exception in thread "main" java.lang.illegalargumentexception: Napaka... at dedovanje.peszograjevanjem.<init>(peszograjevanjem.java:30) at dedovanje.demopeszograjevanjem.main(demopeszograjevanjem.java:8) Polimorfizem Polimorfizem oz. večličnost predstavlja koncept, da se objekti obnašajo različno v drugih vlogah. Polimorfizem dovoljuje, da se dva ali več razredov odzivajo različno na isto sporočilo (metodo). Oglejmo si primer razreda športnik, ki vsebuje atributa ime in priimek in metodo značilnost. Metoda značilnost vrne besedilno vrednost, ki opisuje osnovno značilnost športnika izpeljanega razreda. 1. // splošni razred športnik 2. public class Sportnik { 3. private String ime; 4. private String priimek; public Sportnik(String ime, String priimek) { 7. this.ime = ime; 8. this.priimek = priimek; 9. } // konstruktor // vrni metode 12. public String vrniime() { 13. return ime; 14. } 15. public String vrnipriimek() { 16. return priimek; 17. } 18. public String znacilnost() { 19. return "Splošna metoda, značilnost športnika (razred Sportnik)"; 20. } // znacilnost 21. } // razred Sportnik Iz splošnega razreda izpeljemo razrede, ki predstavljajo najboljše športnike v posameznih športnih panogah. Izpeljani razredi v konstruktorjih izvršijo (kličejo) konstruktor nadrejenega razreda. 22. // izpeljani razredi 23. class Nykanen extends Sportnik { 24. public Nykanen() { 25. super("matti", "Nykanen"); 26. } public String znacilnost() { 29. return "Najboljši smučarski skakalec vseh časov."; 30. } // znacilnost 31. } // razred Nykanen class Pele extends Sportnik { 34. public Pele() { INFORMATIKA, Programiranje 1 in 2 Stran 158

159 35. super("pele", "Edson Arantes do Nascimento"); 36. } public String znacilnost() { 39. return "Eden izmed najboljših nogometašev vseh časov."; 40. } // znacilnost 41. } // razred Pele class Stenmark extends Sportnik { 44. public Stenmark() { 45. super("ingemar ", "Stenmark"); 46. } public String znacilnost() { 49. return "Po oceni mnogih najboljši alpski smučar vseh časov."; 50. } // znacilnost 51. } // razred Stenmark // Razred Pozabljen ne vsebuje metode značilnost class Pozabljen extends Sportnik { 56. public Pozabljen() { 57. super("pozabljen", "športnik"); 58. } // Pozabljen 59. // ni metode znacilnost() 60. } // razred Pozabljen 1. // testni razred 2. public class DemoSportnik { 3. public static void main(string[] args) { 4. for(int i=1; i<6; i++) { 5. Sportnik sportnik = randomsportnik(); 6. System.out.println("Športnik: " + i + 7. " : " + sportnik.vrniime() + " " + sportnik.vrnipriimek() + "\n" + 8. "Značilnost: " + sportnik.znacilnost() + "\n"); 9. } // for 10. } // main // naključno vrne objekt izpeljanega razreda športnika 13. public static Sportnik randomsportnik() { 14. int nakljucnostevilo = (int) (Math.random() * 4) +1; // naključno stevilo od 1 do switch (nakljucnostevilo) { 16. case 1: 17. return new Nykanen(); 18. case 2: 19. return new Pele(); 20. case 3: 21. return new Stenmark(); 22. case 4: 23. return new Pozabljen(); 24. } // switch 25. return null; 26. } // randomsportnik } // DemoSportnik Stran 159 ŠC VELENJE

160 Razred pozabljen športnik ne vsebuje metode značilnost. V primeru klica metode Pozabljen.znacilnost() se izvede metoda nadrejenega razreda Sportnik, ki vrne besedilo "Splošna metoda, značilnost športnika (razred Sportnik)". V našem primeru se objekti različnih razredov različno odzivajo na isto metodo. Primer izvajanja: Športnik: 1 : Pele Edson Arantes do Nascimento Značilnost: Eden izmed najboljših nogometašev vseh časov. Športnik: 2 : Pozabljen športnik Značilnost: Splošna metoda, značilnost športnika (razred Sportnik) Športnik: 3 : Ingemar Stenmark Značilnost: Po oceni mnogih najboljši alpski smučar vseh časov. Športnik: 4 : Matti Nykanen Značilnost: Najboljši smučarski skakalec vseh časov. Športnik: 5 : Ingemar Stenmark Značilnost: Po oceni mnogih najboljši alpski smučar vseh časov Abstraktni razredi Abstraktni razred je splošen osnovni razred (nadrazred), ki predstavlja osnovo za izpeljavo različnih podrazredov. Določimo ga z namenom, da iz njega izpeljemo različne razrede. Abstraktnemu razredu ne moremo ustvariti primerkov objektov razreda. Primerke objektov ustvarimo za izpeljane razrede abstraktnega razreda. Abstraktni razred je po zgradbi podoben ostalim razredom (vsebuje atribute in metode) s tem, da je ena ali več metod abstraktnih. Deklaracija abstraktnega razreda: public abstract class ImeRazreda {... } Abstraktna metoda je deklarirana z določilom abstract in v deklaraciji metode vsebuje samo glavo metode (brez telesa). Vsebino oz. telo abstraktne metode določimo v izpeljanem razredu. Abstraktne metode uporabimo v primeru, ko na osnovnem razredu ni znan postopek oz. vsebina aktivnosti metode in želimo doseči, da vsi izpeljani razredi vsebujejo to metodo. Če izpeljan razred ne redefinira abstraktne metode osnovnega razreda, potem je tudi izpeljani razred abstraktni. Če je razred abstrakten, je prazna metoda abstraktna tudi, če izpustimo rezerviranko abstract. Primer uporabe je abstraktni razred lik, ki ima določeno abstraktne metode za izračun obsega in ploščine. Uporabimo ga za izpeljavo podrazredov kvadrat, pravokotnik, krog... V podrazredih je določen postopek izračuna obsega in ploščine. Abstraktni razred uporabimo za osnovne razrede, ki vsebujejo metode (kodo), ki so skupne različnim podrazredom. Dinamično povezovanje metod Vsak objekt podrazreda je istočasno tudi objekt razreda iz katerega je izpeljan (osnovnega razreda). Npr. krog je lik, trikotnik je lik, avtomobil je vozilo itd. Objektni spremenljivki osnovnega razreda lahko priredimo naslov objekta kateregakoli izpeljanega razreda. INFORMATIKA, Programiranje 1 in 2 Stran 160

161 Npr.:... Vozilo vozilo1 = new Vozilo (... ); Vozilo vozilo2 = new Vozilo (... );... Avtomobil avto = new Avtomobil (... ); Tovornjak tovornjak = new Tovornjak (... );... Objektu vozilo lahko priredimo vrednost objekta avto ali tovornjak.... vozilo1 = avto; vozilo2 = tovornjak;... Dinamično povezovanje metod je značilnost programa, da izbere metodo, ki pripada pravemu podrazredu. Metoda se izbere med izvajanjem programa, odvisno od dejanskega tipa objekta. Ločimo statični in dinamični tip: statični tip je naveden ob deklaraciji (objekt vozilo1 je tipa Vozilo), dinamični tip je določen med izvajanjem programa (objektna spremenljivka vozilo1 je lahko dinamičnega tipa Avtomobil ali Tovornjak. Dinamični tip objektne spremenljivke določa, katera metoda se izvede. Tabela objektov lahko vsebuje objekte različnih podrazredov. Tabela vsebuje objekte istega podatkovnega tipa (osnovnega razreda). Ustvarimo objekte, ki pripadajo različnim izpeljanim razredom osnovnega razreda. Te objekte shranimo v tabelo. Vstavljene objekte tabele obdelamo v zanki kot da so vsi istega podatkovnega tipa. Omejitev je le, da morajo biti vsi vstavljeni objekti tabele izpeljani iz istega osnovnega razreda. Primer uporabe si bomo ogledali v testnem razredu naslednjega primera. Oglejmo si enostaven primer izračuna plače za zaposlene delavce. Osnovni razred zaposleni vsebuje atribute ime, priimek in davčno številko. Poleg osnovnih metod za določitev in dostop do vrednosti atributov vsebuje tudi abstraktno metodo za izračun plače. Iz razreda zaposleni izpeljemo razreda zaposleni študent in zaposlitev uprava. Zaposleni študent vsebuje dodatna atributa za število opravljenih ur in bruto urno postavko. Bruto znesek plačila izračunamo s produktom urne postavke in števila opravljenih ur. Razred zaposlitev uprava vsebuje dodatne atribute število opravljenih ur, bruto znesek osnovne plače in bruto znesek dodatka. V konstruktorjih izpeljanih razredov uporabimo konstruktor osnovnega razreda. 1. // abstraktni razred zaposleni 2. public abstract class Zaposleni { 3. private String ime; 4. private String priimek; 5. private String davcnastevilka; // konstruktor s tremi parametri 8. public Zaposleni(String ime2, String priimek2, String davcnastevilka2){ 9. this.ime = ime2; 10. this.priimek = priimek2; 11. this.davcnastevilka = davcnastevilka2; 12. } // Zaposleni // vrne ime Stran 161 ŠC VELENJE

162 15. public String vrniime() { 16. return ime; 17. } // vrniime // določi ime 20. public void dolociime(string ime) { 21. this.ime = ime; 22. } // dolociime // vrne priimek 25. public String vrnipriimek() { 26. return priimek; 27. } // vrnipriimek // določi priimek 30. public void dolocipriimek(string priimek) { 31. this.priimek = priimek; 32. } // dolocipriimek // vrne davčno številko 35. public String vrnidavcnastevilka() { 36. return davcnastevilka; 37. } // določi davčno število 40. public void dolocidavcnastevilka(string davcnastevilka) { 41. this.davcnastevilka = davcnastevilka; 42. } // dolocidavcnastevilka // vrne besedilno predstavitev objekta 46. public String tostring() { 47. return String.format("%s %s\ndavčna številka: %s", this.vrniime(), this.vrnipriimek(), 48. this.vrnidavcnastevilka()); 49. } // tostring // abstraktna metoda za izračun plače 52. public abstract double placa(); 53. // ni določena izvršitev izračuna plače 54. // določena bo pri izpeljanih razredih } // razred Zaposleni 1. // izpeljani razred zaposlenega študenta 2. public class ZaposlitevStudent extends Zaposleni { 3. private double stevilour; // število opravljenih ur 4. private double urnapostavka; // bruto postavka za opravljeno uro // inicializacija privzetih vrednosti 7. public ZaposlitevStudent(String ime, String priimek, String davcnastevilka, double stevilour, 8. double urnapostavka) { 9. super(ime, priimek, davcnastevilka); // izvršitev konstruktorja nadrazreda 10. // inicializacija atributov razreda ZasposlitevStudent 11. this.stevilour = stevilour; 12. this.urnapostavka = urnapostavka; INFORMATIKA, Programiranje 1 in 2 Stran 162

163 13. } // ZaposlitevStudent // vrne število opravljenih ur 16. public double vrnistevilour() { 17. return stevilour; 18. } // vrnistevilour // določi število opravljenih ur 21. public void dolocistevilour(double stevilour) { 22. // preverjanje ustrezne vrednosti parametra 23. if (stevilour >= 0.0 ) 24. this.stevilour = stevilour; 25. else 26. throw new IllegalArgumentException("Število ur mora biti večje od nič."); 27. } // dolocistevilour //vrne uro postavko 30. public double vrniurnapostavka() { 31. return urnapostavka; 32. } // vrniurnapostavka // določi urno postavko 35. public void dolociurnapostavka(double urnapostavka) { 36. // preverjanje ustrezne vrednosti parametra 37. if (urnapostavka >= 0.0 ) 38. this.urnapostavka = urnapostavka; 39. else 40. throw new IllegalArgumentException("Urna postavka mora biti večja od nič."); 41. } // dolociurnapostavka // vrne besedilno predstavitev objekta 45. public String tostring() { 46. return String.format("%s\nŠtevilo ur: %f", super.tostring(),this.vrnistevilour()); 47. } // tostring // vrne bruto znesek zaslužka 51. public double placa() { 52. return (this.stevilour * this.vrniurnapostavka() ); 53. } // placa } // razred ZaposlitevStudent 1. // izpeljani razred zaposlenega delavca v upravi 2. public class ZaposlitevUprava extends Zaposleni { 3. private double steviloopravljenihur; // število opravljenih ur 4. private double osnovaplaca; // bruto znesek osnovne plače 5. private double dodatekplaca; // bruto znesek dodatka // inicializacija privzetih vrednosti 8. public ZaposlitevUprava(String ime2, String priimek2, String davcnastevilka2, double steviloopravljenihur, 9. double osnovaplaca, double dodatekplaca) { 10. super(ime2, priimek2, davcnastevilka2); Stran 163 ŠC VELENJE

164 11. this.steviloopravljenihur = steviloopravljenihur; 12. this.osnovaplaca = osnovaplaca; 13. this.dodatekplaca = dodatekplaca; 14. } // ZaposlitevUprava // vrne število opravljenih ur 17. public double vrnisteviloopravljenihur() { 18. return steviloopravljenihur; 19. } // vrnisteviloopravljenihur // določi število opravljenih ur 22. public void dolocisteviloopravljenihur(double steviloopravljenihur) { 23. this.steviloopravljenihur = steviloopravljenihur; 24. } // dolocisteviloopravljenihur // vrne znesek osnovne plače 27. public double vrniosnovaplaca() { 28. return osnovaplaca; 29. } // vrniosnovaplaca // določi znesek osnovne plače 32. public void dolociosnovaplaca(double osnovaplaca) { 33. this.osnovaplaca = osnovaplaca; 34. } // dolociosnovaplaca // vrne znesek dodatka 37. public double vrnidodatekplaca() { 38. return dodatekplaca; 39. } // vrnidodatekplaca // določi znesek dodatka 42. public void dolocidodatekplaca(double dodatekplaca) { 43. this.dodatekplaca = dodatekplaca; 44. } // dolocidodatekplaca // vrne besedilno predstavitev objekta 48. public String tostring() { 49. return String.format("%s\nOsnovna plača: %f", super.tostring(),this.vrniosnovaplaca()); 50. } // tostring // vrne bruto znesek zaslužka 54. public double placa() { 55. return (this.osnovaplaca + this.dodatekplaca ); 56. } // placa } // razred ZaposlitevUprava 1. // testni razred 2. public class DemoZaposleni { public static void main(string[] args) { 5. ZaposlitevStudent zaposlenistudent1 = new ZaposlitevStudent ("Andrej","Novak","SI ",50.0, 4.5); 6. ZaposlitevUprava zaposlitevfinance1 = new ZaposlitevUprava("Ana","Kotnik","SI ",174.0,1200.0, 100.0); INFORMATIKA, Programiranje 1 in 2 Stran 164

165 7. 8. System.out.printf("Študent: %s \n", zaposlenistudent1.tostring()); 9. System.out.printf("Zaslužek: %s \n", zaposlenistudent1.placa()); System.out.println(); System.out.printf("Finančnica: %s \n", zaposlitevfinance1.tostring()); 14. System.out.printf("Zaslužek: %s \n", zaposlitevfinance1.placa()); System.out.println(" "); // tabela dveh zaposlenih 19. Zaposleni[] zaposleni = new Zaposleni[2]; 20. // inicializacija dveh zaposlenih 21. zaposleni[0] = zaposlenistudent1; 22. zaposleni[1] = zaposlitevfinance1; // zanka za vse elemente tabele (elementi tabele so objekti izpeljanih razredov razreda Zaposleni) 25. for (Zaposleni zap: zaposleni) { 26. // izpis osnovnih podatkov zaposlenega 27. System.out.printf("Zaposleni: \n%s \n",zap.tostring()); 28. // izpis plače 29. System.out.printf("Zaslužek: %s \n", zap.placa()); 30. } // for 31. } // main } // DemoZaposleni Primer izvajanja: Študent: Andrej Novak Davčna številka: SI Število ur: 50, Zaslužek: Finančnica: Ana Kotnik Davčna številka: SI Osnovna plača: 1200, Zaslužek: Zaposleni: Andrej Novak Davčna številka: SI Število ur: 50, Zaslužek: Zaposleni: Ana Kotnik Davčna številka: SI Osnovna plača: 1200, Zaslužek: Stran 165 ŠC VELENJE

166 14.16 Vmesnik (angl. Interface) Večina programskih jezikov podpira večkratno dedovanje. Pri večkratnem dedovanju podrazred podeduje atribute in metode več kot enega nadrazreda. Podrazred v Javi lahko deduje samo od enega razreda, implementira pa lahko več vmesnikov. Vmesnik določa metode, ki jih implementira podrazred. Vmesnik določa način komunikacije (obnašanje podrazreda) z objekti izpeljanih razredov. Koncept vmesnika je podoben razredu s to razliko, da so vse metode abstraktne. Če vmesnik vsebuje atribute oz. lastnosti, potem so določeni z določilom static final. Sintaksa vmesnika: public interface Vmesnik { // statični atributi vmesnika // seznam metod vmesnika, glave metod brez določitve izvedbe } Zgled: public interface Vmesnik1 { // statični atributi vmesnika // seznam metod vmesnika, glave metod brez določitve izvedbe } public interface Vmesnik2 { // statični atributi vmesnika // seznam metod vmesnika, glave metod brez določitve izvedbe } public class RazredA { // atributi in metode razreda } public class RazredB extends RazredA implements Vmesnik1, Vmesnik2 { } // Razred RazredB deduje atribute in metode razreda RazredA ter implementira vmesnika Vmesnik1 in Vmesnik 2. Z vidika dedovanja RazredB: deduje atribute in metode razreda RazredA; lahko dodatno definira nove atribute in metode; lahko spremeni oz. redefinira dedovane metode. Podrazred B mora definirati vse metode vmesnikov Vmesnik1 in Vmesnik2. V podrazredu RazredB lahko uporabljamo statične spremenljivke, ki so določene v vmesniku Vmesnik1 ali Vmesnik2. Vmesnik uporabimo v primeru, ko vemo, katere operacije morajo vsebovati podrazredi in vsakemu podrazredu omogočimo, da določi obnašanje oz. kodo metode. Primer: Uporabimo vmesnik plačila z metodo za izračun zneska plačila. Razred račun vsebuje podatke o enem izdelku in metodo za izračunu zneska plačila. Podatki o izdelku so šifra izdelka, naziv izdelka, cena izdelka, prodana količina. Oglejmo si primer izračuna plače za zaposlene delavce. Osnovni razred zaposleni vsebuje atribute ime, priimek in davčno številko. Poleg osnovnih metod za določitev in dostop do vrednosti atributov vsebuje tudi abstraktno metodo za izračun plače. INFORMATIKA, Programiranje 1 in 2 Stran 166

167 Iz razreda zaposleni izpeljemo razreda zaposleni študent in zaposlitev uprava. Zaposleni študent vsebuje dodatna atributa za število opravljenih ur in bruto urno postavko. Bruto znesek plačila izračunamo s produktom urne postavke in števila opravljenih ur. Razred zaposlitev uprava vsebuje dodatne atribute število opravljenih ur, bruto znesek osnovne plače in bruto znesek dodatka. V konstruktorjih izpeljanih razredov uporabimo konstruktor osnovnega razreda. 1. // Placila.java; deklaracija vmesnika za plačila 2. public interface Placila { 3. // izračun zneska plačila brez implementacije 4. public double izracunajznesekplacila(); 5. } // vmesnik plačila 1. // razred račun 2. public class Racun implements Placila { 3. private String sifraizdelka; // šifra izdelka 4. private String nazivizdelka; // naziv izdelka 5. private double cenaizdelka; // cena izdelka z DDV 6. private double kolicina; // prodana količina // konstruktor, privzete vrednosti atributov 9. public Racun(String sifraizdelka, String nazivizdelka, double cenaizdelka, double kolicina) { 10. super(); 11. this.sifraizdelka = sifraizdelka; 12. this.nazivizdelka = nazivizdelka; 13. this.dolocicenaizdelka(cenaizdelka); // preveri in določi privzeto vrednost 14. this.dolocikolicina(kolicina); // preveri in določi privzeto vrednost 15. } // konstruktor Racun // vrne šifro izdelka 18. public String vrnisifraizdelka() { 19. return sifraizdelka; 20. } // // vrne naziv izdelka 23. public String vrninazivizdelka() { 24. return nazivizdelka; 25. } // vrninazivizdelka // vrne prodano količino 28. public double vrnikolicina() { 29. return kolicina; 30. } // vrnikolicina // vrne ceno izdelka z DDV 33. public double vrnicenaizdelka() { 34. return cenaizdelka; 35. } // vrnicenaizdelka // določi šifro izdelka 38. public void dolocisifraizdelka(string sifraizdelka) { 39. this.sifraizdelka = sifraizdelka; 40. } // dolocisifraizdelka // določi naziv izdelka Stran 167 ŠC VELENJE

168 43. public void dolocinazivizdelka(string nazivizdelka) { 44. this.nazivizdelka = nazivizdelka; 45. } // dolocinazivizdelka // določi ceno izdelka z DDV 48. public void dolocicenaizdelka(double cenaizdelka) { 49. // preverjanje cene izdelka 50. if ( cenaizdelka >= 0.0 ) 51. this.cenaizdelka = cenaizdelka; 52. else 53. throw new IllegalArgumentException("Cena izdelka mora biti večja ali enaka 0."); 54. } // dolocicenaizdelka // določi prodano količino 57. public void dolocikolicina(double kolicina) { 58. // preverjanje prodane količine 59. if (kolicina >= 0.0) 60. this.kolicina = kolicina; 61. else 62. throw new IllegalArgumentException("Količina mora biti večja ali enaka 0."); 63. } // dolocikolicina // redefinicija metode tostring; vrne besedilo vrednosti objekta 68. public String tostring() { 69. return String.format("Šifra izdelka: %s, naziv izdelka: %s \n prodajna cena: %f, količina: %f \n Znesek za plačilo: %f.", 70. this.vrnisifraizdelka(), this.vrninazivizdelka(), this.vrnicenaizdelka(), this.vrnikolicina(), this.izracunajznesekplacila() ); 71. } // izračun zneska plačila, definicija metode vmesnika 75. public double izracunajznesekplacila() { 76. return vrnicenaizdelka() * vrnikolicina(); 77. } // izracunajznesekplacila 78. } // razred račun 1. // razred zaposleni1 2. public abstract class Zaposleni1 { 3. private String ime; 4. private String priimek; 5. private String davcnastevilka; // konstruktor s tremi parametri 8. public Zaposleni1(String ime2, String priimek2, String davcnastevilka2){ 9. this.ime = ime2; 10. this.priimek = priimek2; 11. this.davcnastevilka = davcnastevilka2; 12. } // Zaposleni // vrne ime 15. public String vrniime() { 16. return ime; 17. } // vrniime INFORMATIKA, Programiranje 1 in 2 Stran 168

169 // določi ime 20. public void dolociime(string ime) { 21. this.ime = ime; 22. } // dolociime // vrne priimek 25. public String vrnipriimek() { 26. return priimek; 27. } // vrnipriimek // določi priimek 30. public void dolocipriimek(string priimek) { 31. this.priimek = priimek; 32. } // dolocipriimek // vrne davčno številko 35. public String vrnidavcnastevilka() { 36. return davcnastevilka; 37. } // določi davčno število 40. public void dolocidavcnastevilka(string davcnastevilka) { 41. this.davcnastevilka = davcnastevilka; 42. } // dolocidavcnastevilka // vrne besedilno predstavitev objekta 46. public String tostring() { 47. return String.format("%s %s\ndavčna številka: %s", this.vrniime(), this.vrnipriimek(), 48. this.vrnidavcnastevilka()); 49. } //tostring } // razred Zaposleni1 1. // razred zaposlenega v upravi ZaposlitevUprava1, implementacija vmesnika Placila 2. public class ZaposlitevUprava1 extends Zaposleni1 implements Placila { 3. private double steviloopravljenihur; // število opravljenih ur 4. private double osnovaplaca; // bruto znesek osnovne plače 5. private double dodatekplaca; // bruto znesek dodatka // inicializacija privzetih vrednosti 8. public ZaposlitevUprava1(String ime2, String priimek2, String davcnastevilka2, double steviloopravljenihur, 9. double osnovaplaca, double dodatekplaca) { 10. super(ime2, priimek2, davcnastevilka2); 11. dolocisteviloopravljenihur( steviloopravljenihur); 12. dolociosnovaplaca(osnovaplaca); 13. dolocidodatekplaca(dodatekplaca); 14. } // ZaposlitevUprava // vrne število opravljenih ur 17. public double vrnisteviloopravljenihur() { 18. return steviloopravljenihur; 19. } // vrnisteviloopravljenihur 20. Stran 169 ŠC VELENJE

170 21. // vrne znesek osnovne plače 22. public double vrniosnovaplaca() { 23. return osnovaplaca; 24. } // vrniosnovaplaca // vrne znesek dodatka 27. public double vrnidodatekplaca() { 28. return dodatekplaca; 29. } // vrnidodatekplaca // določi število opravljenih ur 32. public void dolocisteviloopravljenihur (double steviloopravljenihur) { 33. if (steviloopravljenihur >= 0) // preverjanje vrednosti parametra 34. this.steviloopravljenihur = steviloopravljenihur; 35. else 36. // izvršitev izjeme 37. throw new IllegalArgumentException("Število opravljenih ur mora biti večje ali enako 0."); 38. } // dolocisteviloopravljenihur // določi znesek osnovne plače 41. public void dolociosnovaplaca(double osnovaplaca) { 42. if (osnovaplaca>=0) // preverjanje vrednosti parametra 43. this.osnovaplaca = osnovaplaca; 44. else 45. // izvršitev izjeme 46. throw new IllegalArgumentException("Osnovna plača mora biti večja ali enaka 0."); 47. } // dolociosnovaplaca // določi znesek dodatka 50. public void dolocidodatekplaca(double dodatekplaca) { 51. if (dodatekplaca>=0) // preverjanje vrednosti parametra 52. this.dodatekplaca = dodatekplaca; 53. else 54. // izvršitev izjeme 55. throw new IllegalArgumentException("Dodatek k plači mora biti večji ali enak 0."); 56. } // dolocidodatekplaca // redefinicija metode tostring, vrne besedilno predstavitev objekta 60. public String tostring() { 61. return String.format("%s\nOsnovna plača: %f \ndodatek k plači: %f", super.tostring(), 62. this.vrniosnovaplaca(), this.vrnidodatekplaca()); 63. } // tostring // izračun zneska plačila, definicija metode vmesnika 67. public double izracunajznesekplacila() { 68. return this.vrniosnovaplaca() + this.vrnidodatekplaca(); // izračun zneska izplačila 69. } // izracunajznesekplacila } // razred ZaposlitevUprava1 1. // testni razred 2. public class DemoPlacila { public static void main(string[] args) { INFORMATIKA, Programiranje 1 in 2 Stran 170

171 5. // nov objekt razreda ZaposlitevUprava1 6. ZaposlitevUprava1 zaposlitevuprava = new ZaposlitevUprava1("Ana","Kotnik","SI ",174.0,1200.0, 100.0); 7. System.out.println(); 8. // izpis podatkov objekta zaposlenega v upravi 9. System.out.printf("Zaposleni v upravi: %s \n", zaposlitevuprava.tostring()); 10. // izpis zneska mesečnega izplačila 11. System.out.printf("Mesečno izplačilo: %f \n", zaposlitevuprava.izracunajznesekplacila()); 12. System.out.println(" "); // nov objekt razreda račun 15. Racun racun = new Racun(" ", "DETERGENT ZA PRANJE PERILA PERSIL SENSITIVE 40", 7.99, 2.0); 16. // izpis podatkov objekta računa 17. System.out.printf("Račun: \n%s\n", racun.tostring()); 18. System.out.println(); 19. System.out.printf("Znesek računa:%f \n", racun.izracunajznesekplacila()); 20. System.out.println(" "); } // main } // DemoPlacila Primer izvajanja: Zaposleni v upravi: Ana Kotnik Davčna številka: SI Osnovna plača: 1200, Dodatek k plači: 100, Mesečno izplačilo: 1300, Račun: Šifra izdelka: , naziv izdelka: DETERGENT ZA PRANJE PERILA PERSIL SENSITIVE 40 prodajna cena: 7,990000, količina: 2, Znesek za plačilo: 15, Znesek računa:15, Aplikacija za bankomat Bankomat, opis V naslednje primeru bomo uporabili objektni pristop za izdelavo programa, ki simulacijo delovanja bankomata. Razredni diagram Z orodjem UML Designer smo izdelali UML (angl. Unifield Modeling Language) razredni diagram, ki bo osnova za izdelavo programa. Stran 171 ŠC VELENJE

172 INFORMATIKA, Programiranje 1 in 2 Stran 172 Slika 46: Razredni diagram za bankomat

173 1. // razred bankomat, Bankomat.java 2. public class Bankomat { 3. private boolean prijavljenkomitent; //prijavljen komitent 4. private String stevilkabancnegaracuna; // številka bančnega računa 5. private Zaslon tzaslon; // zaslon 6. private Tipkovnica ttipkovnica; // tipkovnica 7. private OdprtinaPolog todprtinapolog; // odprtina gotovine 8. private PredalGotovina tpredalgotovina; // predala z gotovino 9. private ZbirkaPodatkovBanka tzbirkapodatkovbanka; // zbirka bančnih računov // možnosti menija 12. private static final int STANJE = 1; // stanje računa 13. private static final int DVIG = 2; // dvig z računa 14. private static final int POLOG = 3; // polog na račun 15. private static final int ODJAVA = 4; // odjava komitenta // konstruktor brez parametrov 18. public Bankomat() { 19. prijavljenkomitent = false; 20. stevilkabancnegaracuna = null; 21. tzaslon = new Zaslon(); 22. ttipkovnica = new Tipkovnica(); 23. todprtinapolog = new OdprtinaPolog(); 24. tpredalgotovina = new PredalGotovina(); 25. tzbirkapodatkovbanka = new ZbirkaPodatkovBanka(); 26. } // konstruktor // simulacija delovanja bankomata 29. public void delovanje(){ 30. while (true) 31. { 32. // prijava komitenta 33. while (! prijavljenkomitent) 34. { 35. tzaslon.izpisisporocilo("pozdravljeni na bankomatu XY..."); 36. prijavikomitenta(); 37. } // while 38. // izvršitev transakcij 39. izvajanjetransakcij(); 40. // konec aktivnosti komitenta na bankomatu 41. prijavljenkomitent = false; 42. stevilkabancnegaracuna = null; 43. tzaslon.izpisisporocilo("\nnasvidenje...\n"); 44. } // while delovanje bankomata 45. } // delovanje // izvršitev transakcij (stanje, dvig, polog) 48. private void izvajanjetransakcij() { 49. Transakcija ttransakcija = null; // transakcija ni določena 50. boolean odjavakomitenta = false; 51. // dokler se komitent ne odjavi 52. while (! odjavakomitenta) 53. { 54. // izbor aktivnosti oz transakcije Stran 173 ŠC VELENJE

174 55. int izboraktivnosti = izpisopcijmenija(); 56. // izvršitev ustrezne aktivnosti 57. switch (izboraktivnosti) 58. { 59. case STANJE: 60. case DVIG: 61. case POLOG: 62. ttransakcija = novatransakcija(izboraktivnosti); 63. ttransakcija.izvrsi(); 64. break; 65. case ODJAVA: 66. tzaslon.izpisisporocilo("\nodjava..."); 67. odjavakomitenta = true; 68. break; 69. default: 70. tzaslon.izpisisporocilo("\nneustrezna aktivnost."); 71. } // switch 72. } // while 73. } // izvajanjetransakcij // določi transakcijo glede na izbor aktivnosti 76. private Transakcija novatransakcija(int aktivnost) { 77. Transakcija novatransakcija = null; // objekt nove transakcije 78. switch ( aktivnost ) 79. { 80. case STANJE: 81. novatransakcija = new StanjeRacuna( stevilkabancnegaracuna, tzaslon, tzbirkapodatkovbanka ); 82. break; 83. case POLOG: 84. novatransakcija = new Polog(stevilkaBancnegaRacuna, tzaslon, tzbirkapodatkovbanka, ttipkovnica, todprtinapolog); 85. break; 86. case DVIG: 87. novatransakcija = new Dvig(stevilkaBancnegaRacuna, tzaslon, tzbirkapodatkovbanka, ttipkovnica, tpredalgotovina); 88. break; 89. } // switch 90. return novatransakcija; 91. } // novatransakcija // izpis seznama aktivnosti 94. private int izpisopcijmenija() 95. { 96. tzaslon.izpisisporocilo( "\nmožnosti:"); 97. tzaslon.izpisisporocilo( "\n1 - Stanje" ); 98. tzaslon.izpisisporocilo( "\n2 - Dvig" ); 99. tzaslon.izpisisporocilo( "\n3 - Polog" ); 100. tzaslon.izpisisporocilo( "\n4 - Odjava" ); 101. tzaslon.izpisisporocilo( "\nizbor: " ); 102. return ttipkovnica.vrnisteviloint(); // izbor komitenta 103. } // izpisopcijmenija // prijava komitenta 106. private void prijavikomitenta() { 107. tzaslon.izpisisporocilo("\nštevilka bančnega računa: "); INFORMATIKA, Programiranje 1 in 2 Stran 174

175 108. String tstevilkabancnegaracuna = ttipkovnica.vrnibesedilo(); 109. tzaslon.izpisisporocilo("pin številka: "); 110. String pin = ttipkovnica.vrnibesedilo(); 111. prijavljenkomitent = tzbirkapodatkovbanka.preveripinstevilko(tstevilkabancnegaracuna, pin); 112. if (prijavljenkomitent) 113. stevilkabancnegaracuna = tstevilkabancnegaracuna; // določimo številko bančnega računa 114. else 115. tzaslon.izpisisporocilo("\n Neveljavna številka računa ali pin številka.\n Poskusite ponovno s prijavo."); 116. } // prijavakomitent } // razred Bankomat 1. /* ZbirkaPodatkovBanka.java 2. * Predstavitev razreda zbirke podatkov osebnih računov. 3. * Predstavitev v tabeli; v nadaljevanju nadgradnja predstavitev v zbirki podatkov. */ 4. public class ZbirkaPodatkovBanka { 5. private BancniRacun[] tabbancniracuni; // tabela bančnih računov // konstruktor brez parametrov 8. public ZbirkaPodatkovBanka() { 9. this.tabbancniracuni = new BancniRacun[3]; // ustvarimo 3 testne bančne račune 10. tabbancniracuni[0] = new BancniRacun(" ", "1234",200.0); 11. tabbancniracuni[1] = new BancniRacun(" ", "2345",200.0); 12. tabbancniracuni[2] = new BancniRacun(" ", "3456",200.0); 13. } // konstruktor // vrne bančni račun z določeno številko računa 16. public BancniRacun vrnibancniracun(string tstevilkaracuna) { 17. for (int i=0; i<tabbancniracuni.length; i++) 18. if (tabbancniracuni[i].vrnistevilkaracuna().equalsignorecase(tstevilkaracuna) ) 19. return tabbancniracuni[i]; 20. return null; // ne obstaja račun s to številko 21. } // vrnibancniracun // preveri pin številko bančnega računa 24. public boolean preveripinstevilko(string tstevilkaracuna, String tpin) { 25. BancniRacun tbancniracun = vrnibancniracun(tstevilkaracuna); 26. if (tbancniracun!= null) // če obstaja račun s to številko preverimo pin 27. return tbancniracun.preveripin(tpin); 28. else 29. return false; // račun ne obstaja 30. } // preveripinstevilko // vrne stanje 33. public double vrnistanje(string tstevilkaracuna) { 34. return vrnibancniracun(tstevilkaracuna).vrnistanjeracuna(); 35. } // vrnistanje // vrne limit 38. public double vrnilimit(string tstevilkaracuna) { 39. return vrnibancniracun(tstevilkaracuna).vrnilimit(); 40. } // vrnilimit // vrne razpoložljivo stanje Stran 175 ŠC VELENJE

176 43. public double vrnirazpolozljivostanje(string tstevilkaracuna) { 44. return vrnibancniracun(tstevilkaracuna).vrnirazpolozljivostanje(); 45. } // vrnirazpolozljivostanje // polog na račun 48. public void polog(string tstevilkaracuna, double znesek) { 49. vrnibancniracun(tstevilkaracuna).polog(znesek); 50. } // polog // dvig z računa 53. public void dvig(string tstevilkaracuna, double znesek) { 54. vrnibancniracun(tstevilkaracuna).dvig(znesek); 55. } // polog 56. } // konec ZbirkaPodatkovBanka 1. /* BancniRacun.java 2. razred bančni račun */ 3. public class BancniRacun { 4. private String stevilkaracuna; // številka računa 5. private String pin; // pin številka 6. private double stanje; // stanje računa 7. private double limit; // limit računa // konstruktor; privzete vrednosti objekta 10. public BancniRacun(String stevilkaracuna1, String pin1, Double limit1) { 11. this.stevilkaracuna = stevilkaracuna1; 12. this.pin = pin1; 13. this.stanje = 0.0; // začetno stanje 14. dolocilimit(limit1); // določitev limita računa 15. } // preveri pin 18. public boolean preveripin(string vnospin) { 19. if (vnospin.comparetoignorecase(this.pin) == 0) // ujemanje nizov 20. return true; 21. else 22. return false; 23. } // preveripin // vrne stanje računa 26. public double vrnistanjeracuna() { 27. return stanje; 28. } // vrnistanjeracuna // vrne razpoložljivo stanje računa 31. public double vrnirazpolozljivostanje() { 32. return (stanje + limit); 33. } // razpolozljivostanje // vrne številko računa 36. public String vrnistevilkaracuna() { 37. return stevilkaracuna; 38. } // vrnistevilkaracuna // vrne limit INFORMATIKA, Programiranje 1 in 2 Stran 176

177 41. public Double vrnilimit() { 42. return limit; 43. } // vrnilimit // določi limit računa 46. public void dolocilimit(double limit1) { 47. if (limit1 >= 0) // preverjanje, limit >=0 48. this.limit = limit1; 49. else 50. throw new IllegalArgumentException("Limit računa mora biti večji ali enak nič."); 51. } // dolocilimit // polog na račun 54. public void polog(double znesek) { 55. // izračun stanja 56. this.stanje = this.stanje + znesek; 57. } // polog // dvig z računa 60. public void dvig(double znesek) { 61. // izračun stanja 62. this.stanje = this.stanje - znesek; 63. } // dvig } // konec razreda BancniRacun 1. // razred zaslon, Zaslon.java 2. public class Zaslon { // izpis sporočila na zaslon 5. public void izpisisporocilo(string sporocilo) { 6. System.out.print(sporocilo); 7. } // izpisisporocilo // prehod v novo vrstico 10. public void novavrstica(string sporocilo) { 11. System.out.println(); 12. } // novavrstica // izpis zneska na zaslon 15. public void izpisiznesek(double znesek) { 16. System.out.printf("%,.2f Eur", znesek); 17. } // izpisisporocilo } // konec razreda Zaslon 1. // razred PredalGotovina, PredalGotovina.java 2. public class PredalGotovina { 3. private final static int ZACETNO_STEVILO_BANKOVCEV_20 = 200; 4. private final static int ZACETNO_STEVILO_BANKOVCEV_10 = 200; 5. private final static int ZACETNO_STEVILO_BANKOVCEV_5 = 200; 6. private int stevilobankovcev20; //trenutno število bankovcev za 20 eurov 7. private int stevilobankovcev10; //trenutno število bankovcev za 10 eurov 8. private int stevilobankovcev5; //trenutno število bankovcev za 5 eurov Stran 177 ŠC VELENJE

178 // konstruktor brez parametrov 11. public PredalGotovina() { 12. // inicializacija atributov z vrednostmi konstant 13. this.stevilobankovcev20 = ZACETNO_STEVILO_BANKOVCEV_20; 14. this.stevilobankovcev10 = ZACETNO_STEVILO_BANKOVCEV_10; 15. this.stevilobankovcev5 = ZACETNO_STEVILO_BANKOVCEV_5; 16. } // PredalGotovina // vrne število bankovcev po 20 eurov 19. public int vrnistevilobankovcev20() { 20. return stevilobankovcev20; 21. } // vrnistevilobankovcev // vrne število bankovcev po 10 eurov 24. public int vrnistevilobankovcev10() { 25. return stevilobankovcev10; 26. } // vrnistevilobankovcev // vrne število bankovcev po 5 eurov 29. public int vrnistevilobankovcev5() { 30. return stevilobankovcev5; 31. } // vrnistevilobankovcev // določi število bankovcev po 20 eurov 34. public void dolocistevilobankovcev20(int stevilobankovcev20) { 35. this.stevilobankovcev20 = stevilobankovcev20; 36. } // dolocistevilobankovcev // določi število bankovcev po 10 eurov 39. public void dolocistevilobankovcev10(int stevilobankovcev10) { 40. this.stevilobankovcev10 = stevilobankovcev10; 41. } // dolocistevilobankovcev // določi število bankovcev po 5 eurov 44. public void dolocistevilobankovcev5(int stevilobankovcev5) { 45. this.stevilobankovcev5 = stevilobankovcev5; 46. } // dolocistevilobankovcev // preveri, če je dovolj gotovine v predalu 49. public boolean gotovinanavoljo(double znesekizdaje) { 50. // izračun zneska denarja v predalu 51. double znesekpredal = this.stevilobankovcev20 * this.stevilobankovcev10 * 10 + this.stevilobankovcev5 * 5 ; 53. // primerjava razpoložljivega denarja z zneskom zahtevane izdaje 54. if (znesekpredal < znesekizdaje) 55. return false; 56. else 57. return true; 58. } // gotovinanavoljo /* simulacija izdaje bankovcev 61. * znesek izdaje - večkratnik števila 5 */ 62. public void izdajbankovce(double znesekizdaje) { 63. // določitev števila bankovcev po 20 INFORMATIKA, Programiranje 1 in 2 Stran 178

179 64. int tstevilobankovcev20 = (int) znesekizdaje / 20; 65. if (this.stevilobankovcev20 >= tstevilobankovcev20 ) 66. { 67. this.stevilobankovcev20 = this.stevilobankovcev20 - tstevilobankovcev20; 68. znesekizdaje = znesekizdaje - tstevilobankovcev20*20; 69. } 70. // določitev števila bankovcev po int tstevilobankovcev10 = (int) znesekizdaje / 10; 72. if (this.stevilobankovcev10 >= tstevilobankovcev10 ) 73. { 74. this.stevilobankovcev10 = this.stevilobankovcev10 - tstevilobankovcev10; 75. znesekizdaje = znesekizdaje - tstevilobankovcev10*10; 76. } 77. // določitev števila bankovcev po int tstevilobankovcev5 = (int) znesekizdaje / 5; 79. if (this.stevilobankovcev5 >= tstevilobankovcev5 ) 80. { 81. this.stevilobankovcev5 = this.stevilobankovcev5 - tstevilobankovcev5; 82. znesekizdaje = znesekizdaje - tstevilobankovcev5*5; 83. } 84. } // izdajbankovce } // konec razred PredalGotovina 1. // razred odprtine za kuverte oz. ovojnice, OdprtinaPolog.java 2. public class OdprtinaPolog { 3. private boolean ovojnicavrezi; // stanje odprtine za kuverte public OdprtinaPolog() { 6. // privzeto je odprtina ovojnic prazna 7. this.ovojnicavrezi = false; 8. } // OdprtinaPolog public boolean vrniovojnicavrezi() { 11. this.ovojnicavrezi = true; // simulacija 12. return ovojnicavrezi; 13. } // vrniovojnicavrezi public void dolociovojnicavrezi(boolean ovojnicavrezi) { 16. this.ovojnicavrezi = ovojnicavrezi; 17. } // postaviovojnicavrezi } // konec razreda OdprtinaPolog 1. // razred tipkovnica. Tipkovnica.java 2. import java.util.scanner; public class Tipkovnica { 5. private Scanner vnos; // deklaracija objekta za vnos, razred Scanner // konstruktor ustvari objekt za vnos 8. public Tipkovnica() { 9. this.vnos = new Scanner (System.in); // ustvarimo objekt za vnos 10. } // Tipkovnica Stran 179 ŠC VELENJE

180 // vrne besedilno vrednost vnosa uporabnika 13. public String vrnibesedilo() { 14. return vnos.next(); 15. } // vrnibesedilovnos // vrne številčno vrednost vnosa uporabnika 18. public double vrnistevilodouble() { 19. return vnos.nextdouble(); 20. } // vrnistevilovnos // vrne številčno vrednost vnosa uporabnika 23. public int vrnisteviloint() { 24. return vnos.nextint(); 25. } // vrnistevilointvnos } // konec razreda Tipkovnica 1. /* Razred transakcija bankomata. Transakcija.java */ 2. public abstract class Transakcija { 3. private String stevilkaracuna; // številka bančnega računa 4. private Zaslon zaslon; // zaslon bankomata 5. private ZbirkaPodatkovBanka zbirkapodatkovbanka; // zbirka podatkov bančnih računov // konstruktor, inicializacija 8. public Transakcija(String stevilkaracuna, Zaslon zaslon, ZbirkaPodatkovBanka zbirkapodatkov) { 9. this.stevilkaracuna = stevilkaracuna; 10. this.zaslon = zaslon; 11. this.zbirkapodatkovbanka = zbirkapodatkov; 12. } // Transaction // vrne številko bančnega računa 15. public String vrnistevilkoracuna() { 16. return stevilkaracuna; 17. } // vrnistevilkaracuna // vrne objekt razreda Zaslon 20. public Zaslon vrnizaslon() { 21. return zaslon; 22. } // vrnizaslon public ZbirkaPodatkovBanka vrnizbirkapodatkovbanka() { 25. return zbirkapodatkovbanka; 26. } /* Abstraktna metoda za izvršitev transakcije. 29. * Vsebina določena v podrazredih. */ 30. public abstract void izvrsi() ; } // konec razreda Transakcija 1. /* Razred StanjeRacuna, poizvedbe stanja bančnega računa, Stanje.java */ 2. public class StanjeRacuna extends Transakcija { 3. INFORMATIKA, Programiranje 1 in 2 Stran 180

181 4. // konstruktor StanjeRacuna 5. public StanjeRacuna(String stevilkaracuna1, Zaslon zaslon1, ZbirkaPodatkovBanka zbirkapodatkov1) { 6. // klic konstruktorja nadrazreda 7. super(stevilkaracuna1, zaslon1, zbirkapodatkov1); 8. } // konstruktor StanjeRacuna public void izvrsi() { 13. ZbirkaPodatkovBanka tzbirkapodatkovbanka = vrnizbirkapodatkovbanka(); 14. Zaslon tzaslon = vrnizaslon(); 15. // stanje računa 16. double tstanjeracuna = tzbirkapodatkovbanka.vrnistanje(vrnistevilkoracuna()); 17. double trazpolozljivostanje = tzbirkapodatkovbanka.vrnirazpolozljivostanje(vrnistevilkoracuna()); 18. // izpis informacij na zaslon 19. tzaslon.izpisisporocilo("\ninformacije bančnega računa."); 20. tzaslon.izpisisporocilo("\nstanje: "); 21. tzaslon.izpisiznesek(tstanjeracuna); 22. tzaslon.izpisisporocilo("\nrazpoložljivo stanje: "); 23. tzaslon.izpisiznesek(trazpolozljivostanje); 24. tzaslon.novavrstica(null); 25. } // izvedi } // konec razreda StanjeRacuna 1. // razred polog, Polog.java 2. public class Polog extends Transakcija { 3. private double znesekpolog; // znesek pologa 4. private Tipkovnica ttipkovnica; // objekt tipkovnice 5. private OdprtinaPolog todprtinapolog; // objekt reža za kuverto // konstruktor 9. public Polog(String stevilkaracuna1, Zaslon zaslon1, ZbirkaPodatkovBanka zbirkapodatkov1, Tipkovnica ttipkovnica1, OdprtinaPolog todprtinapolog1) { 10. super(stevilkaracuna1, zaslon1, zbirkapodatkov1); 11. this.ttipkovnica = ttipkovnica1; 12. this.todprtinapolog = todprtinapolog1; 13. } // konstruktor public void izvrsi() { 19. // določitev referenc na objekte 20. ZbirkaPodatkovBanka tzbirkapodatkovbanka = vrnizbirkapodatkovbanka(); 21. Zaslon tzaslon = vrnizaslon(); 22. znesekpolog = vrniznesekpologa(); 23. if (znesekpolog > 0) 24. { 25. tzaslon.izpisisporocilo("\nv ovojnico vstavite znesek pologa v vrednosti "); 26. tzaslon.izpisiznesek(znesekpolog); 27. tzaslon.izpisisporocilo("."); 28. boolean ovojnicaoddana = todprtinapolog.vrniovojnicavrezi(); Stran 181 ŠC VELENJE

182 29. if (ovojnicaoddana) 30. { 31. tzaslon.izpisisporocilo("\ngotovina pologa je sprejeta v bankomat."); 32. tzaslon.izpisisporocilo("\nstanje na računu bo osveženo po štetju denarja..."); 33. tzbirkapodatkovbanka.polog(vrnistevilkoracuna(), znesekpolog); 34. } else 35. { 36. tzaslon.izpisisporocilo("\novojnica ni bila oddana."); 37. tzaslon.izpisisporocilo("\ntransakcija je preklicana."); 38. } // if ovojnicaoddana 39. } else // znesekpolog == { 41. tzaslon.izpisisporocilo("\ntransakcija je preklicana."); 42. } // if 43. } // izvedi private double vrniznesekpologa() { 46. Zaslon tzaslon = vrnizaslon(); 47. // obvestilo za vnos 48. tzaslon.izpisisporocilo("\nznesek pologa: <0 - preklic pologa>"); 49. double znesekpolog = ttipkovnica.vrnistevilodouble(); 50. return znesekpolog; 51. } // vrniznesekpologa } // konec razred Polog 1. /* Razred Dvig, dvig denarja na bankomatu, Dvig.java */ 2. public class Dvig extends Transakcija { 3. private double znesekdvig; // znesek dviga 4. private Tipkovnica ttipkovnica; // objekt tipkovnice 5. private PredalGotovina tpredalgotovina; // objekt za izdajo gotovine // konstruktor Dvig 8. public Dvig(String stevilkaracuna, Zaslon zaslon, ZbirkaPodatkovBanka zbirkapodatkov, 9. Tipkovnica ttipkovnica1, PredalGotovina tpredalgotovina1) { 10. // klic konstruktorja razreda Transakcija 11. super(stevilkaracuna, zaslon, zbirkapodatkov); 12. // inicializacija atributov razreda Dvig 13. this.ttipkovnica = ttipkovnica1; 14. this.tpredalgotovina = tpredalgotovina1; 15. } // Dvig public void izvrsi() { 19. boolean izdajagotovine = false; // zastavica izdaja gotovine 20. double razpolozljivostanjebancniracun; // razpoložljivo stanje bančnega računa 21. // določitev referenc na objekte 22. ZbirkaPodatkovBanka tzbirkapodatkovbanka = vrnizbirkapodatkovbanka(); 23. Zaslon tzaslon = vrnizaslon(); 24. // zanka dokler ni izdana gotovina 25. do 26. { 27. znesekdvig = meniznesekdvig(); 28. if (znesekdvig > 0 ) 29. { INFORMATIKA, Programiranje 1 in 2 Stran 182

183 30. // razpoložljivo stanje bančnega računa 31. razpolozljivostanjebancniracun = tzbirkapodatkovbanka.vrnirazpolozljivostanje (vrnistevilkoracuna()); 32. // preverjanje, če ima uporabnik zadostno stanje denarja na računu 33. if (znesekdvig <= razpolozljivostanjebancniracun) 34. { 35. // ima bankomat dovolj denarja 36. if (tpredalgotovina.gotovinanavoljo(znesekdvig)) 37. { 38. // sprememba stanja računa za znesek dviga 39. tzbirkapodatkovbanka.dvig(vrnistevilkoracuna(), znesekdvig); 40. // simulacija izdaje bankovcev iz predala 41. tpredalgotovina.izdajbankovce(znesekdvig); 42. tzaslon.izpisisporocilo("\nvzemite denar.\n" ); 43. izdajagotovine = true; 44. } 45. else // v bankomatu ni dovolj denarja 46. { 47. tzaslon.izpisisporocilo("\nv bankomatu ni dovolj denarja." ); 48. tzaslon.izpisisporocilo("\nizberite manjši znesek dviga." ); 49. izdajagotovine = false; 50. } // if 51. } // konec if 52. else // znesekdvig > razpolozljivostanjebancniracun 53. { 54. tzaslon.izpisisporocilo("\nna računu ni dovolj denarja." ); 55. izdajagotovine = false; 56. } // konec if } else // znesekdvig <=0 59. { 60. // preklic, izdaja gotovine ni potrebna 61. izdajagotovine = true; 62. } // konec if 63. } while (! izdajagotovine); 64. } // izvedi // izbor, znesek dvig 67. private int meniznesekdvig() { 68. Zaslon tzaslon = vrnizaslon(); 69. // opcije, dvig, znesek 70. int [] tabelaizborzneska = {0,10,15,20,25,30,40,50,70,90}; 71. int izbor = 0; 72. // meni 73. boolean preklic = false; 74. while (!preklic && izbor == 0) 75. { 76. tzaslon.izpisisporocilo("izbor zneska:\n"); 77. tzaslon.izpisisporocilo("1\t \t 10 eurov \n"); 78. tzaslon.izpisisporocilo("2\t \t 15 eurov \n"); 79. tzaslon.izpisisporocilo("3\t \t 20 eurov \n"); 80. tzaslon.izpisisporocilo("4\t \t 25 eurov \n"); 81. tzaslon.izpisisporocilo("5\t \t 30 eurov \n"); 82. tzaslon.izpisisporocilo("6\t \t 40 eurov \n"); Stran 183 ŠC VELENJE

184 83. tzaslon.izpisisporocilo("7\t \t 50 eurov \n"); 84. tzaslon.izpisisporocilo("8\t \t 70 eurov \n"); 85. tzaslon.izpisisporocilo("9\t \t 90 eurov \n"); 86. tzaslon.izpisisporocilo("10\t \t Preklic dviga \n"); 87. tzaslon.izpisisporocilo("izbor: "); 88. int izborzneska = ttipkovnica.vrnisteviloint(); 89. switch (izborzneska) 90. { 91. case 1: case 2: case 3: case 4: case 5: 92. case 6: case 7: case 8: case 9: 93. izbor = tabelaizborzneska[izborzneska]; 94. break; 95. case 10: 96. preklic = true; 97. break; 98. default: 99. tzaslon.izpisisporocilo("nepravilen vnos. Poskusite znova. \n\n"); 100. } 101. } 102. return izbor; 103. } // meniznesekdvig } // konec razreda Dvig Primer izvajanja: Pozdravljeni na bankomatu banke XY... Številka bančnega računa: 555 Pin številka: 555 Neveljavna številka računa ali pin številka. Poskusite ponovno s prijavo.pozdravljeni na bankomatu banke XY... Številka bančnega računa: Pin številka: 1234 Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: 0,00 Eur Razpoložljivo stanje: 200,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 3 Znesek pologa: <0 - preklic pologa>50 V ovojnico vstavite znesek pologa v vrednosti 50,00 Eur. INFORMATIKA, Programiranje 1 in 2 Stran 184

185 Gotovina pologa je sprejeta v bankomat. Stanje na računu bo osveženo po štetju denarja... Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: 50,00 Eur Razpoložljivo stanje: 250,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 2 Izbor zneska: 1 10 eurov 2 15 eurov 3 20 eurov 4 25 eurov 5 30 eurov 6 40 eurov 7 50 eurov 8 70 eurov 9 90 eurov 10 Preklic dviga Izbor: 9 Vzemite denar. Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: -40,00 Eur Razpoložljivo stanje: 160,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 2 Izbor zneska: 1 10 eurov 2 15 eurov 3 20 eurov Stran 185 ŠC VELENJE

186 4 25 eurov 5 30 eurov 6 40 eurov 7 50 eurov 8 70 eurov 9 90 eurov 10 Preklic dviga Izbor: 11 Nepravilen vnos. Poskusite znova. Izbor zneska: 1 10 eurov 2 15 eurov 3 20 eurov 4 25 eurov 5 30 eurov 6 40 eurov 7 50 eurov 8 70 eurov 9 90 eurov 10 Preklic dviga Izbor: 9 Vzemite denar. Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: -130,00 Eur Razpoložljivo stanje: 70,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 2 Izbor zneska: 1 10 eurov 2 15 eurov 3 20 eurov 4 25 eurov 5 30 eurov 6 40 eurov 7 50 eurov 8 70 eurov 9 90 eurov 10 Preklic dviga Izbor: 9 Na računu ni dovolj denarja.izbor zneska: INFORMATIKA, Programiranje 1 in 2 Stran 186

187 1 10 eurov 2 15 eurov 3 20 eurov 4 25 eurov 5 30 eurov 6 40 eurov 7 50 eurov 8 70 eurov 9 90 eurov 10 Preklic dviga Izbor: 10 Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: -130,00 Eur Razpoložljivo stanje: 70,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 4 Odjava... Nasvidenje... Pozdravljeni na bankomatu banke XY... Številka bančnega računa: Pin številka: 2345 Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: 0,00 Eur Razpoložljivo stanje: 200,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 3 Znesek pologa: <0 - preklic pologa>60 Stran 187 ŠC VELENJE

188 V ovojnico vstavite znesek pologa v vrednosti 60,00 Eur. Gotovina pologa je sprejeta v bankomat. Stanje na računu bo osveženo po štetju denarja... Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: 60,00 Eur Razpoložljivo stanje: 260,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 4 Odjava... Nasvidenje... Pozdravljeni na bankomatu banke XY... Številka bančnega računa: Pin številka: 1234 Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 Informacije bančnega računa. Stanje: -130,00 Eur Razpoložljivo stanje: 70,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 4 Odjava... Nasvidenje... Pozdravljeni na bankomatu banke XY... Številka bančnega računa: Pin številka: 2345 Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 1 INFORMATIKA, Programiranje 1 in 2 Stran 188

189 Informacije bančnega računa. Stanje: 60,00 Eur Razpoložljivo stanje: 260,00 Eur Možnosti: 1 - Stanje 2 - Dvig 3 - Polog 4 - Odjava Izbor: 4 Odjava... Nasvidenje... Pozdravljeni na bankomatu banke XY... Številka bančnega računa: Stran 189 ŠC VELENJE

190 15 GRAFIČNI VMESNIK (SWING KOMPONENTE)) 15.1 Grafika (awt, swing) Grafični vmesnik (angl. Graphical User Interface (GUI)) predstavlja uporabniku prijazen način dela s programom. Grafični vmesniki so izdelani s komponentami grafičnega vmesnika. Pogosto jih imenujemo gradniki oz. komponente (angl. widget, control). Grafične komponente so objekti s katerimi uporabniki komunicirajo s programi. Za izdelavo grafičnega vmesnika uporabljamo dve knjižnici razredov: 1. AWT (Abstract Window Toolkit) o začetna knjižnica grafičnega vmesnika v Javi; o realizacija komponent je prepuščena ciljni platformi (različen izgled na različnih platformah). 2. Swing o novejša knjižnica z večjim številom komponent grafičnega vmesnika; o enostavnejša izdelava grafičnih vmesnikov z enakim videzom na vseh platformah. Swing paket omogoča izdelavo všečnega videza grafičnega vmesnika programa. Swing API vsebuje različne razrede za izdelavo komponent grafičnega vmesnika. Veliko orodij ima vgrajeno podporo za izdelavo grafičnih vmesnikov. IDE orodja podpirajo ustvarjanje programske kode vmesnika Pogovorna okna Do sedaj smo v primerih uporabljali izhodno okno za izpis obvestil in informacij. V programih pogosto izpisujemo obvestila v pogovornih oknih. Razred JOptionPane iz paketa javax.swing vsebuje metode za izpis sporočil v pogovornih oknih. Paket javax.swing vsebuje razrede grafičnega vmesnika (angl. graphical user interfaces - GUIs). GUI komponente olajšajo izdelavo programskih vmesnikov (vnosne maske, prikazi oz. izpisi...). import javax.swing.joptionpane; Izpis obvestila Metodo showmessagedialog uporabljamo za izpis obvestila v pogovornem oknu. Sintaksa: JOptionPane.showMessageDialog(null, String1); JOptionPane.showMessageDialog(null, String1, String2, Dialog type); Slika 47: Pogovorno okno za izpis obvestila INFORMATIKA, Programiranje 1 in 2 Stran 190

191 Zgled: JOptionPane.showMessageDialog(null, "Sporočilo v pogovornem oknu.\n (Uporaba razreda JOptionPane.)","Sporočilo", JOptionPane.INFORMATION_MESSAGE); Parameter Prvi parameter Drugi parameter Tretji parameter Četrti parameter Opis Komponenta znotraj katere se prikaže pogovorno okno. Vrednost null predstavlja privzeti okvir (pogovorno okno je na sredini zaslona). Besedilo sporočila. Naslov pogovornega okna. Vrsta sporočila: JOptionPane.ERROR_MESSAGE - napaka, JOptionPane.INFORMATION_MESSAGE - informacija, JOptionPane.WARNING_MESSAGE - opozorilo, JOptionPane.QUESTION_MESSAGE - vprašanje, JOptionPane.PLAIN_MESSAGE - besedilo. 1. /* najava uporabe razreda JOptionPane iz paketa javax.swing 2. paket javax.swing vsebuje razrede grafičnega vmesnika (ang. graphical user interfaces GUIs) */ 3. import javax.swing.joptionpane; public class P2_4_okna 6. { 7. public static void main(string[] args) 8. { 9. // z metodo showmessagedialog razreda JOptionPane izpišemo sporočilo v pogovornem oknu 10. JOptionPane.showMessageDialog(null, "Sporočilo v pogovornem oknu.\n 11. (Uporaba razreda JOptionPane.)","Sporočilo", JOptionPane.INFORMATION_MESSAGE); 12. } // konec metode 13. } // konec razreda Slika 48: Sporočilo Vnos vrednosti Metodo showinputdialog uporabimo za vnos vrednosti v pogovornem oknu. Ne glede na vnos uporabnika je rezultat vedno besedilo (String). Sintaksa: JOptionPane.showInputDialog(String 1) JOptionPane.showInputDialog(null, String 1) JOptionPane.showInputDialog(null, String 1, String 2, Dialog Type) Stran 191 ŠC VELENJE

192 Slika 49: Pogovorno okno za vnos JOptionPane.showInputDialog("Ime in priimek: ); JOptionPane.showInputDialog(null, "Ime in priimek: ); JOptionPane.showInputDialog(null, "Ime in priimek, "Obrazec, JOptionPane.INFORMATION_MESSAGE); Zgled: String imepriimek = JOptionPane.showInputDialog(null, "Ime in priimek, "Obrazec, JOptionPane.INFORMATION_MESSAGE); String vnosuporabnika = JOptionPane.showInputDialog(null, "Vnos", "Naslov", JOptionPane.INFORMATION_MESSAGE); Besedilno vrednost vnosa pretvorimo v število z metodama Integer.parseInt in Double.parseDouble: int int celostevilo = Integer.parseInt(vnosUporabnika); double double realnostevilo = Double.parseDouble(vnosUporabnika); Primer 1: 1. // najava uporabe razreda JOptionPane iz paketa javax.swing 2. import javax.swing.joptionpane; public class P2_5Okna_2 { public static void main(string[] args) 7. { 8. //z metodo showinputdialog razreda JOptionPane v pogovornem oknu 9. //izvedemo vnos vrednosti oz. branje 10. String tizpit = JOptionPane.showInputDialog("Vpišite predmet: "); 11. // v pogovornem oknu izpišemo vneseno informacijo 12. JOptionPane.showMessageDialog(null, "Naziv predmeta: " + tizpit, 13. "Sporočilo", JOptionPane.INFORMATION_MESSAGE); 14. } // konec metode 15. } // konec razreda Slika 50: Vnos Slika 51: Sporočilo INFORMATIKA, Programiranje 1 in 2 Stran 192

193 Primer 2: String ime_priimek; // ime in priimek ime_priimek = JOptionPane.showInputDialog("Ime in priimek"); String besedilo_stevilo; //vnos v besedilno spremenljivko int stevilo_studentov; // celoštevilčna spremenljivka //vnos in pretvorba v celo število besedilo_stevilo = JOptionPane.showInputDialog( "Število študentov" ); stevilo_studentov = Integer.parseInt( besedilo_stevilo ); Seštevanje dveh števil Izdelajmo primer za seštevanje dveh realnih števil. Vnos števil in izpis rezultata izvršimo s pogovornimi okni. 1. // seštevanje dveh realnih števil z uporabo pogovornih oken 2. import javax.swing.joptionpane; 3. public class SestevanjePO { public static void main(string[] args) { 6. // vnos dveh števil v objekta; besedilna vrednost 7. String prvostevilo = JOptionPane.showInputDialog("Prvo število: "); 8. String drugostevilo = JOptionPane.showInputDialog("Drugo število: "); 9. // pretvorba v realno število (double) 10. double stevilo1 = Double.parseDouble(prvoStevilo); 11. double stevilo2 = Double.parseDouble(drugoStevilo); 12. // izračun 13. double vsota = stevilo1 + stevilo2; 14. // sporočilo 15. String obvestilovsota = "Vsota števil " +prvostevilo + "+" + drugostevilo+"=" +vsota; 16. // izpis v pogovornem oknu 17. JOptionPane.showMessageDialog(null, obvestilovsota, "Vsota", JOptionPane.INFORMATION_MESSAGE); 18. } // main 19. } // SestevanjePO V 7. in 8. vrstici smo deklarirali besedilni spremenljivki v kateri shranimo rezultat klica statične metode showinputdialog. Za izračun vsote pretvorimo besedilni vrednosti števil v števila tipa double. Pretvorbo izvršimo s klicem statične metode parsedouble razreda Double. V vrstici 15 določimo sporočilo obvestila, ki ga v statični metodi showmessagedialog razreda JOptionPane prikažemo v modalnem oknu. Primer izvajanja: Slika 52: Vnos števila Stran 193 ŠC VELENJE

194 Slika 53: Vnos števila Slika 54: Izpis izračuna 15.3 Okno (JFrame) Hiearhija osnovnih razredov GUI Slika 55: Hiearhija osnovnih razredov GUI Vsi razredi so izpeljani iz razreda Object. Razred Component predstavlja objekte z visualno predstavitvijo, ki jih prikažemo na zaslonu in za delo uporabnika s programom. Razred Component (package java.awt) je osnovni razred za določitev skupnih značilnosti grafičnih komponent v paketih java.awt in javax.swing. Objekt razreda Container (package java.awt) vsebuje komponento z možnostjo vsebnika za vstavljanje in razporejanje elementov vmesnika. INFORMATIKA, Programiranje 1 in 2 Stran 194

195 Container Metoda Container getcontentpane () void setcontentpane(container c) public void setlayout(layoutmanager razporeditev) public void add(component komponenta) public void add(component komponenta, int polozaj) Za vsebnik (Container) vrne referenco na objekt razreda ContentPane. Vsebniku določi ContentPane vrednost. Določi način razporeditve. AWT & Swing: FlowLayout, GridLayout, BorderLayout Samo Swing: BoxLayout Doda komponento v vsebnik. Doda komponento v vsebnik in določi položaj. Položaj je vrednost BorderLayout konstante. Objekt razreda Windows predstavlja programsko okno (z obrobo, naslovno vrstico, kontrolnimi gumbi...). Objekt razreda Frame predstavlja programsko okno za grafične aplikacije v Javi. JFrame predstavlja swing verzijo Frame razreda. Večina swing aplikacij vsebuje vsaj en objekt JFrame. Razred JComponent (package javax.swing) je podrazred razreda Container. JComponent je osnovni razred vseh Swing komponent (razen JFrame) in določa skupne lastnosti in obnašanje gradnikov. Ker je razred JComponent naslednik razreda Container, so vse Swing komponente vsebniki, v katere lahko vstavljamo oz. razporejamo komponente vmesnika. Layout Manager Konstruktor FlowLayout( ) FlowLayout( int poravnava ) GridLayout( ) Opis Razporeditev v vrstici z leve proti desni. FlowLayout konstante poravnave: FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT setlayout( new FlowLayout( ) ); setlayout( new FlowLayout( FlowLayout.RIGHT ) ); Mrežna razporeditev. GridLayout( int vrstice, int stolpci ) BorderLayout( ) Mrežna razporeditev z določenim številom vrstic in stolpcev. ena izmed vrednosti števila vrstic in stolpcev je lahko 0; vendar ne obe hkrati. setlayout( new GridLayout( ) ); setlayout( new GridLayout( 3, 4 ) ); Razporeditev v pet področij (North, South, West, East in Center). BorderLayout konstante: BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST, BorderLayout.CENTER BoxLayout( Container Stran 195 target, setlayout( new BorderLayout( ) ); Razporeditev v izbrani osi. BoxLayout konstante: BoxLayout.X_AXIS, ŠC VELENJE

196 int axis) BoxLayout.Y_AXIS JPanel panel = new JPanel( ); panel.setlayout( new BoxLayout( panel, BoxLayout.Y_AXIS ) ); setlayout( new BoxLayout( this, X_AXIS) ); Prvi argument metode BoxLayout je referenca objekta Swing Container. Objekt JPanel uporabljamo za določitev razporeditve komponent v oknu. Na ploščo razporedimo gradnike in nato ploščo vstavimo v okno. Objekt JLabel predstavlja oznako z besedilom ali sliko s besedilom. Ustvarjanje okna z besedilom Osnovno okno je objekt razreda JFrame. JFrame je razširitev razreda Frame, ki obstaja v paketu AWT. Osnovno okno ustvari okenski sistem ciljne platforme. Objekt JFrame je vsebnik (angl. Container), ki lahko vsebuje gradnike uporabniškega vmesnika. Konstruktor Opis JFrame ( ) Ustvari novo okno brez naslova. JFrame (String naslov) Ustvari novo okno z določenim naslovom. Metoda void add (Component komponenta) Doda komponento v okno. JMenuBar getjmenubar ( ) Vrne objekt menija okna. void pack ( ) Prilagodi velikost okna glede na prileganje vstavljenih komponent. void remove (Component komponenta) Odstrani komponento iz okna. void setdefaultcloseoperation Določi aktivnost, ki se izvrši, ko uporabnik zapre okno. Običajno JFrame.EXIT_ON_CLOSE. void seticonimage (Icon slika) Določi ikono okna. void setlayout (LayoutManager Določi objekt razporeditve komponent okna. razporeditev) Privzeta je BorderLayout razporeditev. void setlocation (int x, int y) Določi položaj oz. lokacijo levega zgornjega vogala. Privzeto 0,0. void setlocationrelativeto (Component komponenta) Določi položaj okna relativno na izbrano komponento. Vrednost parametra null postavi okno na sredino zaslona. void setresizeable Določi možnost spreminjanja velikosti. (boolean value) void setsize (int sirina, int visina) Določi velikost okna. void setjmenubar(jmenubarmenu) Določi meni okna. void settitle(string naslov) Določi naslov okna. void setvisible(boolean prikaziskrij) Prikaži ali skrij okno. Program, ki uporablja okna vsebuje: napoved uporabe paketa Swing (import javax.swing.*;). ustvarjanje objekta razreda JFrame: JFrame okno=new JFrame(); prikaz okna. INFORMATIKA, Programiranje 1 in 2 Stran 196

197 Običajno iz razreda JFrame izpeljemo podrazred, ki natančneje definira okno. V konstruktorju izpeljanega razreda določimo naslov, lego, velikost, spreminjanje velikosti itd. Z metodo void setdefaultcloseoperation(int operacija) določimo operacijo, ki se izvede ob zapiranju okna. Operacijo določimo z uporabo konstant: JFrame.EXIT_ON_CLOSE: Izhod iz programa z exit metodo (zapre okna programa). WindowConstants.DO_NOTHING_ON_CLOSE: Ne naredi nič. WindowConstants.HIDE_ON_CLOSE (privzeto): Samodejno zapre okno, program teče naprej. WindowConstants.DISPOSE_ON_CLOSE: Zapre okno in sprosti objekt okna (JFrame). Okno z besedilom lahko ustvarimo na dva načina. Prvi način je, da uporabimo objektno spremenljivko razreda JFrame. Oglejmo si primer ustvarjanja okna z uporabo objektne spremenljivke JFrame. Oknu določimo velikost, naslov in lokacijo. Primer: 1. // JFrame1.java 2. // najava uporabe razredov JFrame in Point 3. import java.awt.point; 4. import javax.swing.jframe; public class JFrame1 { 7. public static void main(string[] args) { 8. // ustvarimo objekt razredajframe 9. JFrame okno = new JFrame(); 10. // določimo velikost 600x okno.setsize(600, 200); 12. // zapiranje okna - izhod iz programa 13. okno.setdefaultcloseoperation(jframe.exit_on_close); 14. // določimo naslov okna 15. okno.settitle("primer okna"); 16. // prikažemo okno 17. okno.setvisible(true); 18. // položaj levega zgornjega roba okna 200, okno.setlocation(200, 100); 20. } // main } // konec razreda JFrame1 Izvajanje: Slika 56: Osnovno okno Stran 197 ŠC VELENJE

198 Drugi način ustvarjanja okna je, da iz razreda JFrame izpeljemo nov razred in mu v konstruktorju določimo privzete lastnosti okna. Primer boljšega ustvarjanja. 1. // OknoJFrame.java 2. import javax.swing.jframe; public class OknoJFrame extends JFrame { 5. public OknoJFrame() { 6. // velikost 7. setsize(600, 200); 8. // zapiranje okna - izhod iz programa 9. setdefaultcloseoperation(jframe.exit_on_close); 10. // določimo naslov okna 11. settitle("primer okna"); 12. // prikažemo okno 13. setvisible(true); 14. // položaj levega zgornjega roba okna 200, setlocation(200, 100); 16. } // konstruktor 17. } // razred OknoJFrame 1. // DemoOknoJFrame.java 2. public class DemoOknoJFrame { public static void main(string[] args) { 5. OknoJFrame okno = new OknoJFrame(); 6. } // main 7. } // DemoOknoJFrame Oglejmo si še primer določitve ikone in postavitve okna na sredino zaslona. 1. // Okno2JFrame.java 2. import java.awt.dimension; 3. import java.awt.image; 4. import java.awt.toolkit; 5. import javax.swing.imageicon; 6. import javax.swing.jframe; public class Okno2JFrame extends JFrame { public Okno2JFrame() { 11. // velikost okna 12. setsize(400, 200); 13. // prikažemo okno 14. setvisible(true); 15. // določimo naslov okna 16. settitle("naslov okna"); // ustvarimo objekt ikone - "ok.png" 19. ImageIcon logoikona = new ImageIcon("E:\\Users\\Srečko\\workspace2015\\vaje\\src\\ek.png"); 20. // v objekt image shranimo ikono 21. Image logo = logoikona.getimage(); // getimage vrne objekt slike 22. seticonimage(logo); // določimo ikono 23. setresizable(false); // onemogočimo spreminjanje velikosti 24. this.setlocationrelativeto(null); // postavitev okna na sredino zaslona 25. // zapiranje okna - izhod iz programa INFORMATIKA, Programiranje 1 in 2 Stran 198

199 26. setdefaultcloseoperation(jframe.exit_on_close); 27. } // konstruktor 28. } // razred Okno2JFrame 1. // DemoOkno2JFrame.java 2. public class DemoOkno2JFrame { 3. public static void main(string[] args) { 4. Okno2JFrame okno2 = new Okno2JFrame(); 5. } // main 6. } // DemoOkno2JFrame Izvajanje (okno na sredini zaslona): Slika 57: Okno z naslovom in ikono // daljši način postavitve okna na sredino zaslona Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); // širina okna int sirina = getsize().width; // višina okna int visina = getsize().height; // izračunamo položaj postavitve okna na sredino zaslona int x = (dim.width - sirina) / 2; int y = (dim.height - visina) / 2; // okno premaknemo na sredino this.setlocation(x, y); 15.4 Plošča (JPanel) in oznaka (JLabel) Objekt razreda JPanel predstavlja vsebnik v katerega razporedimo skupino komponent. Običajno skupino komponent najprej vstavimo oz. razporedimo v ploščo (objekt JPanel) in nato ploščo vstavimo v okno (objekt JFrame). Možno je tudi, da komponente vstavimo direktno v okno. Dobra praksa je, da vedno uporabimo ploščo in njo vstavimo v okno. Konstruktor JPanel () JPanel (boolean isdoublebuffered) JPanel (LayoutManager razporeditev) Metoda void add (Component komponenta) Stran 199 Opis Ustvari novo ploščo. Ustvari novo ploščo. Če je parameter resničen (true), potem se uporablja dvojno medpomnjenje (postopek za izris na zaslon s preklapljanjem med dvema medpomnilnikoma ali več medpomnilniki, kar omogoča posodabljanje med izrisom). Ustvari novo ploščo z določeno razporeditvijo gradnikov. Privzeta razporeditev je FIowLayout. Doda komponento v ploščo. ŠC VELENJE

200 void remove (Component komponenta) void setlayout (LayoutManager razporeditev) void setsize (int sirina, int visina) void settooltiptext (String besedilo) Odstrani komponento s plošče. Določi objekt razreda LayoutManager za razporejanje komponent plošče. Parameter metode je objekt razreda, ki implementira vmesnik LayoutManager (npr. FlowLayout). Določi velikost. Določi besedilo namiga Oznaka (JLabel) Vmesniki okenskih aplikacij vsebujejo veliko komponent. Pomen komponente določa besedilo oznake. Razred JLabel (naslednik razreda JComponent) predstavlja besedilno oznako. Vsebina oznake je lahko besedilo, slika ali slika z besedilom. Konstruktor JLabel ( ) JLabel (String) JLabel (String, Icon, int) JLabel (Icon) JLabel (Icon, int) JLabel (String, int) Metoda void settext (String text) String gettext ( ) void settooltiptext (String besedilo) void setvisible (boolean logicnavrednost) Opis Ustvari novo besedilno oznako brez besedila. Ustvari novo besedilno oznako z besedilom. Ustvari novo besedilno oznako z besedilom, ikono slike z določeno vodoravno poravnavo. Konstante vodoravne poravnave so definirane v vmesniku SwingConstants (JLabel ga implementira): LEFT, CENTER, RIGHT, LEADING ali TRAILING. Za lažjo lokalizacijo se priporoča uporaba LEADING in TRAILING namesto LEFT in RIGHT. Ustvari novo besedilno oznako samo s sliko. Ustvari novo besedilno oznako z ikono slike z določeno vodoravno poravnavo. Ustvari novo besedilno oznako z besedilom z določeno vodoravno poravnavo. Določi besedilo oznake. Vrni vrednost besedilne oznake. Določi besedilo namiga. Prikaži / skrij oznako. Oglejmo si primer okna, v katerega vstavimo oznako z besedilom in oznako s sliko. Za razporeditev komponent uporabimo objekt razreda FlowLayout, ki omogoča vstavljanje komponent v vsebnik z leve proti desni glede na zaporedje vstavljanja komponent (metoda add). Metoda setlayout je podedovana iz razreda Container. 1. /* Oznaka1JLabel.java 2. razred, oznake */ 3. import java.awt.flowlayout; 4. import javax.swing.icon; 5. import javax.swing.imageicon; 6. import javax.swing.jframe; 7. import javax.swing.jlabel; 8. import javax.swing.swingconstants; public class Oznaka1JLabel extends JFrame{ 11. // atributi objektov oznak 12. private JLabel lblbesedilo; // besedilna oznaka 13. private JLabel lblbesediloinslika; // oznaka z besedilom in sliko public Oznaka1JLabel() { INFORMATIKA, Programiranje 1 in 2 Stran 200

201 16. FlowLayout layout = new FlowLayout(); // objekt razporeditve komponent v obliki vrstic besedila 17. layout.sethgap(20); // določitev vodoravnega odmika 18. layout.setvgap(20); // določitev navpičnega odmika 19. setlayout( layout ); // oknu določimo postavitev komponent this.lblbesedilo = new JLabel("Besedilo oznake"); // objekt oznake, vsebina besedilo 22. lblbesedilo.settooltiptext("namig besedilne oznake"); // določimo besedilo namiga (angl. hint) 23. add(lblbesedilo); // v vsebnik vstavimo prvo komponento oznake /* this.getclass() - vrne objekt razreda; getresource("ikona1.png") - vrne URL vir parametra*/ 26. Icon ikonaknjiga = new ImageIcon(this.getClass().getResource("ikona1.png")); 27. if (ikonaknjiga!= null) // objekt razreda Icon ima določeno vrednost 28. // objekt oznake, vsebina besedilo in slika 29. this.lblbesediloinslika = new JLabel("Besedilo oznake s sliko",ikonaknjiga,swingconstants.center); 30. else 31. this.lblbesediloinslika = new JLabel("Besedilo oznake brez slike"); // objekt oznake, vsebina besedilo 32. lblbesediloinslika.settooltiptext("namig oznake z besedilom in sliko."); // določimo besedilo namiga (hint) 33. add(lblbesediloinslika); // v vsebnik vstavimo drugo komponento oznake 34. // določimo velikost 35. setsize(300, 200); 36. // prikažemo okno 37. setvisible(true); 38. // določimo naslov okna 39. settitle("uporaba oznak"); 40. setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); 41. } // Oznaka1JLabel 42. } // konec Oznaka1JLabel 1. /* DemoJLabel.java, testni razred okna oznak*/ 2. public class DemoJLabel { public static void main(string[] args) { 5. // TODO Auto-generated method stub 6. Oznaka1JLabel oknooznake = new Oznaka1JLabel(); 7. } // main } // konec DemoJLabel Izvajanje: Slika 58: Oznake Stran 201 ŠC VELENJE

202 15.6 Besedilna polja (JTextFields, JPasswordFields) Uporabnik komunicira s programom preko aktivnosti kot so klik gumba, vpis besedila v vnosno polje, izbira ukaza iz menija... Ob dogodku se izvrši ustrezna aktivnost, ki jo določa ustrezni odzivni dogodek. Dogodek je sprememba v stanju določene komponente zaradi interakcije s strani uporabnika. Vsaka komponenta grafičnega vmesnika s katero je uporabnik v interakciji, mora vsebovati objekt, ki nastopa v vlogi poslušalca. Naloga poslušalca je, da prestreže odzivni dogodek, in izvrši ustrezno akcijo. Oglejmo si primer določitve odzivnega dogodka za besedilno polje, ko uporabnik v besedilnem polju pritisne tipko Enter. Ko uporabnik v vnosnem polju pritisne tipko Enter se zgodi dogodek razreda ActionEvent (package java.awt.event). Ta dogodek se obravnava z objektom, ki implementira vmesnik (interface) ActionListener (package java.awt.event). Dogodkom moramo določiti izvršitev ustreznih aktivnosti, ki predstavljajo odziv na dogodke Določitev odzivnega dogodka Ustvarimo razred, ki predstavlja odzivni dogodek. Razred ustvarimo z implementacijo ustreznega vmesnika (angl. interface). Dogodki so razvrščeni v več razredov kot so: KeyEvent, MouseEvent, ActionEvent, WindowEvent... Vsaki vrsti dogodka (razred) lahko dodamo ustreznega poslušalca. V našem primeru je razred dogodka ActionEvent. private class PoslusalecDogodkov implements ActionListener { // metoda actionperformed se izvede samodejno, ko se zgodi odzivni dogodek public void actionperformed (ActionEvent dogodek) { // koda odzivnega dogodka } } Komponenti grafičnega vmesnika dodamo objekt, ki nastopa v vlogi poslušalca (metoda addactionlistener (objekt poslušalca)). PoslusalecDogodkov poslusalecdogodkov = new PoslusalecDogodkov(); // ustvarimo razred poslušalca dogodkov txtpolje1.addactionlistener(poslusalecdogodkov); // komponenti registriramo oz. določimo poslušalca dogodkov Do sedaj smo razrede deklarirali v ločenih dokumentih. Razrede za poslušalce dogodkov običajno deklariramo znotraj drugih razredov. Tako deklariran razred imenujemo gnezdeni razred (angl. nested class). Nestatične gnezdene razrede imenujemo tudi notranji razred (angl. inner class). Objekt notranjega razreda ustvarimo z deklaracijo objekta v razredu, ki vsebuje gnezden razred. Objekt notranjega razreda vsebuje referenco na objekt nadrejenega razreda. Objekt notranjega razreda (nestatičen razred) lahko dostopa do vseh atributov in metod nadrejenega razreda JTextField JTextField razred je razširitev razreda JTextComponent, ki vsebuje skupne značilnosti swing besedilnih komponent. Razred JPasswordField je razširitev razreda JTextField z metodami za delo z gesli. Obe komponenti omogočata enovrstični vnos besedila. Konstruktor JTextField () JTextField(String) JTextField(String, int) JTextField(int) Opis Ustvari besedilno polje. Ustvari besedilno polje s privzeto vrednostjo. Ustvari besedilno polje s privzeto vrednostjo in določeno dolžino stolpcev. Ustvari besedilno polje z določeno dolžino stolpcev. INFORMATIKA, Programiranje 1 in 2 Stran 202

203 Metoda void settext(string) Določi vrednost besedilnega polja. String gettext() Vrne vrednost besedilnega polja. void seteditable(boolean) Določimo možnost spreminjanja vrednosti polja; true - možno spreminjanje vrednosti. boolean iseditable() Vrne stanje možnosti spreminjanja vrednosti. void sethorizontalalignment(int) Določi vrednost poravnave; JTextField.LEADING, JTextField.CENTER, JTextField.TRAILING int gethorizontalalignment() Vrne vrednost poravnave. void selectall() Označi vrednost polja. Oglejmo si primer uporabe besedilnih polj za vnos priimka, imena in gesla. Za priimek in ime uporabimo komponento JTextField, za geslo pa komponento JPassword. Ko uporabnik v vnosnem polju pritisne Enter, prikažimo vrednost besedilnega polja v pogovornem oknu. 1. /* TextFieldP1.java 2. * Demonstracija uporabe vnosnega polja */ 3. import java.awt.gridlayout; 4. import java.awt.event.actionevent; 5. import java.awt.event.actionlistener; 6. import javax.swing.jframe; 7. import javax.swing.jlabel; 8. import javax.swing.joptionpane; 9. import javax.swing.jpasswordfield; 10. import javax.swing.jtextfield; // 13. public class TextFieldP1 extends JFrame { 14. // besedilne oznake 15. private JLabel lbloznaka1 ; 16. private JLabel lbloznaka2; 17. private JLabel lbloznaka3; 18. // vnosna polja 19. private JTextField txtpolje1; // besedilno polje private JTextField txtpolje2; // besedilno polje private JPasswordField passpolje3; // besedilno polje 3, geslo public TextFieldP1() { 24. super("uporaba vnosnih polj"); // klic konstruktorja razreda JFrame 25. setlayout( new GridLayout(3,2) ); // mrežna razporeditev 3 x // ustvarimo prvo oznako 27. lbloznaka1= new JLabel ("Priimek:", JLabel.CENTER); 28. add(lbloznaka1); // dodamo oznako // ustvarimo prvo vnosno polje, priveta vrednost <priimek>, dolžine do 20 znakov 30. this.txtpolje1 = new JTextField("<priimek>",20); 31. add(txtpolje1); // dodamo polje // ustvarimo drugo oznako 33. lbloznaka2= new JLabel ("Ime:", JLabel.CENTER); 34. add(lbloznaka2); // dodamo oznako // ustvarimo drugo vnosno polje, priveta vrednost <ime> 36. this.txtpolje2 = new JTextField("<ime>"); 37. add(txtpolje2); // dodamo polje // ustvarimo tretjo oznako Stran 203 ŠC VELENJE

204 39. lbloznaka3= new JLabel ("Geslo:", JLabel.CENTER); // ustvarimo oznako za vnosno polje 40. add(lbloznaka3); // dodamo oznako // ustvarimo tretje vnosno polje za vnos gesla, največ 20 znakov 42. this.passpolje3 = new JPasswordField(20); 43. add(passpolje3); // dodamo polje // registracija poslušalca dogodkov 46. PoslusalecDogodkov poslusalecdogodkov = new PoslusalecDogodkov(); 47. this.txtpolje1.addactionlistener(poslusalecdogodkov); // komponenti določimo poslušalca dogodkov 48. this.txtpolje2.addactionlistener(poslusalecdogodkov); 49. this.passpolje3.addactionlistener(poslusalecdogodkov); 50. } // konstruktor TextFieldP // poslušalec dogodkov, zasebni, notranji razred, implementira vmesnik ActionListener in vsebuje odzivno metodo actionperformed 53. private class PoslusalecDogodkov implements ActionListener { 54. public void actionperformed (ActionEvent dogodek) { 55. String besedilo = ""; // besedilo sporočila if (dogodek.getsource() ==txtpolje1 ) // Enter tipka pritisnjena v komponenti txtpolje1 // vsebina besedila sporočila 58. besedilo = String.format("Vnosno polje 1: %s", dogodek.getactioncommand()); 59. else if (dogodek.getsource() ==txtpolje2 ) // Enter tipka pritisnjena v komponenti txtpolje2 // vsebina besedila sporočila 60. besedilo = String.format("Vnosno polje 2: %s", dogodek.getactioncommand()); 61. else if (dogodek.getsource() ==passpolje3 ) // Enter tipka pritisnjena v komponenti passpolje3 // vsebina besedila sporočila 62. besedilo = String.format("Vnosno polje 3 (geslo): %s", dogodek.getactioncommand()); 63. // izpis besedila sporočila v pogovornem oknu 64. JOptionPane.showMessageDialog(null, besedilo, "Odzivni dogodek", JOptionPane.INFORMATION_MESSAGE); 65. } // actionperformed 66. } // konec razred PoslusalecDogodkov } // konec razred TextFieldP1 1. /* DemoTextFieldP1.java, testni razred */ 2. import javax.swing.jframe; 3. public class DemoTextFieldP1 { 4. // razred main 5. public static void main(string[] args) { 6. TextFieldP1 oknobesedilnapolja = new TextFieldP1(); 7. oknobesedilnapolja.setsize(400, 200); 8. // določimo naslov okna 9. oknobesedilnapolja.settitle("uporaba vnosnih polj"); 10. oknobesedilnapolja.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); 11. // prikažemo okno 12. oknobesedilnapolja.setvisible(true); 13. } // main } // razred DemoTextFieldP1 INFORMATIKA, Programiranje 1 in 2 Stran 204

205 Izvajanje: Slika 59: Vnosna polja Ob pritisku tipke Enter v besedilnem polju priimek prikažemo okno z obvestilom vrednosti polja. Slika 60: Odziv dogodka Splošni odzivni dogodki in poslušalci dogodkov V prejšnjem primeru smo si ogledali primer odzivnega dogodka. Izvor dogodka je komponenta, ki omogoča interakcijo z uporabnikom. Objekt dogodka vsebuje informacije odzivnega dogodka kot je referenca na objekt izvora dogodka in informacije, ki jih potrebuje poslušalec dogodkov za obdelavo dogodka. Metoda poslušalca dogodkov izvrši odziv na dogodek (odzivni dogodek). Več tipov poslušalcev dogodkov je skupnih za Swing in AWT komponente. Deklarirani so v paketu java.awt.event. Dodatni tipi poslušalcev dogodkov Swing komponent so deklarirani v paketu javax.swing.event. Vsak vmesnik poslušalca dogodkov ima eno ali več odzivnih metod, ki morajo biti deklarirane v razredu, ki implementira vmesnik. Dogodkovni razredi paketa java.awt.event Stran 205 ŠC VELENJE

206 Dogodkovni razredi paketa java.awt.event Slika 61: Dogodkovni razredi Slika 62: Poslušalci Dogodki, vmesniki in odzivne metode Tip dogodka Vmesnik (interface) Odzivne metode ActionEvent ActionListener actionperformed(actionevent e) ItemEvent ItemListener itemstatechanged(itemevent e) TextEvent TextListener textvaluechanged(actionevent e) ComponentEvent ComponentListener componentmoved(componentevent e) componenthidden(componentevent e) componentresized(componentevent e) INFORMATIKA, Programiranje 1 in 2 Stran 206

207 Tip dogodka Vmesnik (interface) Odzivne metode componentshown(componentevent e) FocusEvent FocusListener focusgained(focusevent e) focuslost(focusevent e) MouseEvent MouseListener MouseMotionListener mousepressed(mouseevent e) mousereleased(mouseevent e) mouseentered(mouseevent e) mouseexited(mouseevent e) mouseclicked(mouseevent e) mousedragged(mouseevent e) mousemoved(mouseevent e) KeyEvent KeyListener keypressed(keyevent e) keytyped(keyevent e) keyreleased(keyevent e) WindowEvent WindowListener windowactivated(windowevent e) windowclosing(windowevent e) windowclosed(windowevent e) windowdeactivated(windowevent e) windowdeiconified(windowevent e) windowiconified(windowevent e) windowopened(windowevent e) ContainerEvent ContainerListener componentadded(containerevent e) componentremoved(containerevent e) AdjustmentEvent AdjustmentListener adjustmentvaluechanged(adjustmentevent e) Metode za dodajanje poslušalcev Izvor dogodka (komponenta) JButton, JCheckBox, JComboBox, JToolBar, JTextField, JRadioButton JScrollBar swing komponente JButton, JCheckBox, JComboBox, JRadioButton JWindow, JFrame JSlider Metode za dodajanje poslušalcev addactionlistener() addadjustmentlistener() addfocuslistener(), addkeylistener(), addmouselistener(), addmousemotionlistener() additemlistener() addwindowlistener() addchangeevent() Registracija dogodka Natančneje si oglejmo registracijo dogodka iz zadnjega primera. Vsak objekt razreda JComponent ima objektni atribut razreda EventListenerList. Vsak naslednik objekta JComponent vzdržuje reference njegovih registriranih poslušalcev v seznamu listnerlist. Na sliki je seznam prikazan v obliki polja (array). Izvršitev stavka txtpolje1.addactionlistener (poslusalecdogodkov); povzroči, da se v seznam listnerlist objekta txtpolje1 doda nov vnos, ki vsebuje referenco na objekt PoslusalecDogodkov. Stran 207 ŠC VELENJE

208 Slika 63: Registracija poslušalca Ko se zgodi dogodek, se dogodek posreduje samo poslušalcu dogodkov ustreznega tipa. Vsak tip dogodka ima enega ali več ustreznih vmesnikov (interface) poslušalcev dogodkov. Deklaracija poslušalca Poslušalec mora pripadati razredu, v katerem so implementirane metode za določeno vrsto dogodkov. Za dogodke tipa WindowEvent se ta razred imenuje WindowAdapter in je implementacija vmesnika WindowListener. Vmesnik WindowListener predpisuje 7 metod, ki ustrezajo posameznim dogodkom tipa WindowEvent: public void windowactivated(windowevent e) public void windowclosed(windowevent e) public void windowclosing(windowevent e) public void windowdeactivated(windowevent e) public void windowdeiconified(windowevent e) public void windowiconified(windowevent e) public void windowopened(windowevent e) V razredu WindowAdapter so te metode implementirane tako, da ob dogodku ne izvršijo nobene akcije Gumbi Gumbi so komponente, ki omogočajo izvedbo določene aktivnosti (klik gumba). Gumbov je več vrst. Najpogosteje uporabljeni so: - ukazni gumbi (angl. command buttons), - stikala (angl. checkboxes), - preklopni gumbi (angl. toggle buttons), - radijski gumbi (angl. radio buttons) itd. INFORMATIKA, Programiranje 1 in 2 Stran 208

209 Hiearhija swing gumbov: Slika 64: Hiearhija swing gumbov Razred AbstractButton določa skupne značilnosti gumbov AbstractButton Metode void setselected(boolean) boolean isselected() void setenabled(boolean omogocen) void seticon(icon privzetaikona) Icon geticon() void settext(string besedilo) String gettext() void setverticalalignment(int poravnava) int getverticalalignment() void sethorizontalalignment(int poravnava) int gethorizontalalignment() void setmnemonic(int) char getmnemonic() Opis Določi ali vrni stanje izbora gumba (samo gumbi s stanjem on/off). Omogoči ali onemogoči gumb. Določi ali vrni privzeto ikono. Določi ali vrni besedilo napisa gumba. Določi ali vrni navpično poravnavo. SwingConstants.CENTER (privzeto), SwingConstants.TOP, SwingConstants.BOTTOM Določi ali vrni vodoravno poravnavo. SwingConstants.RIGHT, SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.LEADING, SwingConstants.TRAILING Določi ali vrne bližnjico za pritisk gumba s tipkovnico. Konstanta KeyEvent.VK_? JButton Konstruktor JButton() JButton(Icon ikona) JButton(String napis) JButton(String napis, Icon ikona) Opis Ustvari gumb brez besedila in ikone. Ustvari gumb z ikono. Ustvari gumb z napisom. Ustvari gumb z napisom in ikono. Klik ukaznega gumba ustvari ActionEvent dogodek. Oglejmo si primer, ko imamo v vmesniku tri besedilna polja in sicer znesek v eurih, znesek v dolarjih in koeficient pretvorbe. Uporabnik vpiše znesek v eurih in koeficient pretvorbe. S klikom na gumb 'Izračun zneska v $' določimo vrednost zneska v dolarjih. 1. /* JButtonPretvori.java 2. * Vrednost zneska v evrih pretvorimo v vrednost v dolarjih. */ Stran 209 ŠC VELENJE

210 3. import java.awt.gridlayout; 4. import java.awt.event.actionevent; 5. import java.awt.event.actionlistener; 6. import java.awt.event.keyevent; import javax.swing.jbutton; 9. import javax.swing.jframe; 10. import javax.swing.jlabel; 11. import javax.swing.jtextfield; 12. // razred 13. public class JButtonPretvori extends JFrame { 14. // oznake besedilnih polj 15. private JLabel lblznesek ; 16. private JLabel lblznesek$; 17. private JLabel lblkoeficient; 18. // besedilna polja 19. private JTextField txtznesek ; 20. private JTextField txtznesek$; 21. private JTextField txtkoeficient; 22. // gumb za izvršitev izračuna 23. private JButton btnizracun; 24. // konstruktor 25. public JButtonPretvori() { 26. super("izračun"); // klic konstruktorja nadrejenega razreda 27. setlayout(new GridLayout(4,2)); // določimo mrežno razporeditev 28. lblznesek = new JLabel("Znesek : ",JLabel.CENTER); // ustvarimo objekt oznake 29. add(lblznesek, 0); // komponento dodamo v vsebnik (container) 30. txtznesek = new JTextField(); // ustvarimo objekt besedilnega polja 31. txtznesek.sethorizontalalignment(jtextfield.trailing); // desna poravnava 32. txtznesek.settooltiptext("vnesite znesek "); // določimo namig add(txtznesek,1); // komponento dodamo v vsebnik (container) 35. lblkoeficient = new JLabel("Koeficient =>$: ",JLabel.CENTER); 36. add(lblkoeficient, 2); // komponento dodamo v vsebnik (container) 37. txtkoeficient = new JTextField(" "); // ustvarimo objekt besedilnega polja s privzeto vrednostjo 38. txtkoeficient.sethorizontalalignment(jtextfield.trailing); // desna poravnava txtkoeficient.settooltiptext("vnesite koeficient pretvorbe"); // določimo namig 41. add(txtkoeficient,3); // komponento dodamo v vsebnik (container) 42. lblznesek$ = new JLabel("Znesek $: ",JLabel.CENTER); // ustvarimo objekt oznake 43. add(lblznesek$,4); // komponento dodamo v vsebnik (container) 44. txtznesek$ = new JTextField(); // ustvarimo besedilno polje 45. txtznesek$.sethorizontalalignment(jtextfield.trailing); // desna poravnava 46. txtznesek$.seteditable(false); // onemogočimo polje 47. txtznesek$.settooltiptext("znesek $"); // določimo namig 48. add(txtznesek$,5); // komponento dodamo v vsebnik (container) 49. btnizracun = new JButton("Izračun zneska v $"); // ustvarimo gumb z napisom 50. add(btnizracun,6); // komponento dodamo v vsebnik (container) 51. btnizracun.setmnemonic(keyevent.vk_i); // ALT+I => pritisk gumba 52. // registracija poslušalca dogodkov 53. PoslusalecDogodkov poslusalecdogodkov = new PoslusalecDogodkov(); 54. btnizracun.addactionlistener(poslusalecdogodkov); 55. txtznesek.addactionlistener(poslusalecdogodkov); 56. } // konstruktor JButtonPretvori 57. INFORMATIKA, Programiranje 1 in 2 Stran 210

211 58. // deklaracija poslušalca dogodkov, notranji razred 59. private class PoslusalecDogodkov implements ActionListener { 60. public void actionperformed(actionevent dogodek) { 61. try 62. { 63. // izračunamo znesek v dolarjih 64. double zn$ = Double.parseDouble( txtznesek.gettext()) * Double.parseDouble( txtkoeficient.gettext()); 65. txtznesek$.settext( String.format("%f", zn$) ); // določimo vrednot besedilnega polja znesek v dolarjih 66. } 67. catch(exception e) { // v primeru izjeme 68. txtznesek$.settext(""); // počistimo vrednost polja 69. } 70. } // actionperformed 71. } // PoslusalecDogodkov } // konec razreda JButtonPretvori 1. /* DemoJButtonPretvori.java */ 2. import javax.swing.jframe; 3. public class DemoJButtonPretvori { public static void main(string[] args) { 6. JButtonPretvori okno = new JButtonPretvori(); // ustvarimo okno 7. okno.setsize(400, 200); 8. // določimo naslov okna 9. okno.settitle("pretvori v $"); 10. okno.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); 11. // prikažemo okno 12. okno.setvisible(true); 13. } // main } // konec DemoJButtonPretvori Primer izvajanja: Slika 65: Vmesnik Euro v $ Za določitev stanja uporabljamo naslednje komponente: stikalo (JCheckBox), preklopni gumb (JToggleButton) in radijski gumb (JRadioButton). JCheckBox (Stikalo) Stran 211 ŠC VELENJE

212 Konstruktor Opis ( Icon ikona ) Ustvari stikalo s sliko (privzeta vrednost - izklopljeno). JCheckBox( Icon ikona, boolean vklopljen ) Ustvari stikalo s sliko in stanjem (parameter vklopljen). JCheckBox( String besedilo ) Ustvari stikalo z besedilom oznake (privzeta vrednost - izklopljeno). JCheckBox( String besedilo, boolean Ustvari stikalo z besedilom oznake in stanjem (parameter vklopljen ) vklopljen).... Klik stikala povzroči dogodek ItemEvent. Dogodek ItemEvent obravnavamo z objektom razreda ItemListener. JToggleButton (Preklopni gumb) Konstruktor JToggleButton() JToggleButton(Icon icon) JToggleButton(Icon icon, boolean izbran) JToggleButton(String besedilo) JToggleButton(String besedilov, boolean izbran) JToggleButton(String besedilo, Icon icon) JToggleButton(String besedilo, Icon icon, boolean izbran) Opis Ustvari preklopni gumb brez besedila in slike. Ustvari preklopni gumb s sliko in brez besedila. Ustvari preklopni gumb s sliko in brez besedila. Stanje določa parameter izbran. Ustvari preklopni gumb z besedilom. Ustvari preklopni gumb z besedilom. Stanje določa parameter izbran. Ustvari preklopni gumb s sliko in besedilom. Ustvari preklopni gumb s sliko in besedilom. Stanje določa parameter izbran. JRadioButton (Radijski gumb) Konstruktor JRadioButton() JRadioButton(Icon ikona) JRadioButton(Icon ikona, boolean izbran) JRadioButton(String besedilo) JRadioButton(String besedilo, Icon ikona) JRadioButton(String besedilo, Icon ikona, boolean izbran) Opis Ustvari radijski gumb brez besedila in slike. Privzeto ni izbran Ustvari radijski gumb s sliko in brez besedila. Privzeto ni izbran. Ustvari radijski gumb s sliko in brez besedila. Stanje določa parameter izbran. Ustvari radijski gumb z besedilom. Privzeto ni izbran. Ustvari radijski gumb s sliko in besedilom. Ustvari radijski gumb s sliko in besedilom. Izbor določa parameter izbran. Oglejmo si primer, kjer s stikaloma z napisi očala in lasje določamo prikaz očal in las na spodnji sliki. Vsa možna stanja dveh stikal so štiri. Za vsako stanje imamo v mapi 'slike' sliko. Zadnja dva znaka imena slike določata prikaz očal in lasi in sicer o za očala (predzadnji znak) ter l za lase (zadnji znak). Če je na zadnjem ali predzadnjem mestu znak _, potem prikažemo sliko brez tega elementa. 'ikona_ol.png' 'ikona l.png' 'ikona_o_.png' 'ikona.png' 1. /* CheckBoxSlike.java 2. * Uporaba stikal za prikaz elementov slike. */ INFORMATIKA, Programiranje 1 in 2 Stran 212

213 3. import java.awt.gridlayout; 4. import java.awt.event.itemevent; 5. import java.awt.event.itemlistener; 6. import java.awt.event.keyevent; 7. import java.net.url; 8. import javax.swing.imageicon; 9. import javax.swing.jcheckbox; 10. import javax.swing.jframe; 11. import javax.swing.jlabel; // razred CheckBoxSlike, implementacija poslušalca za stikalo 14. public class CheckBoxSlike extends JFrame implements ItemListener { 15. // stikala 16. private JCheckBox ckbtnocala; 17. private JCheckBox ckbtnlasje; 18. // oznaka za prikaz ikone slike 19. private JLabel lblslika; 20. // besedilo za določitev 21. StringBuffer izbranaslika; public CheckBoxSlike() { 24. super(); 25. setlayout(new GridLayout(1, 1) ); // mrežna razporeditev, 1 x ckbtnocala = new JCheckBox("očala", true); // ustvarimo stikalo za očala 27. ckbtnocala.settooltiptext("slika z očali."); 28. ckbtnocala.setmnemonic(keyevent.vk_o); 29. add(ckbtnocala,0); ckbtnlasje = new JCheckBox("lasje", true); // ustvarimo stikalo za lasje 32. ckbtnlasje.settooltiptext("slika z lasmi."); 33. ckbtnlasje.setmnemonic(keyevent.vk_l); 34. add(ckbtnlasje,1); lblslika = new JLabel(); 37. izbranaslika = new StringBuffer("ol"); // ustvarimo niz z vrednostjo 'ol' (vidna ocala in lasje) 38. posodobisliko(); 39. add(lblslika); 40. // registracija poslušalca dogodkov 41. ckbtnocala.additemlistener(this); // polušalec je ta razred 42. ckbtnlasje.additemlistener(this); // polušalec je ta razred 43. } // CheckBoxSlike protected void posodobisliko() { 46. ImageIcon ikona = ustvariikono("/slike/ikona_" + izbranaslika+".png"); 47. lblslika.seticon(ikona); // določimo ikono oznake 48. if (ikona == null) // ikona ne obstaja 49. lblslika.settext("slika ne obstaja"); // oznaki določimo besedilo 50. else 51. lblslika.settext(null); // oznaka nima besedila 52. } // posodobisliko protected static ImageIcon ustvariikono(string pot) { 55. URL slikaurl = CheckBoxSlike.class.getResource(pot); // vrne URL naslov poti slike 56. if (slikaurl!= null) // naslov slike je določen Stran 213 ŠC VELENJE

214 57. return new ImageIcon(slikaURL); // vrne objekt ikone slike 58. else 59. return null; 60. } // ustvariikono // odzivna metoda poslušalca (stikala) 63. public void itemstatechanged(itemevent dogodek) { 64. Object izvor = dogodek.getitemselectable(); // objekt izvora dogodka 65. int indeksznaka=0; // 0 - privzeti indeks očala 66. char znak='o'; // o - privzeti znak očala 67. if (izvor == ckbtnocala) // stikalo očala 68. { 69. indeksznaka = 0; 70. znak = 'o'; 71. } else if (izvor == ckbtnlasje) // stikalo lasje 72. { 73. indeksznaka = 1; // 1 - indeks lasi 74. znak = 'l'; // l - znak za lasi 75. } 76. if (dogodek.getstatechange() == ItemEvent.DESELECTED) // stanje spremembe je izklop stikala 77. znak='_'; // _ znak za izklopljeno stikalo 78. izbranaslika.setcharat(indeksznaka, znak) ; // določimo ustrezen znak 79. posodobisliko(); // prikaz ustrezne slike 80. } // itemstatechanged } // konec razreda 1. /* DemoCheckBoxSlike.java, testni razred */ 2. import javax.swing.jframe; public class DemoCheckBoxSlike { public static void main(string[] args) { 7. CheckBoxSlike okno = new CheckBoxSlike(); // ustvarimo okno z vmesnikom 8. okno.setsize(300,150); // velikost 9. okno.settitle("stikala za izbor slike"); // naslov 10. okno.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); // privzeta operacija, izhod 11. okno.setlocationrelativeto(null); // postavitev na sredino 12. okno.setvisible(true); // okno prikažemo 13. } // main } // konec razreda DemoCheckBoxSlike Kombinirano vnosno polje (JComboBox) Kombinirano vnosno polje (JComboBox) združuje vnosno polje in spustni seznam. Uporabnik lahko vpiše vrednost polja ali jo izbere iz seznama. Vsak element seznama ima indeks. Prvi element ima indeks 0, drugi 1... Element seznama izberemo s klikom. Največje število prikazanih elementov seznama določimo z metodo setmaximumrowcount. To lastnost določimo, da se seznam ne razširi zunaj predvidenega območja seznama. Konstruktor JComboBox () Opis Ustvari kombinirano vnosno polje. INFORMATIKA, Programiranje 1 in 2 Stran 214

215 JComboBox(ComboBoxModel<E> model) Ustvari kombinirano vnosno polje iz obstoječega kombiniranega polja. JComboBox(E[] elementi) Ustvari kombinirano vnosno polje iz elementov tabele (polja). JComboBox(Vector<E> elementi) Ustvari kombinirano vnosno polje iz elementov Vektorja. Metode public void setmaximumrowcount(int stevilo) Določi ali vrne največje število prikazanih vrstic. public int getmaximumrowcount() public void setselecteditem(object objekt) Določi ali vrne izbrani element. public Object getselecteditem() public void setselectedindex(int indeks) Določi ali vrne indeks izbranega elementa. public int getselectedindex() public void additem(e element) Doda element v seznam elementov. public void insertitemat(e element,int indeks) Doda element v seznam elementov na določenem mestu. public void removeitem(object objekt) Odstrani element iz seznama. public void removeitemat(int indeks) Odstrani element na določenem mestu iz seznama. public void removeallitems() Odstrani vse elemente iz seznama. public void showpopup() Prikaže ali skrije spustni seznam. public void hidepopup() public int getitemcount() Vrne število elementov seznama. Oglejmo si primer okna, v katerem s kombiniranim poljem izberemo sliko, ki se prikaže v oznaki. Z drugim kombiniranim poljem pa izberemo barvo ozadja plošče oz. okna. Slika 66: Vmesnik s kombiniranim poljem 1. /* ComboBox1.java 2. * Primer uporabe kombiniranega seznama */ 3. package vaje; import java.awt.color; 6. import java.awt.event.actionevent; 7. import java.awt.event.actionlistener; 8. import java.awt.event.itemevent; 9. import java.awt.event.itemlistener; import javax.swing.defaultcomboboxmodel; 12. import javax.swing.icon; 13. import javax.swing.imageicon; 14. import javax.swing.jcombobox; 15. import javax.swing.jframe; 16. import javax.swing.jlabel; 17. import javax.swing.jpanel; 18. import javax.swing.jtextfield; 19. import javax.swing.border.emptyborder; 20. Stran 215 ŠC VELENJE

216 21. // razred ComboBox1 22. public class ComboBox1 extends JFrame { 23. private JPanel contentpane; // plošča 24. private JLabel lblslika; // prikaz slike 25. // tabela imen slik 26. private static final String[] tabslike = { "/slike/ikona_ol.png", "/slike/ikona l.png", "/slike/ikona_o_.png", "/slike/ikona.png"}; 27. // tabela objektov ikon 28. private Icon[] ikone = {new ImageIcon( getclass().getresource(tabslike[0])), 29. new ImageIcon( getclass().getresource(tabslike[1])), 30. new ImageIcon( getclass().getresource(tabslike[2])), 31. new ImageIcon( getclass().getresource(tabslike[3])) 32. }; 33. private JLabel lblizborslike; // oznaka izbor slike 34. private JLabel lblizborbarveozadja; // oznaka izbor barve ozadja /** začetek izvajanja */ 37. public static void main(string[] args) { 38. try { 39. // ustvarimo objek okna 40. ComboBox1 frame = new ComboBox1(); 41. frame.setvisible(true); // prikažemo okno 42. } catch (Exception e) { // prestrezanje izjem 43. e.printstacktrace(); // izpis sled sklada 44. } // try 45. } // konec main /* Ustvarimo okno */ 48. public ComboBox1() { 49. settitle("kombinirana polja"); // naslov 50. setdefaultcloseoperation(jframe.exit_on_close); 51. setbounds(100, 100, 386, 189); // določimo območje okna 52. contentpane = new JPanel(); // plošča 53. contentpane.setbackground(color.white); // ozadje plošče 54. contentpane.setborder(new EmptyBorder(5, 5, 5, 5)); // prazna obrova 55. setcontentpane(contentpane); 56. contentpane.setlayout(null); // absolutno razporejanje JComboBox cboxizborslike = new JComboBox(); // ustvarimo kombinirano polje 59. cboxizborslike.setmaximumrowcount(4); // največ 4 vrstice seznama 60. cboxizborslike.seteditable(true); // možnost urejanja 61. // vrednosti seznama 62. cboxizborslike.setmodel(new DefaultComboBoxModel(new String[] {"ikona_ol.png", "ikona l.png", "ikona_o_.png", "ikona.png"})); 63. cboxizborslike.setbounds(30, 32, 160, 20); // območje seznama 64. cboxizborslike.setselectedindex(0); // izbran prvi element, ikona_ol.png 65. // poslušalec dogodkov, izvedba - anonimni notranji razred 66. cboxizborslike.additemlistener(new ItemListener() { 67. public void itemstatechanged(itemevent dogodek) { // sprememba stanja elementa 68. if (dogodek.getstatechange() == ItemEvent.SELECTED) // dogodek je izbor elementa 69. lblslika.seticon(ikone[cboxizborslike.getselectedindex()]); // prikaz slike izbranega dokumenta 70. } // itemstatechanged 71. }); // additemlistener contentpane.add(cboxizborslike); // seznam dodamo v ploščo INFORMATIKA, Programiranje 1 in 2 Stran 216

217 JComboBox cboxbarva = new JComboBox(); // ustvarimo seznam za izbor barve 76. cboxbarva.setmodel(new DefaultComboBoxModel(new String[] {"Bela", "Siva", "Modra", "Rumena", "Zelena"})); // vrednosti seznama 77. cboxbarva.setmaximumrowcount(4); // največ 4 vrstice seznama 78. cboxbarva.setbounds(30, 115, 160, 20); // območje seznama 79. // poslušalec dogodkov 80. cboxbarva.additemlistener(new ItemListener() { 81. public void itemstatechanged(itemevent dogodek) { 82. if (dogodek.getstatechange() == ItemEvent.SELECTED) // dogodek izbora elementa 83. switch (cboxbarva.getselectedindex()) // indeks izbranega elementa 84. { 85. // določimo novo barvo ozadja 86. case 0: contentpane.setbackground(color.white); break; 87. case 1: contentpane.setbackground(color.gray); break; 88. case 2: contentpane.setbackground(color.blue); break; 89. case 3: contentpane.setbackground(color.yellow); break; 90. case 4: contentpane.setbackground(color.green); break; 91. default: contentpane.setbackground(color.white); 92. } 93. } 94. }); 95. contentpane.add(cboxbarva); lblslika = new JLabel(ikone[0]); // ustvarimo oznako, privzeta prva ikona tabele 98. lblslika.setbounds(247, 32, 82, 68); // območje 99. contentpane.add(lblslika); // oznako dodamo v ploščo // oznaka seznama za izbor slike 102. lblizborslike = new JLabel("Izbor slike:"); 103. lblizborslike.setlabelfor(cboxizborslike); 104. lblizborslike.setbounds(30, 13, 94, 14); 105. contentpane.add(lblizborslike); 106. // oznaka seznama za izbor barve 107. lblizborbarveozadja = new JLabel("Izbor barve ozadja:"); 108. lblizborbarveozadja.setlabelfor(cboxbarva); 109. lblizborbarveozadja.setbounds(30, 90, 134, 14); 110. contentpane.add(lblizborbarveozadja); 111. } // ComboBox } // konec razreda ComboBox1 Primer izvajanja: Slika 67: Uporaba kombiniranega polja (1) Slika 68: Uporaba kombiniranega polja (2) Stran 217 ŠC VELENJE

218 V zadnjem primeru sta poslušalca dogodkov ustvarjena kot anonimni notranji razred (razred poslušalca nima imena) // poslušalec dogodkov, izvedba - anonimni notranji razred 115. cboxizborslike.additemlistener(new ItemListener() { 116. public void itemstatechanged(itemevent dogodek) { // sprememba stanja elementa 117. if (dogodek.getstatechange() == ItemEvent.SELECTED) // dogodek je izbor elementa // prikaz slike izbranega dokumenta 118. lblslika.seticon(ikone[cboxizborslike.getselectedindex()]); 119. } // itemstatechanged 120. }); // additemlistener V vrsticah od 114 do 119 določimo poslušalca dogodkov za izbor slike. Razred poslušalca, ki deklariramo v parametru metode additemlistener, je brez imena, zato ga imenujemo anonimni poslušalec. Odzivni dogodek obravnava metoda itemstatechanged (ItemEvent dogodek). Parameter metode vsebuje informacije o dogodku. S pogojem dogodek.getstatechange() == ItemEvent.SELECTED preverimo, če se je zgodil dogodek izbora elementa seznama. Indeks izbranega elementa seznama dobimo z metodo getselectedindex Seznam (JList) Seznam (JList) prikaže elemente seznama. Uporabnik lahko v seznamu izbere en ali več elementov. Seznam ustvarimo z razredom JList, ki je naslednik razreda JComponent. Konstruktor Opis JList() Ustvari seznam s praznim modelom. JList(E[] podatkiseznama) Ustvari seznam iz elementov tabele (polja). JList(ListModel<E> podatkimodela) Ustvari seznam iz elementov podanega modela. JList(Vector<? extends E> podatkiseznama) Ustvari seznam iz elementov Vektorja. Metode int getselectedindex( ) Vrne prvi izbrani indeks. Če ni izbran noben element, potem vrne -1. int[] getselectedindices( ) Vrne tabelo vseh izbranih indeksov v naraščajočem vrstnem redu. Object getselectedvalue( ) Vrne vrednost prvega izbranega elementa. Če ni izbran noben element, potem vrne null. Object[ ] getselectedvalues( ) Vrne tabelo vrednoti vseh izbranih elementov seznama. boolean isselectedindex(int indeks) Vrne true, če je izbran element na določenem indeksu, sicer vrne false. void setselectedindex(int indeks) Izbere element na določenem indeksu. int getselectionmode( ) Vrne način izbora (izbor enega elementa ali izbor več elementov). boolean isselectionempty( ) Vrne true, če ni izbran noben element. void setlistdata(object[ ] podatkiseznama) Ustvari ListModel iz seznama vrednosti tabele in nato te vrednosti uporabi za seznam. void setlistdata(vector podatkiseznama) Ustvari ListModel iz Vector objekta in nato te vrednosti uporabi za seznam. void setselectedindices(int[ ] indeksi) Izbere množico elementov seznama. void setselectedvalue(object obj, boolean Izbere določen objekt seznama. uporabadrsnikov) void setselectionmode(int nacin ) Določi način izbora (en element ali več elementov). INFORMATIKA, Programiranje 1 in 2 Stran 218

219 Konstruktor Opis ListSelectionModel.SINGLE_SELECTION, ListSelectionModel.SINGLE_INTERVAL_SELECTION, ListSelectionModel.MULTIPLE_INTERVAL_SELECTION Uporabimo seznam za izbor barve ozadja okna. Vrednosti barv in konstante barv določimo z uporabo tabele. 1. /* JList1.java 2. * Določitev barve ozadja z uporabo seznama */ 3. import java.awt.color; 4. import javax.swing.jframe; 5. import javax.swing.jlabel; 6. import javax.swing.jlist; 7. import javax.swing.jpanel; 8. import javax.swing.jscrollpane; 9. import javax.swing.listselectionmodel; 10. import javax.swing.border.bevelborder; 11. import javax.swing.border.emptyborder; 12. import javax.swing.event.listselectionlistener; 13. import javax.swing.event.listselectionevent; 14. import javax.swing.jtextfield; public class JList1 extends JFrame { private JPanel plosca; // plošča 19. private JList lstbarve; // seznam barv 20. private JLabel lblbarve; // oznaka seznama 21. // tabela, imena možnih barv barve 22. private static final String[] imenabarve = { "Črna", "Modra", "Temno siva", "Siva", 23. "Zelena", "Svetlo siva", "Oranžna", "Roza", "Rdeča", "Bela", "Rumena"}; 24. // tabela, konstante možnih barv barve 25. private static final Color[] konstantebarve ={ Color.BLACK, Color.BLUE, Color.DARK_GRAY, Color.GRAY, Color.GREEN, 26. Color.LIGHT_GRAY, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; // ustvarjanje grafičnega vmesnika 29. public JList1() { 30. settitle("seznami"); // naslov 31. setdefaultcloseoperation(jframe.exit_on_close); 32. setbounds(100, 100, 272, 302); // določimo področje okna 33. plosca = new JPanel(); // ustvarimo ploščo 34. plosca.setbackground(color.light_gray); 35. plosca.setborder(new EmptyBorder(5, 5, 5, 5)); // določimo prazen rob obrobe 36. plosca.setlayout(null); // absolutno razporejanje 37. setcontentpane(plosca); // plošča - razporejevalnik komponent 38. lblbarve= new JLabel("Barva ozadja: "); // ustvarimo oznako 39. lblbarve.setbounds(20, 20, 100, 20); // določimo območje oznake 40. add(lblbarve); // oznako dodamo na ploščo JScrollPane scrollpane = new JScrollPane(); // ustvarimo drsnik 43. scrollpane.setbounds(20, 42, 116, 211); // določimo območje drsnika 44. add(scrollpane); // drsnik dodamo na ploščo lstbarve = new JList(imenaBarve); // ustvarimo seznam barv, prenos vrednosti iz tabele imenabarve 47. lstbarve.setselectedindex(6); // izbrana barva LIGHT_GRAY Stran 219 ŠC VELENJE

220 48. scrollpane.setviewportview(lstbarve); // seznam vstavimo v drsnik 49. lblbarve.setlabelfor(lstbarve); 50. // določimo poslušalca za izbor elementa 51. lstbarve.addlistselectionlistener(new ListSelectionListener() { 52. // odzivni dogodek za spremembo izbora seznama 53. public void valuechanged(listselectionevent dogodek) { 54. // določimo barvo ozadja plošče 55. plosca.setbackground(konstantebarve[lstbarve.getselectedindex()]); 56. } 57. }); 58. // obroba seznama 59. lstbarve.setborder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); 60. lstbarve.setvalueisadjusting(true); 61. lstbarve.setselectionmode(listselectionmodel.single_selection ); // način izbora enega elementa } // JList // začetek izvajanja 66. public static void main(string[] args) { 67. try { 68. JList1 frame = new JList1(); // ustvarimo okno 69. frame.setvisible(true); // prikažemo okno 70. } catch (Exception e) { 71. e.printstacktrace(); 72. } // try 73. } // konec main 74. } // konec razreda JList1 Izvajanje: Slika 69: Seznam barv Primer: Naredimo prenos izbranih elementov seznama 1 v seznam 2 (slika). INFORMATIKA, Programiranje 1 in 2 Stran 220

221 Slika 70: Izbor s seznamom 1. /* JList2.java 2. * Prenos izbranih elementov seznama v drug seznam. */ 3. import java.awt.color; 4. import java.awt.event.actionevent; 5. import java.awt.event.actionlistener; import javax.swing.jbutton; 8. import javax.swing.jframe; 9. import javax.swing.jlabel; 10. import javax.swing.jlist; 11. import javax.swing.jpanel; 12. import javax.swing.jscrollpane; 13. import javax.swing.listmodel; 14. import javax.swing.listselectionmodel; 15. import javax.swing.border.bevelborder; 16. import javax.swing.border.emptyborder; 17. import javax.swing.border.softbevelborder; public class JList2 extends JFrame { private JPanel plosca; // plošča 22. private JList lstseznam1; // seznam private JLabel lblseznam1; // oznaka seznama private JList lstseznam2; // seznam private JLabel lblseznam2; // oznaka seznama // tabela, imena možnih barv barve 27. private static final String[] imenabarve = { "Črna", "Modra", "Temno siva", "Siva", 28. "Zelena", "Svetlo siva", "Oranžna", "Roza", "Rdeča", "Bela", "Rumena"}; 29. // tabela, konstante možnih barv barve 30. private static final Color[] konstantebarve = { Color.BLACK, Color.BLUE, Color.DARK_GRAY, 31. Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; // ustvarjanje grafičnega vmesnika Stran 221 ŠC VELENJE

222 35. public JList2() { 36. settitle("seznami"); // naslov 37. setdefaultcloseoperation(jframe.exit_on_close); 38. setbounds(100, 100, 526, 320); // določimo področje okna 39. plosca = new JPanel(); // ustvarimo ploščo 40. plosca.setbackground(new Color(204, 204, 204)); 41. plosca.setborder(new EmptyBorder(5, 5, 5, 5)); // določimo prazen rob obrobe 42. plosca.setlayout(null); // absolutno razporejanje 43. setcontentpane(plosca); // plošča - razporejevalnik komponent 44. lblseznam1= new JLabel("Seznam 1"); // ustvarimo oznako seznama lblseznam1.setbounds(20, 20, 100, 20); // območje oznake 46. getcontentpane().add(lblseznam1); // oznako dodamo v ploščo lstseznam2 = new JList(); // prazen seznam lstseznam2.setborder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); 50. lstseznam2.setbounds(344, 38, 116, 211); // določimo območje seznama plosca.add(lstseznam2); // seznam 2 dodamo v ploščo lblseznam2 = new JLabel("Seznam2"); // oznaka seznama lblseznam2.setbounds(344, 18, 100, 20); // območje oznake 55. getcontentpane().add(lblseznam2); // oznako dodamo v ploščo lstseznam1 = new JList(imenaBarve); // ustvarimo seznam 1, prenos vrednosti iz tabele imenabarve 58. lstseznam1.setbounds(20, 40, 114, 209); // območje seznama getcontentpane().add(lstseznam1); // seznam 1 dodamo v ploščo 60. lblseznam1.setlabelfor(lstseznam1); 61. // obroba seznama 62. lstseznam1.setborder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); // način večkratnega izbora elementov 63. lstseznam1.setselectionmode(listselectionmodel.multiple_interval_selection ); JButton btnprenesi = new JButton("Prenesi =>"); // gumb prenos 66. btnprenesi.setbounds(144, 87, 190, 25); 67. // gumbu za prenos določimo poslušalca 68. btnprenesi.addactionlistener(new ActionListener() { 69. public void actionperformed(actionevent e) { 70. lstseznam2.setlistdata(lstseznam1.getselectedvalues()); 71. } 72. }); 73. getcontentpane().add(btnprenesi); // gumb dodamo v ploščo JButton btnpoistiseznamizbranih = new JButton("Po\u010Disti seznam 2"); // gumb počisti 76. btnpoistiseznamizbranih.setbounds(144, 138, 190, 25); // območje 77. // // gumbu določimo poslušalca 78. btnpoistiseznamizbranih.addactionlistener(new ActionListener() { 79. public void actionperformed(actionevent arg0) { 80. lstseznam2.setlistdata(new String[0]); // počistimo seznam } 82. }); 83. getcontentpane().add(btnpoistiseznamizbranih); // gumb dodamo v ploščo 84. } // JList // začetek izvajanja 87. public static void main(string[] args) { 88. try { INFORMATIKA, Programiranje 1 in 2 Stran 222

223 89. JList2 frame = new JList2(); // ustvarimo okno 90. frame.setvisible(true); // prikažemo okno 91. } catch (Exception e) { 92. e.printstacktrace(); 93. } // try 94. } // konec main 95. } // konec razreda JList2 Izvajanje: Obravnava dogodkov miške Slika 71: Primer izbora Dogodkovna vmesnika MouseListener in MouseMotionListener sta poslušalca dogodkov miške. Paket javax.swing.event vsebuje vmesnik (interface) MouseInputListener, ki predstavlja razširitev obeh vmesnikov MouseListener in MouseMotionListener. Ta vsebuje vse metode vmesnikov MouseListener in MouseMotionListener. Vsaka miškina odzivna metoda prejme kot argument objekt dogodka MouseEvent, ki vsebuje informacije o dogodku in koordinate lokacije dogodka (x in y koordinata). Metode in konstante razreda InputEvent (nadrazred razreda MouseEvent) določajo pritisnjen gumb (levi, desni). Vmesnik MouseListener Metode public void mousepressed( MouseEvent event ) public void mouseclicked( MouseEvent event ) public void mousereleased( MouseEvent event ) public void mouseentered( MouseEvent event ) public void mouseexited( MouseEvent event ) Metoda se izvrši ob pritisku miškinega gumba. Metoda se izvrši ob kliku miškinega gumba (pritisk in sprostitev). Metoda se izvrši ob sprostitvi miškinega gumba. Metoda se izvrši, ko se s kazalcem miške premaknemo v območje komponente. Metoda se izvrši, ko se s kazalcem miške premaknemo iz območja komponente. Vmesnik MouseMotionListener Metode Stran 223 ŠC VELENJE

224 Metode public void mousedragged( MouseEvent event ) public void mousemoved( MouseEvent event ) Metoda se izvrši ob pritisku miškinega gumba in premiku miškinega kurzurja, ko miškin gumb ostane pritisnjen. Dogodek povleci prejme komponenta, na kateri uporabnik začne dogodek povleci - spusti. Metoda se izvrši ob premiku miškinega kurzorja. Razred dogodka MouseEvent Metode int getbutton() Klik int getclickcount() Point getlocationonscreen() Point getpoint() Vrne gumb miške, ki je spremenil stanje (če se je kateri spremenil). Konstante: MouseEvent.BUTTON1 (levi gumb), MouseEvent.BUTTON2, MouseEvent.BUTTON3 (desni gumb), MouseEvent.NOBUTTON Vrne število klikov v dogodku. Vrne absolutno mesto (x,y) dogodka na zaslonu. Vrne relativno mesto (x,y) dogodka izvorne komponente. int getx() Vrne relativno mesto x-koordinate dogodka izvorne komponente. int gety() Vrne relativno mesto y-koordinate dogodka izvorne komponente. Razred modela seznama DefaultListModel Konstruktor DefaultListModel() Metode void addelement (E element) void insertelementat (E element, int indeks) void removeelementat (int indeks) void setelementat (E element, int indeks) E lastelement () E firstelement () E elementat (int indeks) int lastindexof (Object elem, int indeks) int lastindexof (Object elem) int indexof (Object elem, int indeks) int indexof (Object elem) boolean contains (Object elem) boolean isempty () int size () void setsize (int novavelikost) void copyinto (Object[] tabela) int getsize () Opis Ustvari nov model seznama. Doda nov element na konec. Vstavi nov element na mesto z določenim indeksom. Odstrani element z mesta z določenim indeksom. Določi element na mestu indeksa. Vrne zadnji element. Vrne prvi element. Vrne element na določenem indeksu. Vrne indeks zadnje pojavitve elementa od določenega indeksa naprej. Vrne indeks zadnje pojavitve elementa. Vrne indeks prve pojavitve elementa od določenega indeksa naprej. Vrne indeks prve pojavitve elementa. Preveri, če se element nahaja v seznamu. Preveri, če je seznam prazen. Vrne velikost seznama. Določi velikost seznama. Elemente seznama kopira v tabelo. Vrne število elementov seznama. Primer: Z uporabo privzetega modela seznama (DefaultListModel) omogočimo dodajanje in brisanje elementov (besedilo Element + številka) seznama. INFORMATIKA, Programiranje 1 in 2 Stran 224

225 1. /* ListModel1.java 2. * Dodajanje in brisanje elementov seznama z uporabo privzetega modela seznama - DefaultListModel */ 3. import java.awt.borderlayout; 4. import java.awt.event.actionevent; 5. import java.awt.event.actionlistener; 6. import javax.swing.defaultlistmodel; 7. import javax.swing.jbutton; 8. import javax.swing.jframe; 9. import javax.swing.jlist; 10. import javax.swing.jpanel; 11. import javax.swing.jscrollpane; 12. public class ListModel1 extends JPanel { private JList lstelementov; // seznam elementov 15. private DefaultListModel model; // model seznama 16. private int stevecelementov = 15; // števec public ListModel1() { 19. setlayout(new BorderLayout()); // določimo razporejanje 20. model = new DefaultListModel(); // ustvarimo model 21. lstelementov = new JList(model); // ustvarimo seznam privuetega modela seznama 22. JScrollPane ploscadrsnik = new JScrollPane(lstElementov); // ustvarimo ploščo z drsnikom, vsebuje seznam elementov 23. JButton btndodaj = new JButton("Dodaj"); // gumb za dodajanje 24. JButton btnodstrani = new JButton("Odstrani"); // gumb za odstranjevanje 25. for (int i = 0; i < stevecelementov; i++) // določitev začetnih elementov seznama 26. model.addelement("element " + i); // v model seznama dodamo nov element 27. // gumbu za dodajanje registriramo poslušalca 28. btndodaj.addactionlistener(new ActionListener() { 29. // metoda poslušalca 30. public void actionperformed(actionevent e) { 31. model.addelement("element " + stevecelementov); // dodamo element 32. stevecelementov++; // povečamo števec 33. } // actionperformed 34. }); // addactionlistener 35. // gumbu za odstranjevanje registriramo poslušalca 36. btnodstrani.addactionlistener(new ActionListener() { 37. public void actionperformed(actionevent e) { 38. if (model.getsize() > 0) // model vsebuje elemente 39. model.removeelementat(0); // odstranimo prvi element 40. } // actionperformed 41. }); // addactionlistener add(ploscadrsnik, BorderLayout.NORTH); // v severno področje dodamo ploščo z drsnikom, ki vsebuje seznam elementov 44. add(btndodaj, BorderLayout.WEST); // v zahodno področje dodamo gumb dodaj 45. add(btnodstrani, BorderLayout.EAST); // v vzhodno področje dodamo gumb odstrani 46. } public static void main(string s[]) { 49. JFrame okno = new JFrame("Dodajanje in brisanje elementov seznama"); // ustvarimo okno 50. okno.setdefaultcloseoperation(jframe.exit_on_close); 51. okno.setcontentpane(new ListModel1()); // določimo elemente okna 52. okno.setsize(260, 200); // velikost okna 53. okno.setvisible(true); // prikažemo okno Stran 225 ŠC VELENJE

226 54. } // main 55. } // konec razred ListModel1 Izvajanje: Slika 72: Dodajanje in brisanje elementov seznama Primer: V seznamu ustvarimo evidenco vseh miškinih dogodkov v levi plošči (JPanel). Slika 73: Evidenca dogodkov miške 1. /* MisDogodki1.java 2. * Primer, dogodki miške */ 3. package vaje; 4. import java.awt.event.mouseevent; 5. import java.awt.event.mouselistener; 6. import java.awt.event.mousemotionlistener; 7. import javax.swing.defaultlistmodel; 8. import javax.swing.jframe; 9. import javax.swing.jlist; 10. import javax.swing.jpanel; 11. import javax.swing.jscrollpane; 12. import javax.swing.border.bevelborder; INFORMATIKA, Programiranje 1 in 2 Stran 226

227 13. import javax.swing.border.emptyborder; 14. import javax.swing.jlabel; 15. import javax.swing.border.lineborder; 16. import java.awt.color; 17. import java.awt.window.type; public class MisDogodki1 extends JFrame { private JPanel plosca; //plošča okna 22. private String opis; // besedilo dogodka 23. private JList lstdogodki; // seznam dogodkov 24. private JPanel panelmiska; // področje prestrezanja dogodkov miške 25. private DefaultListModel lstmodel; // privzeti model za dodajanje elementov v seznam // konstruktor, izdelava grafičnega vmesnika 28. public MisDogodki1() { 29. settitle("dogodki, miška"); //nsalov 30. setdefaultcloseoperation(jframe.exit_on_close); 31. plosca = new JPanel(); // ustvarimo ploščo okna 32. plosca.setborder(new EmptyBorder(5, 5, 500, 500)); // območje plošče 33. plosca.setlayout(null); // absolutna razporeditev 34. setcontentpane(plosca); panelmiska = new JPanel(); // ustvarimo ploščo 37. panelmiska.setborder(new LineBorder(new Color(0, 0, 0), 1, true)); // določimo obrobo 38. panelmiska.setbounds(10, 51, 251, 252); // določimo območje plošče MisPoslusalec misposlusalec = new MisPoslusalec(); // ustvarimo objekt poslušalca 41. panelmiska.addmouselistener(misposlusalec); // plošči dodamo poslušalca 42. panelmiska.addmousemotionlistener(misposlusalec); // plošči dodamo poslušalca 43. panelmiska.setlayout(null); plosca.add(panelmiska); // ploščo vstavimo v ploščo okna lstmodel = new DefaultListModel<String>(); // ustvarimo objekt modela JScrollPane scrollpane = new JScrollPane(); // ustvarimo drsnik 50. scrollpane.setbounds(271, 51, 224, 252); // območje drsnika 51. plosca.add(scrollpane); // drsnik vstavimo v ploščo lstdogodki = new JList(lstModel ); // ustvarimo seznam 54. scrollpane.setviewportview(lstdogodki); // seznam vstavimo v drsnik 55. lstdogodki.setborder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); // seznamu določimo obrobo 56. lstdogodki.setvalueisadjusting(true); JLabel lbploscamiska = new JLabel("Podro\u010Dje evidence dogodkov mi\u0161ke"); // ustvarimo oznako plošče 59. lbploscamiska.setlabelfor(panelmiska); 60. lbploscamiska.setbounds(10, 35, 192, 14); // območje oznake 61. plosca.add(lbploscamiska); // ploščo vstavimo v ploščo ikna JLabel lbldogodkimiske = new JLabel("Zaporedje dogodkov"); // ustvario oznako seznama 64. lbldogodkimiske.setlabelfor(scrollpane); Stran 227 ŠC VELENJE

228 65. lbldogodkimiske.setbounds(271, 35, 204, 14); // območje oznake 66. plosca.add(lbldogodkimiske); // oznako vstavimo v ploščo ikna 67. } // konstruktor MisDogodki private class MisPoslusalec implements MouseListener, MouseMotionListener { public void mousedragged(mouseevent e) { } // vlek public void mousemoved(mouseevent e) { } // premik public void mouseclicked(mouseevent e) { // klik 77. opis = "Klik, mesto, x: " + e.getx() + ", y: " + e.gety() + "."; // določimo opis mesta klika 78. lstmodel.addelement(opis); // opis dodamo v model seznama // gotovimo kateri gumb je spremenil stanje v dogodku 81. if (e.getbutton() == MouseEvent.BUTTON1) { // levi 82. opis = "Gumb 1"; // določimo opis gumba 83. lstmodel.addelement(opis); // opis dodamo v model seznama 84. } // if 85. if (e.getbutton() == MouseEvent.BUTTON2) { 86. opis = "Gumb 2"; 87. lstmodel.addelement(opis); 88. } // if 89. if (e.getbutton() == MouseEvent.BUTTON3 && e.ismetadown()) { 90. opis = "Gumb 3"; 91. lstmodel.addelement(opis); 92. } // if 93. } // mouseclicked public void mouseentered(mouseevent e) { // vstop v območje plošče 96. opis = "Vstop, mesto, x: " + e.getx() + ", y: " + e.gety() + "."; // določimo opis dogodka 97. lstmodel.addelement(opis); // opis dodamo v model seznama 98. } // mouseentered public void mouseexited(mouseevent e) { // izhod iz območja plošče 101. opis = "Izhod, mesto, x: " + e.getx() + ", y: " + e.gety() + "."; // določimo opis dogodka 102. lstmodel.addelement(opis); /// opis dodamo v model seznama 103. } // mouseexited public void mousepressed(mouseevent e) { // pritisk 106. opis = "Pritisk, mesto, x: " + e.getx() + ", y: " + e.gety() + "."; // določimo opis mesta dogodka 107. lstmodel.addelement(opis); // opis dodamo v model seznama 108. } public void mousereleased(mouseevent e) { // sprostitev 111. opis = "Sproščen gumb, x: " + e.getx() + ", y: " + e.gety() + "."; // določimo opis mesta dogodka 112. lstmodel.addelement(opis); // opis dodamo v model seznama 113. } 114. } // MisObravnava // začetek izvajanja 117. public static void main(string[] args) { 118. try { 119. MisDogodki1 frame = new MisDogodki1(); // ustvarimo grafični vmesnik INFORMATIKA, Programiranje 1 in 2 Stran 228

229 120. frame.setvisible(true); // prikažemo okno 121. } catch (Exception e) { 122. e.printstacktrace(); 123. } // try 124. } // main 125. } // konec razreda MisDogodki1 Izvajanje: Slika 74: Evidenca med izvajanjem Primer: Oglejmo si primer risanja sledi miške. 1. /* SledMiske1.java 2. * Risanje sledi miške. */ 3. import java.awt.graphics; 4. import java.awt.point; 5. import java.awt.event.mouseevent; 6. import java.awt.event.mousemotionadapter; 7. import javax.swing.jpanel; public class SledMiske1 extends JPanel { 10. private int stevectock = 0; // števec 11. private Point[] koordinate = new Point[ ]; // tabela točk public SledMiske1() { 14. // poslušalec 15. addmousemotionlistener( 16. // implementacija adapterja MouseMotionAdapter 17. new MouseMotionAdapter() 18. { 19. // metoda vlek miške Stran 229 ŠC VELENJE

230 20. public void mousedragged( MouseEvent dogodek ) 21. { 22. if ( stevectock < koordinate.length ) // števec manjši od velikosti tabele 23. { 24. koordinate[ stevectock ] = dogodek.getpoint(); // shranimo točko stevectock; // povečamo števec točk 26. repaint(); // osvežimo izris 27. } // if 28. } // mousedragged 29. }); // addmousemotionlistener 30. } // razred SledMiske // metoda za izris plošče 33. public void paintcomponent( Graphics g ) 34. { 35. super.paintcomponent( g ); // počistimo območje risanja 36. for ( int i = 0; i < stevectock; i++ ) // za vse točke tabele 37. g.filloval(koordinate[ i ].x, koordinate[ i ].y, 3, 3 ); // izrišemo pravokotnik z okroglimi robovi 38. } // paintcomponent } // konec razred SledMiske1 1. /* SledMiske2.java 2. * Testni razred za risanje sledi miške. */ 3. import java.awt.borderlayout; 4. import javax.swing.jframe; 5. import javax.swing.jlabel; public class SledMiske2 { public static void main(string[] args) { 10. JFrame okno = new JFrame( "Risanje sledi miške" ); // ustvarimo okno 11. SledMiske1 ploscarisi = new SledMiske1(); // ustvarimo ploščo za risanje 12. okno.getcontentpane().add( ploscarisi, BorderLayout.CENTER ); // v sredino okna postavimo ploščo risanja // na dno dodamo znako 13. okno.getcontentpane().add( new JLabel( "Rišite z vlekom miške." ),BorderLayout.SOUTH ); 14. okno.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); 15. okno.setsize( 400, 200 ); // določimo velikost okna 16. okno.setvisible( true ); // prikažemo okno 17. } // main 18. } // konec razred SledMiske2 Primer izvajanja: INFORMATIKA, Programiranje 1 in 2 Stran 230

231 Slika 75: Risanje sledi miške Obravnava dogodkov tipkovnice Poslušalec dogodkov tipkovnice je vmesnik (interface) KeyListener. Dogodki tipkovnice se ustvarijo ob pritisku in sprostitvi tipke na tipkovnici. Razred, ki implementira KeyListner mora vsebovati metode keypressed, keyreleased in keytyped. Vse metode imajo argument razreda KeyEvent, ki je naslednik razreda InputEvent. Razred KeyEvent Metode int getkeycode () Vrne celoštevilčno vrednost kode znaka. char getkeychar () Vrne vrednost znaka. static String getkeytext (int kodaznaka) Vrne besedilo opisa kode znaka ("HOME", "F5", "H" ). boolean isactionkey () int getmodifiers () Vrne masko posebnih gumbov (Ctrl, Alt, Shift...). Primer: Besedilnemu vnosnemu polju določimo poslušalca dogodkov tipkovnice. Kodo pritisnjenih tipk prikažimo v seznamu, ki je vstavljen v ploščo z drsnikom. 1. /* KeyPressed1.java 2. * Seznam prikazuje informacije pritisnjenih tipk v besedilnem polju. */ 3. import java.awt.borderlayout; 4. import java.awt.event.keyadapter; 5. import java.awt.event.keyevent; import javax.swing.defaultlistmodel; 8. import javax.swing.jlist; 9. import javax.swing.jpanel; 10. import javax.swing.jscrollpane; 11. import javax.swing.jtextfield; // nov razred izpeljemo iz razreda JPanel 14. public class KeyPressed1 extends JPanel { 15. private JTextField txttestpritiskatipk; // besedilno polje 16. private DefaultListModel model = new DefaultListModel(); // model seznama, vstavljanje v komponento seznama 17. private JScrollPane ploscadrsnik = new JScrollPane(); // plošča z drsnikom 18. private String opisposebnetipke; // opis posebnih tipk (Ctrl, Shift...) Stran 231 ŠC VELENJE

232 19. // ustvarimo vmesnik 20. public KeyPressed1() { 21. setlayout(new BorderLayout(0, 0)); 22. txttestpritiskatipk = new JTextField(); // ustvarimo besedilno vnosno polje 23. txttestpritiskatipk.settext("test pritiska tipk"); // začetna vrednost polja 24. txttestpritiskatipk.setcolumns(50); // največje število znakov polja 25. // registracija poslušalca dogodkov tipkovnice 26. txttestpritiskatipk.addkeylistener(new KeyAdapter() { 27. // odzivna metoda pritisk tipke 28. public void keypressed(keyevent dogodek) { 29. // v model seznama dodamo opis dogodka 30. model.addelement("tipka: " + dogodek.getkeychar() + "; koda: " + dogodek.getkeycode()); // ugotovimo pritisnjeno tipko 31. opisposebnetipke = dogodek.getkeymodifierstext( dogodek.getmodifiers() ); // ugotovimo opis posebnih tipk 32. model.addelement("opis: " + opisposebnetipke); 33. } // keypressed 34. }); // addkeylistener add(txttestpritiskatipk, BorderLayout.NORTH); //razporeditev besedilnega poljana vrh razporejevalnika 37. add(ploscadrsnik); // v razporejevalnik dodamo ploščo 38. JList list = new JList(model); // ustvarimo nov seznam 39. list.setenabled(false); // onemogočimo seznam 40. ploscadrsnik.setviewportview(list); // seznam vstavimo v ploščo z drsnikom 41. } // KeyPressed } // konec razred KeyPressed1 1. /* KeyPressed2.java 2. * Testni razred + ustvarjanje okna */ 3. import java.awt.borderlayout; 4. import javax.swing.jframe; public class KeyPressed2 { public static void main(string[] args) { 9. JFrame okno=new JFrame("Dogodki tipkovnice"); // ustvarimo okno 10. KeyPressed1 plosca = new KeyPressed1(); // ustvarimo pološč z informacijami dogodkov tipkovnice 11. okno.getcontentpane().add(plosca,borderlayout.center); // razporeditev plošče v razporejevalnik okna 12. okno.setdefaultcloseoperation(jframe.exit_on_close); 13. okno.setsize(500, 500); // določitev velikosti okna 14. okno.setvisible(true); // prikaz okna 15. } // main } // konec razreda KeyPressed2 Primer izvajanja: INFORMATIKA, Programiranje 1 in 2 Stran 232

233 Slika 76: Evidenca dogodkov tipkovnice Razporejevalniki Načini razporeditve: Za razporeditev komponent lahko uporabimo enega izmed razporejevalnikov (angl. Layout Manager). Razporejevalnik samodejno razporeja komponente znotraj predvidenih področij vsebnika (angl. Container). Vsak objekt vsebnika ima povezan razporejevalnik. Razporejevalnik je objekt razreda, ki implementira LayoutManager vmesnik (interface). Če uporabimo absolutno razporejanje, potem mesto in velikost komponent določamo sami. Uporabimo metode razreda Component kot so setsize, setlocation ali setbounds. Ta način pogosto uporabimo za izdelavo vmesnika z uporabo IDE orodij, ki podpirajo vstavljanje komponent iz orodjarne komponent v grafični vmesnik programa. Primer: Z uporabo razporejevalnikov ustvarimo grafični vmesnik kot je prikazan na sliki. Slika 77: Izgled vmesnika z razporejevalnikom Stran 233 ŠC VELENJE

234 1. /* LayoutPrimer1.java 2. * Uporaba razporejevalnikov */ 3. package vaje; 4. import java.awt.borderlayout; 5. import java.awt.color; 6. import java.awt.flowlayout; 7. import java.awt.gridlayout; 8. import java.awt.event.windowadapter; 9. import java.awt.event.windowevent; import javax.swing.jbutton; 12. import javax.swing.jframe; 13. import javax.swing.jlabel; 14. import javax.swing.jpanel; public class LayoutPrimer1 { 17. private JFrame osnovnookno; // osnovno okno 18. private JLabel lblglava; // oznaka glava 19. private JLabel lblstatus; // oznaka status 20. private JPanel plosca; // plošča public LayoutPrimer1(){ 23. osnovnookno = new JFrame("Uporaba razporejevalnikov"); // ustvarimo okno 24. osnovnookno.setsize(300,300); // določimo velikost okna 25. osnovnookno.setlayout(new GridLayout(3, 1)); // določimo razporejevalnik, mrežna razporeditev, 3 vrstice, 1 stolpec lblglava = new JLabel("Glava",JLabel.CENTER ); // ustvarimo prazno oznako glave 28. lblstatus = new JLabel("Status",JLabel.CENTER); // ustvarimo prazno sredinsko oznako lblstatus.setsize(350,100); // določimo velikost statusne oznake 31. // registriramo poslušalca 32. osnovnookno.addwindowlistener(new WindowAdapter() { 33. // odzivna metoda ob zapiranju okna 34. public void windowclosing(windowevent windowevent){ 35. System.exit(0); // izhod 36. } 37. }); // addwindowlistener 38. plosca = new JPanel(); // ustvarimo ploščo 39. plosca.setlayout(new FlowLayout()); // določitev razporejevalnika 40. // razporeditev komponent 41. osnovnookno.add(lblglava); // v 1. vrstico vstavimo oznako glave 42. osnovnookno.add(plosca); // v 2. vrstico vstavimo ploščo 43. osnovnookno.add(lblstatus); // v 3. vrstico vstavimo oznako statusa 44. osnovnookno.setvisible(true); // prikažemo okno 45. } // LayoutPrimer public static void main(string[] args){ 48. LayoutPrimer1 borderlayout = new LayoutPrimer1(); // ustvarimo vmesnik 49. borderlayout.borderlayoutprimer(); // z metodo dodatno določimo vsebino vmesnika 50. } // main private void borderlayoutprimer(){ 53. lblglava.settext("področja razporejevalnika BorderLayout"); // določimo vsebino besedila v oznaki glave 54. INFORMATIKA, Programiranje 1 in 2 Stran 234

235 55. JPanel notranjaplosca = new JPanel(); // ustvarimo novo ploščo 56. notranjaplosca.setbackground(color.darkgray); // določimo ozadje 57. notranjaplosca.setsize(300,300); // določimo velikost 58. BorderLayout layout = new BorderLayout(); // ustvarimo nov razporejevalnik BorderLayout 59. layout.sethgap(2); // določimo vodoravni razmik 60. layout.setvgap(2); // določimo vodoravni razmik 61. notranjaplosca.setlayout(layout); // plošči določimo razporejenje // na notranji plošči razporedimo nove gumbe v področja razporejanja 64. notranjaplosca.add(new JButton("Center"),BorderLayout.CENTER); 65. notranjaplosca.add(new JButton("Line Start"),BorderLayout.LINE_START); 66. notranjaplosca.add(new JButton("Line End"),BorderLayout.LINE_END); 67. notranjaplosca.add(new JButton("East"),BorderLayout.EAST); 68. notranjaplosca.add(new JButton("West"),BorderLayout.WEST); 69. notranjaplosca.add(new JButton("North"),BorderLayout.NORTH); 70. notranjaplosca.add(new JButton("South"),BorderLayout.SOUTH); 71. plosca.add(notranjaplosca); // na ploščo vstavimo notranjo ploščo 72. osnovnookno.setvisible(true); // prikažemo okno 73. } // borderlayoutprimer 74. } // konec razreda BorderLayout1 Primer izvajanja: Slika 78: Delovanje razporejevalnika 16 VHODNO IZHODNE OPERACIJE 16.1 Vhodno izhodne operacije Podatki shranjeni v spremenljivkah in tabelah so začasni in so na voljo le med izvajanjem programa. Podatke zato shranjujemo v zbirke podatkov in dokumente. Dokumente uporabljamo tudi za pisanje raznih dopisov in izračunov. Najprej si bomo ogledali, kako v Javi delamo z dokumenti. Kasneje pa bomo spoznali tudi, kako uporabljamo podatke v zbirki podatkov. Vhodno izhodni tokovi Java obravnava dokumente kot zaporedje zlogov (angl. byte). Zlogovni tokovi omogočajo branje in pisanje podatkov v binarni obliki. Druga možnost je uporaba znakovnih tokov. ki omogočajo branje in pisanje v obliki posameznih znakov. Stran 235 ŠC VELENJE

236 Npr. če želimo shraniti vrednost 6, potem se v zlogovni tokovni obliki shrani kot binarna vrednost števila , v znakovni tokovni obliki pa kot vrednost znaka (54 znak v kodni tabeli). Dokumenti, ki jih ustvarimo v zlogovni tokovni obliki predstavljajo binarne dokumente, dokumenti ustvarjeni z znakovno tokovno obliko pa besedilni dokumenti. Standardni vhod (Standard Input), standardni izhod (Standard Output), standardne napake (Standard Error) V Javi odpremo datoteko z ustvarjanjem objekta ustreznega podatkovnega toka zlogov ali znakov. Konstruktor komunicira z operacijskim sistemom, da odpre dokument. Ko odpremo program, ta ustvari tri podatkovne tokove, ki so povezani z napravami: System.in, System.out ter System.err. System.in (angl. standard input stream object) predstavlja vhodni podatkovni tok in omogoča branje vnesenih zlogov podatkov (tipkovnica); System.out (angl. standard output stream object) predstavlja izhodni podatkovni tok, ki je prikazan na zaslon; System.err (angl. standard error stream object) omogoča izpisovanje sporočil o napakah na zaslon. Vsak podatkovni tok lahko preusmerimo, kar omogoča branje iz različnih virov podatkov.razred System vsebuje metode za preusmeritev standardnih podatkovnih tokov in sicer: setin, setout in seterr. Paket java.io Razredi za obdelavo datotek oz. dokumentov se nahajajo v paketu java.io. Paket java.io vsebuje razrede: FileInputStream (branje zlogov iz datoteke), FileOutputStream (zapisovanje zlogov v datoteko), FileReader (branje znakov iz datoteke), FileWriter (zapisovanje znakov v datoteko). INFORMATIKA, Programiranje 1 in 2 Stran 236

237 Stran 237 ŠC VELENJE

238 Slika 79: Paket java.io Dodatna razreda Scanner in Formatter pogosto uporabimo za vhodno-izhodne operacije (znakovni tok). Razred Scanner je pretežno namenjen vnosu podatkov (tipkovnica), lahko pa ga tudi uporabimo za branje podatkov iz datoteke. Razred Formatter podpira oblikovanje izhoda besedilnega toka podobno kot metoda System.out.printf Razred File Razred File je namenjen pridobivanju podatkov o dokumentih in mapah na disku. Razred ne podpira obdelave dokumentov ali odpiranja dokumentov. Za to uporabimo druge razrede. Če je pot v konstruktorju podana v relativni obliki, potem je izhodiščno mesto mapa programa, ki smo ga odprli. Razred File Konstruktor File(String potime) File(URI uripot) File(String stars, String otrok) Metode boolean canread() boolean canwrite() boolean exists() boolean isfile() boolean isdirectory() boolean isabsolute() String getabsolutepath() String getname() String getpath() String getparent() long length() long lastmodified() String[] list() Opis Ustvari nov dokument. Parameter določa pot in ime dokumenta. Ustvari nov dokument. Parameter določa pot in ime dokumenta v URI obliki. Primer URI poti (windows): file://c:/podatki.txt. Ustvari nov dokument. stars - mesto oz. lokacija; otrok - ime mape ali dokumenta Vrne stanje možnosti branja dokumenta. Vrne stanje možnosti pisanja v dokument. Vrne stanje obstoja dokumenta. Vrne stanje, če je objekt dokument. Vrne stanje, če je objekt mapa. Vrne stanje, če je bil objekt razreda ustvarjen z absolutno potjo. Vrne vrednost absolutne poti. Vrne vrednost imena. Vrne pot. Vrne pot nadrejene mape. Vrne velikost dokumenta v zlogih. Vrne čas zadnje spremembe. Vrne tabelo z vsebino mape. Vrne false, če objekt ni mapa. Primer: Uporaba razreda File za prikaz vsebine mape. 1. /* File1.java 2. * Izpis vsebine mape */ 3. import java.io.file; 4. import java.util.scanner; public class File1 { 7. public static void main( String[] args ) 8. { 9. Scanner vhod = new Scanner( System.in ); // objekt za branje 10. System.out.print( "Ime dokumenta ali mape: " ); // obvestilo 11. String dokument = vhod.nextline(); // branje vrstice 12. infodokument(dokument); // klic metode infodokument 13. } // main // info dokumenta INFORMATIKA, Programiranje 1 in 2 Stran 238

239 16. public static void infodokument( String pot ) { 17. File dokument = new File(pot); // ustvarimo nov objekt razreda File 18. if (dokument.exists()) //če obstaja dokument 19. { // izpis informacij 20. System.out.printf("Ime dokumenta oz. mape: %s \n", dokument.getname() ); 21. if (dokument.isfile()) // preverimo če je datoteka 22. System.out.printf("Vrsta dokumenta: datoteka \n)",null); 23. else // je mapa 24. { 25. System.out.printf("Vrsta dokumenta: mapa \n",null); 26. String [] vsebina = dokument.list(); // ustvarimo tabelo z vsebino mape 27. // izpis tabele 28. System.out.printf("Vsebina mape: \n",null); 29. for (String ime : vsebina) // vsi elementi tabele 30. System.out.printf("%s\n",ime); 31. } // else 32. } // if 33. } // infodokument } // razred File1 Primer izvajanja: Ime dokumenta ali mape: C:\eclipse Ime dokumenta oz. mape: eclipse Vrsta dokumenta: mapa Vsebina mape:.eclipseproduct artifacts.xml configuration dropins eclipse.exe eclipse.ini eclipsec.exe features p2 plugins readme 16.3 Besedilni dokumenti (txt) Aktivnost Branje Pisanje Opis Vsebino besedilnega dokumenta beremo z uporabo metod objekta razreda Scanner. Vsebino besedilnega dokumenta ustvarjamo oz. spreminjamo z uporabo metod objekta razreda Formatter ali PrintWriter Branje Ustvarimo vhodni objekt razreda Scanner s konstruktorjem, ki ima v parametru objekt razreda File. Scanner branjedokument = new Scanner( new File("ImeDokumenta.txt") ); Do vrednosti dokumenta dostopamo z metodami nextint(), nextdouble()... razreda Scanner. Stran 239 ŠC VELENJE

240 int stevilo1, stevilo2; double stevilo3; stevilo1 = branjedokument.nextint(); // branje celoštevilčne vrednosti stevilo2 = branjedokument.nextint(); // branje celoštevilčne vrednosti stevilo3 = branjedokument.nextdouble(); // branje decimalne vrednosti Zapremo dokument z metodo close(). branjedokument.close(); // zapremo besedilni dokument Pisanje (razred Formatter) Ustvarimo vhodni objekt razreda Formatter. Formatter izhod = new Formatter(imeDatoteke); // ustvarimo nov dokument z imenom parametra Vrednosti v besedilni dokument zapisujemo z metodo format() razreda Formatter. format(string oblika, Object... argumenti) // enaka oblikovna določila kot pri metodi printf Zapremo dokument z metodo close(). izhod.close(); // zapremo besedilni dokument Razred Formatter Konstruktor Formatter (File objektdokumenta) Formatter (String imedokumenta)... Metode format(string oblika, Object... argumenti) flush() close() Ustvari objekt besedilnega dokumenta. Parameter določa objekt razreda File. Ustvari objekt besedilnega dokumenta. Parameter določa ime dokumenta. Oblikovani niz zapiše v objekt dokumenta. Obdelaj (izprazni) podatkovni tok. Zapre dokument. 1. /* UstvariTxtDatoteko.java 2. * Razred za ustvarjanje in pisanje v datoteko */ 3. import java.io.filenotfoundexception; 4. import java.util.formatter; 5. import java.util.formatterclosedexception; 6. import java.util.scanner; public class UstvariTxtDatoteko { 9. private String imedatoteke; // ime datoteke 10. private Formatter izhod; // objekt razreda za pisanje v datoteko public UstvariTxtDatoteko(String imedatoteke) { 13. this.imedatoteke = imedatoteke; 14. try { 15. izhod = new Formatter(imeDatoteke); // ustvarimo nov dokument z imenom parametra 16. } 17. catch (SecurityException e) { // nimamo pravice ustvariti dokument 18. System.err.println("Nimate pravice ustvarjati dokumentov."); 19. System.exit(-1); // izhod iz programa 20. } 21. catch (FileNotFoundException e) { // dokument ne obstaja 22. System.out.print("Neuspešno ustvarjanje datoteke."); INFORMATIKA, Programiranje 1 in 2 Stran 240

241 23. System.exit(-1); 24. } // try 25. } // UstvariTxtDatoteko public void pisivdatoteko() { 28. Osebe oseba = new Osebe(); // ustvarimo osebo 29. Scanner vhod = new Scanner (System.in); // objekt za vnos s tipkovnice 30. System.out.printf("Vnos oseb (konec vnosa Ctrl+Z)\n", null); // ctrl+z konec vnosa (windows) 31. // obvestilo za vnos 32. System.out.printf("Vnesite ime, priimek in emšo \n :> ", null); 33. while (vhod.hasnext()) { // dokler uporabnik ne zaključi vnosa s Ctrl+Z 34. try { 35. // branje podatkov 36. oseba.dolociime(vhod.next()); 37. oseba.dolocipriimek(vhod.next()); 38. oseba.dolociemso(vhod.next()); 39. // zapisovanje v besedilno datoteko 40. izhod.format("%s %s %s\n", oseba.vrniime(), oseba.vrnipriimek(), oseba.vrniemso()); 41. } 42. catch (FormatterClosedException e) { // objekt zapisovanja zaprt 43. System.err.printf("Napaka pri pisanju v dokument.",null); 44. } // FormatterClosedException 45. // obvestilo za naslednji vnos 46. System.out.printf("Vnesite ime, priimek in emšo \n :> ", null); 47. } // while 48. } // pisivdatoteko public void zapridatoteko() { 51. if (izhod!= null) // če obstaja datoteka 52. izhod.close(); // zapremo datoteko 53. } // zapridatoteko } // konec razred UstvariTxtDatoteko 1. /* TestUstvariTxtDatoteko.java 2. * Testni razred za ustvarjanje datoteke */ 3. public class TestUstvariTxtDatoteko { public static void main(string[] args) { 6. UstvariTxtDatoteko datoteka = new UstvariTxtDatoteko("osebe.txt"); // ustvarimo objekt dokumenta 7. datoteka.pisivdatoteko(); // klic metode za shranjevanje v besedilni dokument 8. datoteka.zapridatoteko(); // klic metode za zapiranje datoteke 9. } // main } // konec razreda TestUstvariTxtDatoteko Primer izvajanja: Vnos oseb (konec vnosa Ctrl+Z) Vnesite ime, priimek in emšo :> Ana Kos Vnesite ime, priimek in emšo :> Žak Fak Vnesite ime, priimek in emšo :> Bob Jan Stran 241 ŠC VELENJE

242 Vnesite ime, priimek in emšo :> 1. /* BeriTxtdatoteko.java 2. * Razred za branje besedilne datoteke */ 3. import java.io.file; 4. import java.io.filenotfoundexception; 5. import java.util.nosuchelementexception; 6. import java.util.scanner; public class BeriTxtdatoteko { 10. private Scanner vhod; // objekt za branje 11. private String datoteka; // ime dokumenta // določitev začetne vrednosti 14. public BeriTxtdatoteko(String datoteka) { 15. this.datoteka = datoteka; 16. } // BeriTxtdatoteko public void odpridatoteko() { 19. try { 20. // določimo dokument za branje 21. vhod = new Scanner (new File(datoteka)); 22. } // try 23. catch (FileNotFoundException e) { 24. System.out.printf("Napaka => dokument ne obstaja.", null); // izpis napake 25. System.exit(-1); // konec izvajanja 26. } // catch 27. } // odpridatoteko public void beridatoteko() { 30. Osebe oseba = new Osebe(); // ustvarimo objekt za branje 31. System.out.printf("\t Ime \t Priimek \t Emšo \n", null); // izpis naslovne vrstice 32. try { 33. while (vhod.hasnext()) { 34. // branje iz datoteke 35. oseba.dolociime(vhod.next()); 36. oseba.dolocipriimek(vhod.next()); 37. oseba.dolociemso(vhod.next()); 38. // izpis na zaslon 39. System.out.printf("\t %s \t %s \t %s \n", oseba.vrniime(),oseba.vrnipriimek(), oseba.vrniemso()); } // while 42. } // try 43. catch (NoSuchElementException e) { } // NoSuchElementException } // beridatoteko public void zapridatoteko() { 50. if (vhod!= null) // če obstaja datoteka 51. vhod.close(); // zapremo datoteko 52. } // zapridatoteko INFORMATIKA, Programiranje 1 in 2 Stran 242

243 } // konec razreda BeriTxtdatoteko 1. /* TestBeriTxtDatoteko.java 2. * Testni razred za branje datoteke */ 3. public class TestBeriTxtDatoteko { public static void main(string[] args) { 6. BeriTxtdatoteko datoteka = new BeriTxtdatoteko("osebe.txt"); 7. datoteka.odpridatoteko(); // klic metode za odpiranje dokumenta 8. datoteka.beridatoteko(); // klic metode za branje 9. datoteka.zapridatoteko(); // klic metode za zapiranje dokumenta 10. } // main } // konec razreda TestBeriTxtDatoteko Primer izvajanja: Ime Priimek Emšo Ana Kos Žak Fak Bob Jan Serializacija Pri shranjevanju podatkov v besedilne datoteke izgubimo informacijo o podatkovnih tipih. Npr. vrednost 3 v besedilnem dokumentu lahko predstavlja celo število (integer) 3 ali znak (char) 3. V določenih primerih želimo v datoteko zapisati in brati vrednosti objektov. Java omogoča zapisovanje objektov z mehanizmom, ki ga imenujemo serializacija (angl. serialization). Objekti v datoteki so predstavljeni kot zaporedje zlogov, ki vsebujejo podatke objektov in informacije o tipu objekta. Postopek zapisa objekta v datoteko imenujemo serializacija, postopek branja zapisanega objekta iz datoteka pa deserializacija. Objekte s serializacijo pretvorimo v podatkovni tok zlogov, ki ga lahko shranimo v datoteko, pošljemo preko omrežja ipd. Serializirane objekte lahko obnovimo oz. rekonstruiramo iz serializiranega podatkovnega toka. Serializiramo lahko objekte razredov, ki imajo implementiran vmesnik Serializable Postopek serializacije v datoteko Ustvarimo objekt razreda ObjectOutputStream s konstruktorjem ObjectOutputStream(OutputStream izhodnitok). V konstruktorju za parameter uporabimo objekt razreda FileOutputStream, ki podpira zapisovanje podatkov v datoteko. Razred ObjectOutputStream vsebuje več metod za zapisovanje različnih podatkovnih tipov. Najbolj uporabna je metoda writeobject(object objekt). Metoda serializira objekt in ga zapiše v izhodni tok. Razred ObjectOutputStream Konstruktor ObjectOutputStream(OutputStream izhodnitok)... Metode void writeobject(object objekt) flush() Stran 243 Ustvari objekt izhodnega toka podatkov. Parameter določa vrsto izhodnega toka. Serializira objekt in ga zapiše v podatkovni tok. Obdela (izprazni) podatkovni tok. ŠC VELENJE

244 close()... Zapre tok podatkov. 1. /* OsebeSerializacijaD1.java 2. * Demonstracija serializacije */ 3. import java.io.fileoutputstream; 4. import java.io.ioexception; 5. import java.io.objectoutputstream; public class OsebeSerializacijaD1 8. { 9. public static void main(string [] args) 10. { 11. // ustvarimo in inicializiramo objekt osebe, Razred osebe implementira vmesnik (interface) Serializable 12. Osebe oseba = new Osebe(); 13. oseba.dolociime( "borut"); 14. oseba.dolocipriimek( "kos"); 15. oseba.dolociemso(" "); 16. try 17. { 18. FileOutputStream datoteka = new FileOutputStream("osebeDemo.ser"); // ustvarimo dokument (izhodni podatkovni tok) 19. ObjectOutputStream izhod = new ObjectOutputStream(datoteka); // ustvarimo objekt razreda ObjectOutputStream 20. izhod.writeobject(oseba); // objekt oseba zapišemo v datoteko, ki predstavlja izhodni tok 21. izhod.close(); // zapremo izhodni podatkovni tok 22. datoteka.close(); // zapremo datoteko 23. System.out.printf("Podatki so zapisani v datoteko osebedemo.ser"); // izpišemo obvestilo 24. } catch(ioexception i) // IOException izjema 25. { 26. i.printstacktrace(); // izpišemo sled sklada 27. } // catch 28. } // main 29. } // konec razreda OsebeSerializacijaD Postopek deserializacije iz datoteke Ustvarimo objekt razreda ObjectInputStream s konstruktorjem ObjectInputStream(InputStream vhodnitok). V konstruktorju za parameter uporabimo objekt razreda FileInputStream, ki podpira branje podatkov iz datoteke. Uporabimo metodo readobject(object objekt), ki prebere naslednji objekt iz toka podatkov in ga deserializira. Vrednost metode je tipa Object, ki ga s pretvorbenim operatorjem pretvorimo v ustrezen podatkovni tip. Razred ObjectInputStream Konstruktor ObjectInputStream(InputStream vhodnitok)... Metode Object readobject() flush() close()... Ustvari objekt vhodnega toka podatkov. Parameter določa vrsto vhodnega toka. Prebere naslednji objekt iz vhodnega toka. Obdela (izprazni) podatkovni tok. Zapre tok podatkov. INFORMATIKA, Programiranje 1 in 2 Stran 244

245 1. /* OsebeSerializacijaD1.java 2. * Demonstracija deserializacije */ 3. import java.io.fileinputstream; 4. import java.io.ioexception; 5. import java.io.objectinputstream; public class OsebeDeserializacijaD1 8. { 9. public static void main(string [] args) 10. { Osebe oseba = null; // ustvarimo objekt osebe 13. try 14. { 15. FileInputStream datoteka = new FileInputStream("osebeDemo.ser"); // ustvarimo objekt dokumenta (vhodni podatkovni tok) 16. ObjectInputStream vhod = new ObjectInputStream(datoteka); // ustvarimo objekt razreda ObjectInputStream 17. oseba = (Osebe) vhod.readobject(); // objekt oseba preberemo iz vhodnega toka 18. vhod.close(); // zapremo vhodni podatkovni tok 19. datoteka.close(); // zapremo datoteko 20. System.out.printf("Ime in priimek: %s %s, emšo: %s.",oseba.vrniime(), oseba.vrnipriimek(), oseba.vrniemso()); // izpišemo podatke o osebi 21. } catch(ioexception i) // IOException izjema 22. { 23. i.printstacktrace(); // izpišemo sled sklada 24. } // catch 25. catch (ClassNotFoundException e) { 26. e.printstacktrace(); 27. } // catch 28. } // main 29. } // konec razreda OsebeDeserializacijaD1 Primer: Izdelajmo primer serializacije in deserializacije razreda osebe. 1. /* OsebeSer.java 2. * Razred osebe, atributi: ime, priimek, emšo */ 3. import java.io.serializable; public class OsebeSer implements Serializable { 6. private static final long serialversionuid = 12457L; 7. private String ime; 8. private String priimek; 9. private String emso; // emšo številka // konstruktor brez parametrov 12. public OsebeSer(){ 13. } // Osebe // konstruktor s tremi parametri 16. public OsebeSer(String ime1, String priimek1, String emso1){ 17. this.ime = ime1; 18. this.priimek = priimek1; Stran 245 ŠC VELENJE

246 19. this.emso = emso1; 20. } // Osebe // vrne ime 23. public String vrniime() { 24. return ime; 25. } // vrniime // določi ime 28. public void dolociime(string ime) { 29. this.ime = ime; 30. } // dolociime // vrne priimek 33. public String vrnipriimek() { 34. return priimek; 35. } // vrnipriimek // določi priimek 38. public void dolocipriimek(string priimek) { 39. this.priimek = priimek; 40. } // dolocipriimek // vrne emšo 43. public String vrniemso() { 44. return emso; 45. } // določi emšo 48. public void dolociemso(string emso) { 49. this.emso = emso; 50. } // dolociemso // vrne besedilno predstavitev objekta 54. public String tostring() { 55. return String.format("Ime in priimek: %s %s, EMŠO: %s", this.vrniime(), this.vrnipriimek(), 56. this.vrniemso()); 57. } //tostring } // konec razreda OsebeSer 1. /* OsebeSerializacija1.java 2. * Serializacija razreda osebe. */ import java.io.eofexception; 5. import java.io.fileinputstream; 6. import java.io.fileoutputstream; 7. import java.io.ioexception; 8. import java.io.objectinputstream; 9. import java.io.objectoutputstream; public class OsebeSerializacija1 { 12. private ObjectOutputStream izhod; // objekt izhodnega podatkovnega toka 13. private FileOutputStream datotekaoutput; // ustvarimo objekt za dokument (izhodni podatkovni tok) INFORMATIKA, Programiranje 1 in 2 Stran 246

247 14. private static ObjectInputStream vhod; // objekt vhodnega podatkovnega toka 15. private FileInputStream datotekainput; // ustvarimo objekt za dokument (vhodni podatkovni tok) public void odpridokumentzapisovanje() { 18. try { 19. datotekaoutput = new FileOutputStream ("osebe.ser"); // ustvarimo dokument 20. izhod = new ObjectOutputStream(datotekaOutput); // ustvarimo objekt razreda ObjectOutputStream 21. } // try 22. catch (java.io.ioexception izjema) 23. { 24. System.err.println("Napaka pri ustvarjanju dokumenta."); // sporočilo napake 25. } 26. } // odpridokumentzapisovanje public void zapridokumentzapisovanje() { 29. try { 30. if (izhod!= null) 31. izhod.close(); //zapremo izhodni tok 32. if (datotekaoutput!= null) 33. datotekaoutput.close(); // zapremo dokument 34. } // try 35. catch (java.io.ioexception izjema) 36. { 37. System.err.println("Napaka pri zapiranju dokumenta."); // sporočilo napake 38. } 39. } // zapridokumentzapisovanje public void serializacijaosebe() { 42. try { 43. OsebeSer oseba = new OsebeSer("Ana","Kos"," "); // ustvarimo in inicializiramo objekt osebe 44. izhod.writeobject(oseba); // v datoteko zapišemo objekt 45. // ustvarimo objekt osebe 46. OsebeSer oseba1 = new OsebeSer(); 47. // določimo vrednosti objektu oseba 48. oseba1.dolociime("žak"); 49. oseba1.dolocipriimek("koren"); 50. oseba1.dolociemso(" "); 51. izhod.writeobject(oseba1); // v datoteko zapišemo objekt 52. } catch (IOException e) { 53. e.printstacktrace(); 54. } // try 55. } // serializacijaosebe public void odpridokumentbranje() { 58. try { 59. datotekainput = new FileInputStream ("osebe.ser"); // določimo dokument 60. vhod = new ObjectInputStream(datotekaInput); // ustvarimo objekt razreda ObjecInputStream 61. } // try 62. catch (java.io.ioexception izjema) 63. { 64. System.err.println("Napaka pri odpiranju dokumenta."); // sporočilo napake 65. } 66. } // odpridokumentbranje Stran 247 ŠC VELENJE

248 public void zapridokumentbranje() { 69. try { 70. if (vhod!= null) 71. vhod.close(); // zapremo vhodni tok 72. if (datotekainput!= null) 73. datotekainput.close(); // zapremo dokument 74. } // try 75. catch (java.io.ioexception izjema) 76. { 77. System.err.println("Napaka pri zapiranju dokumenta."); // sporočilo napake 78. } 79. } // zapridokumentbranje public void deserializacijaosebe() { 82. OsebeSer oseba = null; // ustvarimo objekt osebe 83. try { 84. while (true) 85. { 86. oseba = (OsebeSer) vhod.readobject(); // branje naslednjega objekta osebe 87. // oblika izpisa 88. System.out.printf("\t %s \t %s \t %s \n", oseba.vrniime(),oseba.vrnipriimek(), oseba.vrniemso()); 89. } // while 90. } // try 91. catch (EOFException izjema) 92. { 93. zapridokumentbranje(); // zapremo podatkovni tok in dokument 94. return; 95. } 96. catch (IOException ClassNotFoundException izjema) 97. { 98. izjema.printstacktrace(); 99. } 100. } // deserializacijaosebe } // konec razreda OsebeSerializacija1 1. /* OsebeSerializacijaTest1.java 2. * Testni razred, serializacija oseb */ public class OsebeSerializacijaTest1 { public static void main(string[] args) { 7. OsebeSerializacija1 osebeser = new OsebeSerializacija1(); 8. // serializacija 9. osebeser.odpridokumentzapisovanje(); // ustvarimo dokument za zapisovanje 10. osebeser.serializacijaosebe(); // izvršimo serializacijo 11. osebeser.zapridokumentzapisovanje(); // zapremo dokument 12. // deserializacija osebeser.odpridokumentbranje(); // odpremo dokument za branje 15. osebeser.deserializacijaosebe(); // izvršimo deserializacijo 16. } // main 17. INFORMATIKA, Programiranje 1 in 2 Stran 248

249 18. } // konec razreda OsebeSerializacijaTest1 Primer izvajanja: Ana Kos Žak Koren Pogovorno okno za izbor dokumenta (JFileChooser) Razred JFileChooser uporabljamo za izbor dokumenta ali mape v grafičnem vmesniku. Razred JFileChooser Konstruktor JFileChooser () JFileChooser (File trenutniimenik) JFileChooser (String trenutniimenikpot) Metode int showopendialog (Component parent) int showsavedialog (Component parent) int showdialog (Component, String) void setfileselectionmode (int nacinizbora) void getfileselectionmode() boolean isdirectoryselectionenabled () boolean isfileselectionenabled () void setmultiselectionenabled (boolean b) boolean ismultiselectionenabled() void setfilefilter (FileFilter filter) FileFilter getfilefilter () void setfileview (FileView pogled) FileView getfileview () String getname (File f) void setcurrentdirectory(file) File getcurrentdirectory () Ustvari objekt tipa JFileChooser z uporabnikovim privzetim imenikom. Ustvari objekt tipa JFileChooser; parameter trenutniimenik predstavlja privzeto pot (vsebuje lahko tudi ime dokumenta). Ustvari objekt tipa JFileChooser; parameter trenutniimenikpot predstavlja privzeto pot (vsebuje lahko tudi ime dokumenta). Odpre pogovorno okno za odpiranje dokumenta. Vrne: JFileChooser.CANCEL_OPTION, JFileChooser.APPROVE_OPTION, JFileChooser.ERROR_OPTION. Odpre pogovorno okno za shranjevanje dokumenta. Odpre prilagodljivo pogovorno okno za izbor dokumentov. Določi ali vrne način izbora dokumentov. Možnosti: JFileChooser.FILES_ONLY (samo dokumenti), JFileChooser.DIRECTORIES_ONLY (samo imeniki oz. mape), JFileChooser.FILES_AND_DIRECTORIES (dokumenti in imeniki). Določi ali vrne stanje izbora več dokumentov. true - izbor več dokumentov, false - izbor enega dokumenta Določi ali vrne filter za prikaz dokumentov. Določi ali vrne način pogleda. Vrne objekt izbranega dokumenta. Določi ali vrne trenutni imenik. Pred uporabo pogovornega okna za izbor dokumenta ustvarimo objekt JFileChooser. JFileChooser izbordokumenta = new JFileChooser(); Pogovorno okno odpremo z metodo showopendialog. int vrnjenavrednost = izbordokumenta.showopendialog(component ); Metoda showopendialog vrne eno izmed vrednosti: JFileChooser.APPROVE_OPTION - uporabnik potrdi izbor, JFileChooser.CANCEL_OPTION - uporabnik prekliče izbor, JFileChooser.ERROR_OPTION - napaka v izboru. Pred odpiranjem okna z metodo setfileselectionmode (int nacinizbora) določimo izbor samo dokumentov (FILES_ONLY) ali samo imenikov (DIRECTORIES_ONLY) ali dokumentov in imenikov (FILES_AND_DIRECTORIES). Stran 249 ŠC VELENJE

250 Oglejmo si primer izbora dokumenta s prikazom osnovnih informacij o izbranem dokumentu. Informacije o izbranem dokumentu prikažimo v večvrstičnem besedilnem polju. 1. /* JFileChooser1.java 2. * Izbor dokumenta z objektom razreda JFileChooser in izpis informacij dokumenta v besedilnem področju (JTextArea). */ 3. package vaje; 4. import java.awt.borderlayout; 5. import java.io.file; 6. import javax.swing.jfilechooser; 7. import javax.swing.jframe; 8. import javax.swing.joptionpane; 9. import javax.swing.jpanel; 10. import javax.swing.jscrollpane; 11. import javax.swing.jtextarea; 12. import javax.swing.border.emptyborder; 13. import javax.swing.jbutton; 14. import java.awt.event.actionlistener; 15. import java.awt.event.actionevent; public class JFileChooser1 extends JFrame { 18. private JPanel contentpane; // plošča delovne površine 19. private JTextArea txtpodrocje; // besedilno področje, informacije o izbranem dokumentu 20. private JButton btnizbordokumenta; // gumb za odpiranje izbora dokumenta public JFileChooser1() { // ustvarimo grafični vmesnik 23. setbounds(100, 100, 800, 500); // določimo področje okna 24. contentpane = new JPanel(); // ustvarimo delovno površino 25. contentpane.setborder(new EmptyBorder(5, 5, 5, 5)); // področje obrobe 26. contentpane.setlayout(new BorderLayout(0, 0)); // delovni plošči določimo robno razporejanje 27. setcontentpane(contentpane); // oknu določimo delovno površino JScrollPane scrollpane = new JScrollPane(); // ustvarimo ploščo z drsnikom 30. contentpane.add(scrollpane, BorderLayout.CENTER); // ploščo z drsnikom vstavimo v sredino delovne površine 31. txtpodrocje = new JTextArea("<prazno>"); // ustvarimo področje besedila 32. scrollpane.setviewportview(txtpodrocje); // področje z besedilom vstavimo v ploščo z drsnikom 33. btnizbordokumenta = new JButton("Izbor dokumenta"); // ustvarimo gumb 34. // registriramo poslušalca dogodkov 35. btnizbordokumenta.addactionlistener(new ActionListener() { 36. public void actionperformed(actionevent dogodek) { // ob kliku na gumb 37. informacijedokument(); // izvršimo metodo informacijedokument 38. } 39. }); // addactionlistener 40. scrollpane.setcolumnheaderview(btnizbordokumenta); // gumb vstavimo v področje glave 41. setdefaultcloseoperation(jframe.exit_on_close); // privzeta operacija za zapiranju okna => izhod iz programa 42. } private File izbordokumenta() { 45. JFileChooser izbordokumenta = new JFileChooser(); // ustvarimo objekt pogovornega okna za izbor dokumenta 46. izbordokumenta.setfileselectionmode(jfilechooser.files_and_directories); // določimo vrsto izbora - dokument ali mapa INFORMATIKA, Programiranje 1 in 2 Stran 250

251 47. int izbor = izbordokumenta.showopendialog(this); // odpremo pogovorno okno za izbor dokumenta 48. if (izbor==jfilechooser.cancel_option) // uporabnik prekliče izbor 49. { 50. // prikažemo okno z obvestilom 51. JOptionPane.showMessageDialog(this, "Dokumenta niste izbrali.", "Obvestilo", JOptionPane.INFORMATION_MESSAGE); 52. return null; 53. } 54. else if (izbor== JFileChooser.APPROVE_OPTION) // v pogovornem oknu potrjen izbor 55. { 56. File dokument = izbordokumenta.getselectedfile(); // v objekt file shranimo podatke o izbranem dokumentu 57. if ( dokument == null dokument.getname().equals("")) 58. { 59. JOptionPane.showMessageDialog( this, "Dokument ni ustrezen.","neveljaven dokument", JOptionPane.ERROR_MESSAGE ); 60. System.exit(-1); // izhod iz programa 61. } // if 62. return dokument; // vrnemo dokument 63. } // if 64. return null; 65. } // izbordokumenta private void informacijedokument() { 68. File dokument = izbordokumenta(); // določimo izbran dokumenta 69. if (dokument!=null && dokument.exists()) //če obstaja dokument 70. { // izpis informacij v besedilnem področju 71. txtpodrocje.settext(string.format("ime dokumenta oz. mape: %s \n", dokument.getname() )); 72. txtpodrocje.append(string.format("pot: %s \n", dokument.getpath() )); 73. if (dokument.isfile()) // preverimo če je datoteka 74. txtpodrocje.append(string.format("vrsta dokumenta: datoteka \n","")); 75. else // je mapa 76. { 77. txtpodrocje.append(string.format("vrsta dokumenta: mapa \n","")); 78. String [] vsebina = dokument.list(); // ustvarimo tabelo z vsebino mape 79. // vsebino mape dodamo v besedilno področje 80. txtpodrocje.append(string.format("vsebina mape: \n","")); 81. for (String ime : vsebina) // vsi elementi tabele 82. txtpodrocje.append(string.format("%s\n",ime)); 83. } // else 84. } // if 85. } // informacijedokument // začetek izvajanja 88. public static void main(string[] args) { 89. JFileChooser1 frame = new JFileChooser1(); // ustvarimo objekt razreda JFileChooser1 90. frame.setvisible(true); // prikažemo grafični vmesnik 91. } // main } // konec razred JFileChooser1 Primer izvajanja: Stran 251 ŠC VELENJE

252 Slika 80: Uporaba pogovornega objekta JFileChooser Dodatni razredi paketa java.io 17 REKURZIJA 17.1 Rekurzivne rešitve O rekurziji pri programiranju govorimo, če je rešitev problema določena s pomočjo rešitve istega problema z manjšim ali pa drugačnim obsegom podatkov. V opisu postopka rešitve uporabimo isti postopek na manjšem problemu (korak se približamo rešitvi). Da se postopek zaključi, določimo rešitev najmanjšega problema oz. robni pogoj. Bistvo rekurzije je, da problem razdelimo na več podproblemov enake narave oz. da rešitev problema podamo z rešitvijo istega manjšega problema. Vsaka rekurzija je sestavljena iz rekurzivnega dela, kjer metoda kliče samo sebe in robnega pogoja. Robni pogoj določa, kdaj pri reševanju rekurzivnega problema ne uporabljamo več rekurzivnih klicev metode Fakulteta Fakulteto števila n izračunamo kot n! = n * (n 1) * (n 2) * * 1 Če je n=5, potem velja 5! = 5 * (4 * 3 * 2 * 1) Postopek izračuna lahko določimo s splošno rekurzivno: n! = n * (n-1)! Robni pogoj oz. najmanjšega problema je 0! = 1 Iz splošne formule in robnega pogoja razberemo, da bomo lahko izračunali fakulteto števila n, ko bomo imeli rezultat fakultete od števila (n-1). INFORMATIKA, Programiranje 1 in 2 Stran 252

253 /* Fakulteta.java */ public class Fakulteta { public static void main(string[] args) { System.out.printf("\nFakulteta števila 5 (iterativno): %d", fakultetastevila(5)); System.out.printf("\nFakulteta števila 5 (rekurzivno): %d", fakultetast(5)); } // main // iterativen postopek public static int fakultetastevila(int n) { int fakultetan = 1; for (int i=n; i>0;i--) fakultetan = fakultetan * i; return fakultetan; } // fakultetastevila // rekurziven postopek public static int fakultetast(int n) { if (n==0) // robni pogoj return 1; // vrednost robnega pogoja else return n * fakultetast (n-1); // splošna rekurzivna formula } // fakultetast } // konec razreda Fakulteta Fibonaccijevo število Zaporedje začnemo z dvema številoma, običajno 0 in 1. Naslednje Fibonaccijevo število dobimo, če seštejemo predhodni. Fibonaccijevo zaporedje: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 Splošna formula Fibonacci(n) = Fibonacci(n-2) + Fibonacci(n-1) Robni pogoj Fibonacci(0) = 0 in Fibonacci(1) = 1 1. /* Fibonacci.java */ Stran 253 ŠC VELENJE

254 2. package vaje; public class Fibonacci { 5. public static void main(string[] args) { 6. System.out.printf("\nFibonaccijevo zaporedje: "); 7. for (int i=0; i<20; i++) // izpis prvih 20 števil zaporedja 8. System.out.printf("%d, ", FibonacciSt(i)); 9. } // main // rekurziven postopek 12. public static int FibonacciSt(int n) { 13. if ((n==0) (n==1)) // robni pogoj 14. return n; // vrednost robnega pogoja 15. else 16. return (FibonacciSt(n-2) + FibonacciSt (n-1)) ; // splošna rekurzivna formula 17. } // FibonacciSt } // konec razreda Fibonacci Primer izvajanja: Fibonaccijevo zaporedje: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 18 PODATKOVNE STRUKTURE 18.1 Ogrodje Collection Dinamične podatkovne strukture med izvajanjem programa spreminjajo zasedenost pomnilnika; naraščajo oz. se krčijo (zasegajo in sproščajo pomnilnik). Program uporablja samo toliko pomnilnega prostora, kot ga v resnici potrebuje. Posamezni elementi se ustvarjajo ali brišejo med izvajanjem programa; spreminjamo pa lahko tudi njihove povezave. Ogrodje podatkovnih struktur (angl. collection framework) vsebuje razrede in vmesnike (interface), ki določajo način dela s podatkovnimi strukturami. Paket java.util vsebuje vmesnike in razrede ogrodja podatkovnih struktur. Podatkovna struktura običajno vsebuje objekte istega tipa. Objekt strukture vsebuje povezave oz. reference na objekte istega tipa. Vmesniki (interface) ogrodja določajo operacije, ki jih lahko izvedemo na različnih podatkovnih strukturah. Ogrodje vsebuje različne implementacije vmesnikov. Java vsebuje osnovni vmesnik (interface) Collection, ki povzema značilnosti vseh podatkovnih struktur. INFORMATIKA, Programiranje 1 in 2 Stran 254

255 Slika 81: Hierarhija razredov orgodja Collection Vmesnik Collection vsebuje: metode za osnovne operacije: int size(), boolean isempty(), boolean contains(object element), boolean add(e element), boolean remove(object element) in Iterator<E> iterator(); metode z operacijami nad zbirkami elementov: boolean containsall(collection<?> c), boolean addall(collection<? extends E> c), boolean removeall(collection<?> c), boolean retainall(collection<?> c) in void clear(); metode z operacijami nad tabelami: Object[] toarray() in <T> T[] toarray(t[] a). Interface Collection <E> E predstavlja podatkovni tip elementov (razred). Metoda Opis boolean add (E e) Doda oz. zagotovi, da zbirka vsebuje element e. true - nov element je dodan v zbirko false - zbirka že vsebuje element (ni podvajanja enakih elementov) boolean addall (Collection<? extends E> c) V zbirko doda vse elemente zbirke c. void clear() Iz zbirke odstrani vse elemente. boolean contains(object o) Preveri, če zbirka vsebuje objekt. true - zbirka vsebuje vsaj en element o boolean containsall (Collection<?> c) Vrne resnično, če so vsi elementi parametra zbirke elementi zbirke. boolean equals (Object o) Primerjava enakosti objekta o z zbirko. int hashcode () Vrne naslov zbirke. boolean isempty () true - zbirka je prazna boolean remove (Object o) Iz zbirke odstrani element o. boolean removeall (Collection<?> c) Iz zbirke odstrani vse elemente zbirke c. int size () Vrne število elementov. Stran 255 ŠC VELENJE

256 Metoda Object[] toarray () <T> T[] toarray (T[] a) Opis Vrne tabelo elementov zbirke. Vrne tabelo elementov zbirke, ki vsebuje vse tiste elemente zbirke podatkovne strukture, ki se ujemajo v podatkovnem tipu elementa tabele. Vmesnik Iterator Vmesnik Iterator vsebuje funkcionalnost za prehod skozi vse elemente zbirke. Metoda boolean hasnext() Object next() void remove() Opis Vrne resnično, če obstaja še več elementov. Vrne trenutni element in se premakne na naslednji element. Odstrani zadnji vrnjeni element Seznam Seznam (angl. List) je zaporedje nič ali več elementov: element_1, element_2, element_3, element_4, element_5 element_n. Pri tem je element_1 prvi element seznama in element_n zadnji element seznama. Elementi seznama niso urejeni po velikosti ali kako drugače. Posamezni elementi seznama se lahko večkrat ponavljajo. Seznami so zbirke elementov v znanem zaporedju, torej ima vsak element točno določeno mesto v seznamu. V tem so seznami pomensko podobni tabelam oz. poljem, saj vsakemu elementu pripada natančno določen položaj (indeks). Vendar pa seznami nimajo vnaprej določene dolžine in se njihova dolžina lahko dinamično spreminja. Sezname lahko izvedemo s prilagodljivim poljem ArrayList ali s povezanim seznamom LinkedList. Poleg operacij vmesnika Collection, vmesnik List vsebuje naslednje skupine operacij: Upravljanje elementov glede na položaj v seznamu: get, set, add, addall in remove. Iskanje objekta v seznamu in vračanje položaja: indexof in lastindexof. Sprehod skozi elemente seznama: metode razreda listiterator. Operacije s področjem seznama: sublist. Metode razreda List: Metoda Opis boolean add (E e) Doda nov element e na konec seznama. void add(int indeks, E e) Doda nov element e na mestu položaja, ki je določen z indeksom. boolean addall (Collection<? extends E> c) V zbirko doda vse elemente zbirke c. boolean addall (int indeks, Collection<? extends E> V zbirko doda vse elemente zbirke c od mesta položaja, ki je c) določen z indeksom. void clear() Iz zbirke odstrani vse elemente. Object clone() Ustvari kopijo seznama. elementi se ne kopirajo, V novem seznamu se ustvarijo ustrezne reference na obstoječe elemente. boolean contains(object o) E get (int indeks) int indexof(object objekt) Iterator<E> iterator() Preveri, če seznam vsebuje objekt. true - zbirka vsebuje vsaj en element o. Vrne element z določenega mesta v seznamu. Vrne mesto prve pojavitve elementa, ki ga določa parameter objekt v seznamu. Če elementa ni v seznamu, vrne -1. Vrne objekt Iterator (prehod skozi seznam). INFORMATIKA, Programiranje 1 in 2 Stran 256

257 Metoda Opis int lastindexof(object objekt) Vrne mesto zadnje pojavitve elementa, ki ga določa parameter objekt v seznamu. Če elementa ni v seznamu, vrne -1. boolean isempty () true - seznam je prazen. ListIterator<E> listiterator() Vrne objekt ListIterator (prehod skozi seznam). ListIterator<E> listiterator(int indeks) Vrne objekt ListIterator z začetkom na položaju indeksa. E remove(int indeks) Iz seznama odstrani element na položaju indeksa. E remove (Object objekt) Iz seznama odstrani element objekt. boolean removeall (Collection<?> c) Iz seznama odstrani vse elemente zbirke c. void removerange(int odindeksa, int doindeksa) Iz seznama odstrani vse elemente iz območja od položaja prvega parametra do položaja drugega parametra. boolean retainall(collection<?> c) V seznamu ohrani samo elemente, ki so elementi zbirke določeni s parametrom c. int size () Vrne število elementov. E set(int indeks, E element) Zamenja element na položaju indeksa z vrednostjo drugega parametra element. int size() Vrne število elementov seznama (dolžina seznama). List<E> sublist(int odindeksa, int doindeksa) Vrne del seznama. Območje določata indeksa. Object[] toarray () Vrne tabelo z elementi seznama. <T> T[] toarray (T[] a) Vrne tabelo elementov seznama, ki vsebuje vse tiste elemente seznama, ki se ujemajo v podatkovnem tipu elementa tabele. void trimtosize() Prilagodi kapaciteto seznama na trenutno število elementov seznama. Metode, ki predstavljajo kompleksnejše postopke nad elementi seznama Metoda static <T> void sort(list<t> list, Comparator<? super T> c) Opis Uredi elemente seznama list s postopkom zlivanja (merge sort). Z drugim opcijskim parametrom razreda Comparator c določimo način primerjave elementov. static void shuffle(list<?> list) Naključno premeša elemente seznama. static void reverse(list<?> list) Obrne vrstni red elementov seznama. static void rotate(list<?> list, int razmik) Rotira vse elemente seznama za določen razmik. static void swap(list<?> list, int i, int j) Zamenja elementa seznama na položajih i in j. static <T> boolean replaceall(list<t> list,t staravrednost, T novavrednost) Zamenja vse vrednosti pojavitve drugega parametra z vrednostjo tretjega parametra. static <T> void fill(list<? super T> list, T objekt) Zapolni vse elemente z vrednostjo drugega parametra objekt. static <T> void copy(list<? super T> cilj, List<? Kopira izvorni seznam vir v ciljni seznam cilj. extends T> vir) static <T> int binarysearch(list<? extends T> list, T Poišče vrednost parametra kljuc v seznamu s postopkom kljuc, binarnega iskanja. Seznam mora biti urejen. Drugi parameter Comparator<? super T> c) določa način primerjave. static int indexofsublist(list<?> vir, List<?> cilj) static int lastindexofsublist(list<?> vir, List<?> cilj) Vrne indeks položaja prvega podseznama parametra vir v seznamu parametra cilj. Vrne indeks položaja zadnjega podseznama parametra vir v seznamu parametra cilj. Stran 257 ŠC VELENJE

258 Slika 82: Vozlišče seznama Enosmerni seznam Enosmerni seznam vsebuje vrednost elementa in referenco na naslednji element v seznamu. Osnovne operacije nad enosmernim seznamom so: dodajanje elementa na začetek seznama (nov element predstavljajo črtkane črte) vstavljanje v seznam pred ali za podanim elementom Slika 83: Enosmerni seznam Slika 84: Vstavljanje elementa v enosmerni seznam brisanje elementa iz seznama Slika 85: Brisanje elementa enosmernega seznama INFORMATIKA, Programiranje 1 in 2 Stran 258

259 Dvosmerni seznam Dvosmerni seznam vsebuje vrednost elementa in referenco na naslednji element ter referenco na prejšnji element v seznamu. Slika 86: Dvosmerni seznam Pri operacijah za delo z dvosmernim seznamom moramo biti pazljivi, saj je večja možnost napak pri določitvi povezav. Dodajanje na začetek (seznam ni prazen): Dodajanje pred element Slika 87: Dodajanje na začetek dvosmernega seznama Brisanje iz seznama (vmesni element): Slika 88: Dodajanje za oz. pred elementom dvosmernega seznama Stran 259 ŠC VELENJE

260 Slika 89: Brisanje elementom dvosmernega seznama LinkedList Ustvarimo objekt razreda LinkedList s parametrom, ki določa, da so elementi objekti razreda Integer. LinkedList <Integer> tlist = new LinkedList<Integer>(); V seznam dodamo tri elemente (celoštevilčne vrednosti ovijemo v objekt Integer). tlist.add(new Integer(10)); tlist.add(new Integer(20)); tlist.add(new Integer(30)); Pomnilniška slika (izvedba dvosmerni seznam): Slika 90: Pomnilniška slika dvosmernega seznama Predstavitev seznama: Slika 91: Predstavitev dvosmernega seznama Razred LinkedList predstavlja dvosmerni seznam elementov. LinkedList je razširitev razreda AbstractList z implementiranima vmesnikoma List in Deque. INFORMATIKA, Programiranje 1 in 2 Stran 260

261 Seznam lahko vsebuje podvojene vrednosti elementov. Vrstni red elementov je določen. V primerjavi z uporabo seznama ArrayList je hitrejši predvsem v primerih vstavljanja elementov med območje seznama. Razred LinkedList lahko uporabimo kot seznam, sklad ali vrsto. Z uporabo objekta seznama (LinkedList) ustvarimo in izpišimo seznam celoštevilčnih vrednosti: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1. Seznam ustvarimo in izpišimo s for stavkom s povečevanjem števca (elemente dodajamo na začetek seznama). 1. /* LinkedList1.java */ 2. import java.util.iterator; 3. import java.util.linkedlist; public class LinkList1 { public static void main(string[] args) { 8. // ustvarimo objekt, celo število ovijemo v objekt Integer 9. LinkedList <Integer> tlist = new LinkedList <Integer>(); 10. // zanka, i= for (int i = 1; i<=10;i++) { 12. tlist.addfirst(new Integer(i)); // dodamo nov element na začetek seznama 13. } // for // prehod skozi seznam s for stavkom 16. for (int i=0; i<tlist.size(); i++) { 17. System.out.printf("%d ", tlist.get(i).intvalue()); // izpišemo i-ti element 18. if (i+1<tlist.size()) // če ni zadnji indeks seznama 19. System.out.print(", "); // izpišemo znak ',' 20. } // for 21. } // main } // razred LinkList Vmesnik ListIterator Vmesnik ListIterator vsebuje funkcionalnost za prehod oz. obhod skozi vse elemente seznam. Metoda boolean hasnext() Object next() boolean hasprevious() Object previous() Opis Vrne resnično, če obstaja vsaj en element za trenutnim elementom. Vrne trenutni element in se premakne na naslednji element. Vrne resnično, če obstaja vsaj en element pred trenutnim elementom. Vrne trenutni element in se premakne na predhodni element. Oglejmo si primer urejanja seznama priimkov oseb z metodo sort in izpis seznama z uporabo objekta razreda Iterator. 1. /* List2.java 2. * Urejanje seznama z uporabo metode sort. */ 3. import java.util.arrays; 4. import java.util.collections; 5. import java.util.iterator; 6. import java.util.list; public class List2 { 9. Stran 261 ŠC VELENJE

262 10. public static void main( String[] args ) { 11. // tabela priimkov 12. String[] tabpriimki = {"Kotnik", "Hvalič","Gorjup","Borko"}; 13. // ustvarimo seznam z elementi tabele priimkov 14. List< String > tlist = Arrays.asList( tabpriimki ); 15. // izpišemo neurejen seznam 16. System.out.printf( "Seznam priimkov pred urejanjem: %s\n", tlist ); 17. // uredimo seznam 18. Collections.sort( tlist ); 19. // izpis urejenega seznama z uporabo objekta iterator 20. System.out.printf( "Seznam urejenih priimkov: [" ); 21. Iterator <String> iterator = tlist.iterator(); 22. while (iterator.hasnext()) { 23. System.out.printf("%s", iterator.next()); 24. if (iterator.hasnext()) 25. System.out.print(", "); 26. } // while 27. System.out.print("]"); 28. } // main 29. } // razred List2 Primer izvajanja: Seznam priimkov pred urejanjem: [Kotnik, Hvalič, Gorjup, Borko] Seznam urejenih priimkov: [Kotnik, Hvalič, Gorjup, Borko] Seznam lahko uredimo tudi v padajočem vrstnem redu. Način urejanja določimo z drugim parametrom metode sort. Metoda reverseorder vmesnika Collections vrne objekt razreda Comparator, ki določa razvrščanje elementov seznama v padajočem vrstnem redu. // urejanje seznama, od največje do najmanjše vrednosti (padajoče) Collections.sort( tlist, Collections.reverseOrder() ); 18.3 Vrsta Vrsta (angl. Queue) je struktura, v kateri so elementi urejeni skladno z vrstnim redom dodajanja. Slika 92: Vrsta Elementi se vedno dodajajo na konec in se brišejo na začetku. Vrsta se zato imenuje tudi FIFO (First-In-First-Out). Značilnost vrste je, da bo element, ki je bil vanjo dodan prvi, iz nje tudi prvi izbrisan. Zahteva se lahko enakovredno opiše tudi s tem, da se lahko neki element izbriše iz vrste šele, ko so se izbrisali vsi elementi, ki so v vrsto prišli pred njim. Vrsta je primer linearne podatkovne strukture. Slika 93: Dodajanje v vrsto Primer dodajanja in brisanja elementov vrste: INFORMATIKA, Programiranje 1 in 2 Stran 262

263 vrsta dodamo A dodamo B dodamo C odstranimo A odstranimo B odstranimo C A B A C B A C B C Izvedba vrste s tabelo Slika 94: Izvedba vrste s tabelo Izvedba vrste s povezanim seznamom Slika 95: Izvedba vrste s povezanim seznamom Vrsta z dvema koncema (angl. Deque) Vrsta z dvema koncema je linearna struktura, kjer lahko elemente dodajamo in odstranjujemo na obeh koncih. Deque je seznam elementov, za katerega lahko uporabimo FIFO ali LIFO (Last In First Out - zadnji noter), prvi ven pravilo dodajanja in pridobivanja elementov. Stran 263 ŠC VELENJE

264 Prvi element (Head) Zadnji element (Tail) Vstavljanje addfirst(e) addlast(e) Brisanje removefirst() removelast() Pridobivanje getfirst() getlast() Razred PriorityQueue in vmesnik Queue Razred PriorityQueue določa funkcionalnost, ki omogoča vstavljanje v urejeno vrsto in pridobivanje elementov ali brisanje z začetka vrste. Pri dodajanju se urejenost določa glede na največjo vrednost elementa in sicer se največji element najprej odstrani iz vrste. Metoda boolean offer (E e) E poll() E peek() Opis Doda nov element e v urejeno vrsto. Vrne in odstrani element z začetka urejene vrste. Vrne vendar ne odstrani elementa z začetka urejene vrste. Oglejmo si demonstracijo uporabe prioritetne vrste. 1. /* PriorityQueue1.java 2. * Demo uporabe prioritetne vrste. */ 3. import java.util.priorityqueue; 4. public class PriorityQueue1 { public static void main(string[] args) { 7. // ustvarimo prioritetno vrsto, element objekt razreda Double 8. PriorityQueue< Double > vrsta = new PriorityQueue< Double >(); 9. // dodajanje elementov 10. vrsta.offer(new Double(50.8)); 11. vrsta.offer(new Double(10.6)); 12. vrsta.offer(new Double(3.8)); 13. vrsta.offer(new Double(10)); 14. vrsta.offer(new Double(89.2)); // izpis elementov 17. System.out.printf( "\nelementi vrste: [" ); 18. while (vrsta.size() > 0) { // število elementov večje od nič 19. // izpišemo element z začetka vrste in ga odstranimo iz vrste 20. System.out.printf("%f",vrsta.poll()); 21. if (vrsta.size() > 0) 22. System.out.print("; "); // izpišemo ločilo 23. } // while 24. System.out.printf( "]" ); 25. } // main } // razred PriorityQueue1 Primer izvajanja: Elementi vrste: [3,800000; 10,000000; 10,600000; 50,800000; 89,200000] INFORMATIKA, Programiranje 1 in 2 Stran 264

265 18.4 Sklad Sklad (angl. Stack) je v podatkovna struktura, ki deluje po načelu LIFO (Last In First Out - zadnji noter, prvi ven). To pomeni, da se element, ki ga nazadnje shranimo na sklad, najprej prebere iz sklada. Sklad običajno imenujemo tudi del pomnilnika, kjer so shranjeni podatki. Pri skladu običajno dostopamo samo do zadnjega oz. vrhnjega elementa. Za sklad sta značilni dve operaciji: postavi na sklad (push), vzemi s sklada (pop). Sklad je podatkovna struktura, ki si jo najlažje predstavljamo s skladom knjig. Novo knjigo vedno dodamo na vrh sklada in ko jemljemo knjige s sklada, jih vedno jemljemo z vrha. Na vrh sklada kaže kazalec sklada. Če na skladu ni nobenega elementa, potem ima vrednost NULL (kazalec ne kaže nikamor). Slika 96: Sklad 1. /* Stack1.java 2. * Vstavljanja celih števil v sklad in izpis sklada */ 3. import java.util.stack; public class Stack1 { public static void main(string[] args) { 8. // ustvarimo sklad 9. Stack <Integer> sklad = new Stack <Integer>(); 10. // dodajamo elemente na vrh sklada 11. sklad.push(new Integer(5)); 12. sklad.push(new Integer(45)); 13. sklad.push(new Integer(87)); 14. sklad.push(new Integer(5)); 15. sklad.push(new Integer(15)); Stran 265 ŠC VELENJE

266 16. sklad.push(new Integer(25)); 17. System.out.print("[ "); 18. // izpišemo sklad 19. while (!sklad.isempty()){ // dokler ni sklad prazen 20. System.out.printf("%d", sklad.pop()); // z vrha sklada vzameno element in ga izpišemo 21. if (!sklad.isempty()) 22. System.out.print(", "); // izpišemo vmesno ločilo 23. } // while 24. System.out.print(" ]"); 25. } // main } // razred stack1 Primer izvajanja: [ 25, 15, 5, 87, 45, 5 ] 18.5 Razred ArrayList ArrayList vsebuje za elemente objekte kateregakoli tipa. V primerjavi s tabelami, ki imajo nespremenljivo dolžino, se dolžina objekta ArrayList med izvajanjem programa lahko spreminja (povečuje in zmanjšuje). Razred ArrayList je implementiran z uporabo tabele, ki vsebujeza elemente objekte. Ko je tabela polna, se ustvari nova daljša tabela, podatki pa se iz stare prepišejo v novo tabelo. Za uporabo razreda ArrayList najavimo uporabo paketa ArrayList. import java.util.arraylist; Objekt razreda ArrayList ustvarimo enako kot objekte ostalih razredov s tem, da moramo določiti podatkovni tip objektov: ArrayList<BaseType> tlist = new ArrayList<BaseType>(); Podatkovni tip elementov ustvarimo oz. določimo s parametrom. Pri ustvarjanju objekta lahko določimo začetno velikost oz. dolžino. Objekt z 20 elementi tipa String ustvarimo s stavkom: ArrayList<String> tlist = new ArrayList<String>(20); Z metodo add dodamo nov element na konec. tlist.add("nov element"); Nov element lahko dodamo tudi na katerikoli obstoječi indeks. V tem primeru uporabimo metodo add z dvema parametroma. Metoda size vrne število elementov (koliko indeksov tabele vsebuje elemente). int steviloelementov = tlist.size(); Metoda set zamenja obstoječi element. tlist.set(indeks, "nova vrednost"); Metoda get vrne vrednost elementa. String vrednostelementa = tlist.get(indeks); Metoda size vrne število elementov shranjenih v objektu razreda ArrayList. Capacity je največje število elementov, ki jih lahko shranimo v objekt razreda ArrayList. Glede na potrebo se Capacity samodejno poveča. Z uporabo objekta seznama (ArrayList) ustvarimo in izpišimo seznam besedilnih vrednosti: INFORMATIKA, Programiranje 1 in 2 Stran 266

267 Element 1,Element 2,Element 3,Element 4,Element 5,Element 5.1,Element 6,Element 7,Element 8,Element 9,Element /* ArrayList2.java */ 2. import java.util.arraylist; 3. import java.util.iterator; public class ArrayList2 { public static void main(string[] args) { 8. // ustvarimo objekt 9. ArrayList <String> tlist = new ArrayList <String>(); 10. // zanka, i= for (int i = 1; i<=10;i++) { 12. tlist.add("element " + i); // dodamo nov element na konec seznama 13. } // for tlist.add(5, "Element 5.1 "); // dodamo nov element na položaju z indeksom // objekt iterator uporabimo za prehod skozi seznam 17. Iterator titerator = tlist.iterator(); 18. // dokler obstaja naslednji element 19. while (titerator.hasnext()) { 20. System.out.printf("%s ", titerator.next()); // izpišemo trenutni element in se premaknemo na naslednji element 21. if (titerator.hasnext()) // če obstaja naslednji element izpišemo znak ',' 22. System.out.print(","); 23. } // while 24. } // main } // razred ArrayList2 Primer izvajanja: Element 1,Element 2,Element 3,Element 4,Element 5,Element 5.1,Element 6,Element 7,Element 8, Element 9,Element 10 Oglejmo si primer uporabe seznama, ki izpiše barve prvega seznama barv, ki se ne nahajajo v drugem seznamu barv. 1. /* ArrayList1.java */ 2. import java.util.arraylist; 3. import java.util.iterator; 4. import java.util.list; 5. public class ArrayList1 { public static void main(string[] args) { 8. // tabela 1 vrednosti barv 9. String[] tabbarve1 = {"BELA","RDEČA","SIVA","RUMENA","RJAVA","MODRA"}; 10. // tabela 2 vrednosti barv 11. String[] tabbarve2 = {"RDEČA","SIVA","MODRA"}; // ustvarimo objekt prvega seznama barv 14. List <String> sezbarve1 = new ArrayList<String>(); 15. // vrednosti tabele tabbarve1 prepišemo v seznam sezbarve1 16. for (int i=0; i<tabbarve1.length; i++) 17. sezbarve1.add(tabbarve1[i]); Stran 267 ŠC VELENJE

268 // ustvarimo objekt drugega seznama barv 20. List<String> sezbarve2 = new ArrayList<String>(); 21. // vrednosti tabele tabbarve2 prepišemo v seznam sezbarve2 22. for (int i=0; i<tabbarve2.length; i++) 23. sezbarve2.add(tabbarve2[i]); // izpišemo vrednosti prvega seznama barv z uporabo objekta razreda Iterator 26. Iterator iteratorsezbarve1 = sezbarve1.iterator(); 27. System.out.print("1. seznam barv: ["); // začetek seznama 28. // sprehod skozi vse elemente seznama 29. while (iteratorsezbarve1.hasnext()) // dokler obstaja naslednji element 30. { 31. System.out.print(iteratorSezBarve1.next()); // izpis 32. if (iteratorsezbarve1.hasnext()) // če je še naslednji element, potem izpišemo ", " 33. System.out.print(", "); 34. } // while 35. System.out.print("]"); // konec seznama 36. System.out.print("\n2. seznam barv: "); // začetek seznama 37. // izpis seznama z metodo println 38. System.out.println(sezBarve2); // iz seznama barv sezbarve1 odstranimo vse barve seznama barv sezbarve2 41. sezbarve1.removeall(sezbarve2); System.out.print("\nSeznam 1 po odstranjenih barvah elementov seznama 2 : "); // obvestilo 44. // izpis seznama 1 z metodo println 45. System.out.println(sezBarve1); 46. } // main } // konec razred ArrayList1 Primer izvajanja: 1. seznam barv: [BELA, RDEČA, SIVA, RUMENA, RJAVA, MODRA] 2. seznam barv: [RDEČA, SIVA, MODRA] Seznam 1 po odstranjenih barvah elementov seznama 2 : [BELA, RUMENA, RJAVA] 18.6 Množica Množica (angl. Set) je podatkovna struktura, ki ne vsebuje podvojenih vrednosti elementov. Vrstni red elementov množice običajno ni pomemben. Opisuje jo vmesnik Set, izvedemo pa jo lahko z zgoščeno tabelo (razred HashSet) ali z uravnoteženim drevesom (razred TreeSet). Uporabnik vnaša priimke oseb. Program izpiše seznam različnih vnesenih priimkov (brez podvajanja). Množico deklariramo kot objekt razreda HashSet, kateremu v oklepajih <> podamo tip elementov. Tip mora biti določen z razredom, saj množica HashSet lahko hrani le objekte. Naši objekti bodo tipa String. HashSet <String> tpriimki = new HashSet <String> (); Za vstavljanje elementov v množico uporabimo metodo add(). Ta metoda doda podani element k elementom množice, če elementa še ni v množici. V primeru uspešnega dodajanja vrne true. 1. /*HashSet1.java 2. * Uporabnik vpisuje priimke. Program izpiše seznam različnih vnesenih priimkov (brez podvajanja). */ 3. import java.util.hashset; 4. import java.util.iterator; INFORMATIKA, Programiranje 1 in 2 Stran 268

269 5. import java.util.scanner; public class HashSet1 { public static void main(string[] args) { 10. String tpriimek; // 11. // ustvarimo objekt za množico priimkov 12. HashSet <String> setpriimki = new HashSet <String> (); 13. Scanner vnos = new Scanner (System.in); // ustvarimo vhodni tok za vnos, tipkovnica 14. // izpišemo obvestilo za vnos 15. System.out.printf("Vnos priimkov <vnos zaključite s Ctrl+Z>\n"); 16. // dokler uporabnik vpisuje priimke 17. while (vnos.hasnext()) { 18. tpriimek = vnos.next(); // preberemo priimek 19. setpriimki.add(tpriimek); // priimek dodamo v množico 20. } // while 21. vnos.close(); // zapremo vhodni tok 22. // ustvarimo objekt Iterator za prehod skozi elemente množice 23. Iterator <String> titerator = setpriimki.iterator(); 24. // obvestilo izpisa 25. System.out.print("\nSeznam različnih priimkov: "); 26. // dokler obstaja element v množici 27. while (titerator.hasnext()) { 28. System.out.printf(" %s", titerator.next()); // izpišemo element in se premaknemo na naslednji element množice 29. if (titerator.hasnext()) // če še obstaja element v množici 30. System.out.print(", "); // izpišemo ločilo 31. } // while 32. } // main } // razred HashSet1 Primer izvajanja: Vnos priimkov <vnos zaključite s Ctrl+Z> Bor Koren Kotnik Bor Seznam različnih priimkov: Koren, Bor, Kotnik 18.7 Zgoščena tabela Zgoščene tabele (angl. Hash Table) omogočajo shranjevanje množice različnih predmetov. Shranjujejo se kot par (ključ, vrednost) angl. (key, value)). Zgoščena tabela povezuje vrednosti ključev z vrednostmi, ki so shranjene za to vrednost ključa. Vrednosti ključev morajo biti med seboj različne (angl. unique), medtem ko so vrednosti lahko tudi enake. Objekt razreda Map se razlikuje od objekta razreda Set po tem, da poleg vrednosti vsebuje tudi vrednost ključa. Razredi Hashtable, HashMap in TreeMap implementirajo vmesnik Map. Razreda Hashtables in HashMaps shranjujeta elemente v zgoščevalnih tabelah. Razred TreeMaps shranjuje elemente v drevesni strukturi (angl. Tree). Vmesnik SortedMap je razširitev vmesnika Map, ki predstavlja urejeno zaporedje glede na vrednosti ključev ali zaporedje dodajanja elementov ali uporabljen objekt razreda Comparator. Razred TreeMap je implementacija SortedMap. Stran 269 ŠC VELENJE

270 Oglejmo si primer, ko z uporabo objekta razreda HashMaps ugotovimo frekvenco pojavitev posameznih besed. Uporabnik preko tipkovnice vpisuje besedilo, dokler ne zaključi vnosa (Ctrl+Z). 1. /*SteviloBesed1.java 2. * ugotavljanja frekvence pojavitve besed */ 3. import java.util.hashmap; 4. import java.util.map; 5. import java.util.scanner; 6. import java.util.set; 7. import java.util.treeset; public class SteviloBesed1 { public static void main(string[] args) { 12. // ustvarimo objekt množice besed 13. Map <String, Integer> mnozicabesed = new HashMap <String, Integer>(); 14. ustvarimnozicobesed(mnozicabesed); 15. izpisimnozicobesed(mnozicabesed); 16. } // main // metoda za ustvarjanje množice za frekvenco besed 19. public static void ustvarimnozicobesed(map <String, Integer> mnozicabesed) { 20. // ustvarimo objekt za vnos 21. Scanner vnos = new Scanner (System.in); 22. // izpišemo obvestilo uporabniku 23. System.out.printf("%s\n", "Vnos stavkov (Ctrl+Z - konec vnosa):"); 24. // preberemo vrstico in vnose besed shranimo v množico besed 25. while (vnos.hasnext()) { 26. String stavek = vnos.nextline(); 27. // besede v stavku prenesemo v tabelo besed 28. String [] besedestavka = stavek.split(" "); 29. // obdelamo tabelo besed 30. for (String beseda: besedestavka) { 31. // besedo pretvorimo v velike črke 32. String besedamalecrke = beseda.tolowercase(); 33. // preverimo, če je beseda element množice 34. if (mnozicabesed.containskey(besedamalecrke)) { 35. // ugorovimo število pojavitev besede 36. int stevilo = mnozicabesed.get(besedamalecrke); 37. // posodobimo vrednost množice 38. mnozicabesed.put(besedamalecrke, stevilo+1); 39. } else 40. mnozicabesed.put(besedamalecrke, 1); 41. } // for 42. }// while 43. // zapremo vhodni podatkovni tok 44. vnos.close(); 45. } // ustvarimnozicobesed // metoda izpiše frekvenco besed 48. public static void izpisimnozicobesed(map <String, Integer> mnozicabesed) { 49. // dobimo seznam vrednosti ključev 50. Set <String> besedekljuci = mnozicabesed.keyset(); 51. // množico različnih besed uredimo z uporabo razreda TreeSet INFORMATIKA, Programiranje 1 in 2 Stran 270

271 52. TreeSet <String> besededrevo = new TreeSet<String> (besedekljuci); 53. // izpis za vsako vrednost besede (ključa), urejeno zaporedje glede na vrednosti ključa 54. System.out.println("Frekvenca pojavitve posameznih besed: "); 55. System.out.printf("(%s, %s) \n","beseda","število pojavitev"); 56. for (String beseda: besededrevo) { 57. // izpis 58. System.out.printf("(%s, %d) \n", beseda, mnozicabesed.get(beseda)); 59. } // for 60. } // izpisimnozicobesed } // razred SteviloBesed1 Primer izvajanja: Vnos stavkov (Ctrl+Z - konec vnosa): to je primer ugotavljanja frekvence pojavitve besed v primeru uporabimo vmesnik map to je primer ugotavljanja frekvence pojavitve besed Frekvenca pojavitve posameznih besed: (Beseda, Število pojavitev) (besed, 2) (frekvence, 2) (je, 2) (map, 1) (pojavitve, 2) (primer, 2) (primeru, 1) (to, 2) (ugotavljanja, 2) (uporabimo, 1) (v, 1) (vmesnik, 1) 18.8 Vmesnik Comparator Vmesnik Comparator uporabimo za določitev urejenosti elementov v uporabniško definiranih razredih. Vmesnik je definiran v paketu java.util. Metoda int compare(object objekt1, Object objekt2) boolean equals(object objekt) Opis Primerja prvi objekt (objekt1) z drugim objektom (objekt2). Vrne resnično, če sta objekta enaka. Uporaba metode: Object.equals(Object). 1. /* Osebe1.java */ 2. public class Osebe1 { 3. private String ime; 4. private String priimek; 5. private String emso; // emšo številka // konstruktor s tremi parametri 8. public Osebe1(String ime1, String priimek1, String emso1){ 9. this.dolociime(ime1); 10. this.dolocipriimek(priimek1); Stran 271 ŠC VELENJE

272 11. this.dolociemso(emso1); 12. } // Osebe public String vrnipriimek() { 15. return priimek; 16. } // vrnipriimek public void dolocipriimek(string priimek) { 19. this.priimek = priimek; 20. } // dolocipriimek public String vrniime() { 23. return ime; 24. } // vrniime public void dolociime(string ime) { 27. this.ime = ime; 28. } // dolociime public String vrniemso() { 31. return emso; 32. } // vrniemso public void dolociemso(string emso) { 35. this.emso = emso; 36. } // dolociemso } // razred Osebe1 1. /* PriimekComparator.java */ 2. import java.util.comparator; 3. // razred implementira vmesnik Comparator s parametrom tipa 4. public class PriimekComparator implements Comparator <Osebe1> { 5. // prepis metode vmesnika 7. public int compare (Osebe1 oseba1, Osebe1 oseba2) { 8. return oseba1.vrnipriimek().compareto(oseba2.vrnipriimek()); 9. } // compare } // razred PriimekComparator 1. /* ComparatorTest.java 2. * Testni razred za demonstracijo urejanja */ 3. import java.util.collections; 4. import java.util.iterator; 5. import java.util.linkedlist; 6. import java.util.list; public class ComparatorTest { public static void main(string[] args) { 11. // ustvarimo seznam oseb 12. List < Osebe1 > tlist = new LinkedList < Osebe1 > (); 13. // v seznam oddamo tri osebe 14. tlist.add(new Osebe1("Tine","Hren"," ")); INFORMATIKA, Programiranje 1 in 2 Stran 272

273 15. tlist.add(new Osebe1("Jure","Borik"," ")); 16. tlist.add(new Osebe1("Marko","Stop"," ")); 17. // izpis neurejenega seznama z uporabo objekta iterator 18. System.out.printf( "\nneurejen seznam oseb: [" ); 19. Iterator <Osebe1> iterator = tlist.iterator(); 20. while (iterator.hasnext()) { 21. Osebe1 oseba = iterator.next(); 22. System.out.printf("%s %s %s", oseba.vrniime(), oseba.vrnipriimek(), oseba.vrniemso()); 23. if (iterator.hasnext()) 24. System.out.print(", "); 25. } // while 26. System.out.print("]"); // urejanje seznama po priimkih, uporaba Comparatorja 29. Collections.sort(tList, new PriimekComparator () ); // izpis urejenega seznama z uporabo objekta iterator 32. System.out.printf( "\nurejen seznam oseb: [" ); 33. Iterator <Osebe1> iterator2 = tlist.iterator(); 34. while (iterator2.hasnext()) { 35. Osebe1 oseba = iterator2.next(); 36. System.out.printf("%s %s %s", oseba.vrniime(), oseba.vrnipriimek(), oseba.vrniemso()); 37. if (iterator2.hasnext()) 38. System.out.print(", "); 39. } // while 40. System.out.print("]"); 41. } // main } // razred ComparatorTest Primer izvajanja: Seznam oseb: [Tine Hren , Jure Borik , Marko Stop ] Seznam oseb: [Jure Borik , Tine Hren , Marko Stop ] 18.9 Razred Properties Objekt razreda Properties je zgoščena tabela, ki omogoča shranjevanje besedilnih vrednosti parov (ključ, vrednost) z uporabo metod setproperty in getproperty (namesto metod put and get razreda HashTable). Objekt razreda Properties lahko shranimo v izhodni tok (tudi dokument) ali ga preberemo iz vhodnega toka (tudi dokumenta). Metoda Opis String getproperty (String kljuc, String vrednost) Vrne vrednost lastnosti določenega ključa. String setproperty (String kljuc, String vrednost) Ključu določi vrednost lastnosti. void load (InputStream vhodnipodatkovnitok) Iz vhodnega podatkovnega toka prebere vrednosti lastnosti. throws IOException void save (OutputStream izhodnipodatkovnitok, V izhodni podatkovni tok shrani vrednosti lastnosti. String komentar) void loadfromxml (InputStream Iz XML dokumenta prebere vrednosti lastnosti. vhodnipodatkovnitok) throws IOException, InvalidPropertiesFormatException void storetoxml (OutputStream os, String comment) V XML dokument zapiše vrednosti lastnosti. Stran 273 ŠC VELENJE

274 throws IOException Oglejmo si primer uporabe razreda Properties za shranjevanje podatkov o šoli v dokument. 1. /** Properties1.java 2. Primer uporabe razreda Properties, shranjevanje lastnosti šole */ 3. import java.io.fileinputstream; 4. import java.io.filenotfoundexception; 5. import java.io.fileoutputstream; 6. import java.io.ioexception; 7. import java.util.properties; 8. import java.util.set; public class Properties1 { public static void main(string[] args) { 13. // ustvarimo objekt Properties 14. Properties tabelalastnosti = new Properties(); 15. // določimo vrednosti lastnosti 16. tabelalastnosti.setproperty("šola", "Šolski center Velenje"); 17. tabelalastnosti.setproperty("naslov", "Trg mladosti 3, 3320 Velenje"); 18. tabelalastnosti.setproperty("spletna stran", " 19. System.out.println("\nIzpis vrednosti lastnosti brez uporabe dokumenta:"); 20. // izvršimo metodo za izpis vrednosti 21. izpislastnosti(tabelalastnosti); 22. // izvršimo metodo za shranjevanje v dokument 23. shranivdokument(tabelalastnosti, "solalastnosti.txt"); 24. // izvršimo metodo za shranjevanje v XML dokument 25. shranivxmldokument(tabelalastnosti, "solalastnosti.xml"); 26. // izvršimo metodo za branje iz dokumenta 27. preberiizdokumenta(tabelalastnosti, "solalastnosti.txt"); 28. // izvršimo metodo za izpis vrednosti 29. System.out.println("\nIzpis vrednosti lastnosti po branju iz dokumenta:"); 30. izpislastnosti(tabelalastnosti); 31. } // main public static void izpislastnosti(properties tablastnosti) { 34. // določimo množico vrednosti ključev 35. Set<Object> tabkljuci = tablastnosti.keyset(); 36. // za vse vrednosti množice ključev 37. for (Object kljuc: tabkljuci) { 38. // izpišemo ključ in vrednost ključa 39. System.out.printf("%s: %s\n", kljuc, tablastnosti.getproperty( (String) kljuc)); 40. } // for 41. } // izpislastnosti public static void shranivdokument(properties tablastnosti, String imedokumenta) { 44. // shranimo vrednosti tabele lastnosti 45. try { 46. // ustvarimo objekt FileOutputStream za izhodni podatkovni tok 47. FileOutputStream dokument = new FileOutputStream(imeDokumenta); 48. tablastnosti.store(dokument, "Podatki o šoli"); // zapišemo lastnosti v dokument 49. } catch (FileNotFoundException e) { 50. e.printstacktrace(); 51. } catch (IOException e) { 52. // TODO Auto-generated catch block INFORMATIKA, Programiranje 1 in 2 Stran 274

275 53. e.printstacktrace(); 54. } // try 55. } // shranivdokument public static void shranivxmldokument(properties tablastnosti, String imedokumenta) { 58. // shranimo vrednosti tabele lastnosti 59. try { 60. // ustvarimo objekt FileOutputStream za izhodni podatkovni tok 61. FileOutputStream dokument = new FileOutputStream(imeDokumenta); 62. // shranimo lastnosti v XML dokument 63. tablastnosti.storetoxml(dokument, "XML oblika dokumenta", "UTF-8"); // zapišemo lastnosti v dokument 64. } catch (FileNotFoundException e) { 65. e.printstacktrace(); 66. } catch (IOException e) { 67. e.printstacktrace(); 68. } // try 69. } // shranivxmldokument public static void preberiizdokumenta(properties tablastnosti, String imedokumenta) { try { 74. // ustvarimo objekt FileInputStream za vhodni podatkovni tok 75. FileInputStream dokument = new FileInputStream(imeDokumenta); 76. // preberemo lastnosti iz dokumenta 77. tablastnosti.load(dokument); 78. // zapremo vhodni tok 79. dokument.close(); 80. } catch (IOException e) { e.printstacktrace(); 83. } // zapremo vhodni tok } // preberiizdokumenta } // razred Properties1 Primer izvajanja: Izpis vrednosti lastnosti brez uporabe dokumenta: Spletna stran: Šola: Šolski center Velenje Naslov: Trg mladosti 3, 3320 Velenje Izpis vrednosti lastnosti po branju iz dokumenta: Spletna stran: Šola: Šolski center Velenje Naslov: Trg mladosti 3, 3320 Velenje Vsebina dokumenta "solalastnosti.xml": <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE properties SYSTEM " <properties> <comment>xml oblika dokumenta</comment> <entry key="spletna stran"> Stran 275 ŠC VELENJE

276 <entry key="šola">šolski center Velenje</entry> <entry key="naslov">trg mladosti 3, 3320 Velenje</entry> </properties> Sinhronizacija podatkovnih struktur V poglavju Večnitnost bomo spoznali osnove večnitnosti v Javi. Vsi razredi ogrodja Collection so nesinhronizirani z izjemo razredov Vector in Hashtable. Učinkovito delovanje je zagotovljeno, če se ne uporablja večnitnost. Zaradi tega je potrebno v primeru istočasnih dostopov do objektov ogrodja Collections uporabo teh razredov oviti z sinhronizacijskimi razredi. Ko objekt ovitega razreda prejme klic metode, doda sinhronizacijsko nit in delagira klice objektom ovitih razredov. Vse te metode prejmejo splošen tip in vrnejo sinhroniziran vidik splošnega tipa. Ustvarimo sinhroniziran seznama tipa String. Najprej ustvarimo objekt seznama (izvedba razred ArrayList). List< String > tlist = new ArrayList< String >(); Objekt nesinhroniziranega seznama uporabimo kot parameter v klicu metode synchronizedlist vmesnika Collections. List< String > tlistsin = Collections.synchronizedList( tlist ); Sinhronizacijske metode < T > Collection< T > synchronizedcollection( Collection< T > c ) < T > List< T > synchronizedlist( List< T > alist ) < T > Set< T > synchronizedset( Set< T > s ) < T > SortedSet< T > synchronizedsortedset( SortedSet< T > s ) < K, V > Map< K, V > synchronizedmap( Map< K, V > m ) < K, V > SortedMap< K, V > synchronizedsortedmap( SortedMap< K, V > m ) 19 SPLOŠNE (GENERIČNE) METODE IN RAZREDE 19.1 Uvod v splošne razrede in metode V dosedanjih poglavjih smo že uporabljali splošne metode. V tem poglavju pa bomo spoznali, kako definiramo splošne metode. Prednost splošnih metod je v tem, da z eno metodo definiramo množico sorodnih metod. Splošno metodo uporabljamo za različne podatkovne tipe. Pri splošnih metodah lahko preverjamo ustreznost tipov. Določimo lahko splošni razred za delo s podatkovno strukturo in nato inicializiramo objekt razreda z izbranim tipom. Večkratno definirane metode pogosto uporabljamo za izvajanje podobnih operacij nad različnimi podatkovnimi tipi. S splošnimi metodami in razredi lahko uporabljamo samo reference na objekte razredov. Spoznavanje splošnim metod začnimo s primerom splošne metode, ki bo omogoča izpis objektov tabele na zaslon. Zapišimo najprej izpis tabel z elementi različnih podatkovnih tipov z večkratnimi metodami. 1. /* VeckratnoDefiniraneMetode1.java 2. * Izpis tabel različnih tipov z uporabo večkratno definiranih metod. */ 3. public class VeckratnoDefiniraneMetode1 { public static void main(string[] args) { 6. // ustvarimo tabele z objekti različnih tipov 7. // tabela znakov INFORMATIKA, Programiranje 1 in 2 Stran 276

277 8. Character [] tabchar = { 'D','H','S','C','N','Z','A','K','O' }; 9. // tabela celih števil 10. Integer [] tabinteger = {23, 45, 67, 23, 55, 33, 34, 67}; 11. // tabela realnih števil 12. Double [] tabdouble = {2.3, 4.5, 67.0, 0.23, 5.5, 33.25, 34.14, 0.67}; 13. // izvršitev metod izpisov na zaslon System.out.printf("\nIzpis tabele znakov: "); 16. izpis(tabchar); 17. System.out.printf("\nIzpis tabele celih števil: "); 18. izpis(tabinteger); 19. System.out.printf("\nIzpis tabele realnih števil: "); 20. izpis(tabdouble); 21. } // main public static void izpis(character [] tabela) { 24. // za vse elemente tabele 25. for (Character element: tabela) { 26. System.out.printf("%s ", element); // izpis elementa 27. } // for 28. } // izpis public static void izpis(integer [] tabela) { 31. // za vse elemente tabele 32. for (Integer element: tabela) { 33. System.out.printf("%d ", element); // izpis elementa 34. } // for 35. } // izpis public static void izpis(double [] tabela) { 38. // za vse elemente tabele 39. for (Double element: tabela) { 40. System.out.printf("%4.2f ", element); // izpis elementa 41. } // for 42. } // izpis } // razred VeckratnoDefiniraneMetode1 Primer izvajanja: Izpis tabele znakov: D H S C N Z A K O Izpis tabele celih števil: Izpis tabele realnih števil: 2,30 4,50 67,00 0,23 5,50 33,25 34,14 0,67 Če primerjamo med seboj metode za izpis vidimo, da bi lahko zapisali le eno metodo za izpis. V tem primeru moramo s parametrom določiti podatkovni tip elementov tabele. Metodo za izpis zapišimo s splošnim podatkovnim tipom. 1. /*GenericMethod1.java 2. * Primer splošne metode za izpis elementov tabele */ 3. public class GenericMethod1 { public static void main(string[] args) { 6. // ustvarimo tabele z objekti različnih tipov 7. // tabela znakov Stran 277 ŠC VELENJE

278 8. Character [] tabchar = { 'D','H','S','C','N','Z','A','K','O' }; 9. // tabela celih števil 10. Integer [] tabinteger = {23, 45, 67, 23, 55, 33, 34, 67}; 11. // tabela realnih števil 12. Double [] tabdouble = {2.3, 4.5, 67.0, 0.23, 5.5, 33.25, 34.14, 0.67}; 13. // izvršitev metod izpisov na zaslon System.out.printf("\nIzpis tabele znakov: "); 16. izpis(tabchar); 17. System.out.printf("\nIzpis tabele celih števil: "); 18. izpis(tabinteger); 19. System.out.printf("\nIzpis tabele realnih števil: "); 20. izpis(tabdouble); 21. } // main public static < T > void izpis( T [] tabela) { 24. // za vse elemente tabele 25. for (T element: tabela) { 26. System.out.printf("%s ", element); // izpis elementa 27. } // for 28. } // izpis } // razred GenericMethod1 Primer izvajanja: Izpis tabele znakov: D H S C N Z A K O Izpis tabele celih števil: Izpis tabele realnih števil: Deklaracije splošnih metod vsebujejo parameter podatkovnega tipa zapisanega med trikotnimi oklepaji (< >), ki stoji pred podatkovnim tipom rezultata metode. V našem primeru < T >. Vsaka sekcija podatkovnega tipa enega ali več podatkovnih tipov parametrov, ki ločeni z vejico. Vsak parameter podatkovnega tipa je identifikator, ki določa splošen podatkovni tip. Parametre podatkovnih tipov lahko uporabimo za podatkovne tipe formalnih parametrov, podatkovne tipe lokalnih spremenljivk in podatkovni tip rezultata metode. Parametri podatkovnih tipov splošnih metod lahko vsebujejo samo referenčne podatkovne tipe (osnovni podatkovni tipi npr. int, char... niso dovoljeni). Imena parametrov podatkovnih tipov so lahko enaka v različnih splošnih metodah. public static < T > void izpisdvehtabel( T[] tabela1, T[] tabela2 ) Sekcija tipov parametrov metode izpisdvehtabel deklarira identifikator T za določitev podatkovnih tipov obeh parametrov (tabela1 in tabela2). Za imena parametrov tipov se priporoča uporaba posameznih velikih znakov npr. T, I, J... Prevajalnik pri prevajanju splošnih metod v zlogovno kodo odstrani sekcijo podatkovnih tipov in nadomesti vse splošne (generične) tipe s tipom Object. 1. // prevedena vmesna zlogovna koda splošne metode 2. public static void izpis( Object [] tabela) { 3. // za vse elemente tabele 4. for (Object element: tabela) { 5. System.out.printf("%s ", element); // izpis elementa 6. } // for 7. } // izpis INFORMATIKA, Programiranje 1 in 2 Stran 278

279 19.2 Splošne metode z vračanjem vrednosti splošnega tipa Oglejmo si primer splošne metode z vračanjem vrednosti metode, ki je splošnega podatkovnega tipa. Metoda vecjestevilo vrne večje število dveh dejanski parametrov, ki sta istega podatkovnega tipa. Relacijskega operatorja > ne moremo uporabiti nad referenčnim podatkovnim tipom. Primerjava dveh objektov istega razreda je možna, če razred implementira splošni vmesnik Comparable <T> (paket java.lang). Vsi oviti razredi osnovnih podatkovnih tipov implementirajo ta vmesnik. Objekti Comparable <T> vsebujejo metodo compareto. Primerjavo dveh celih števil stevilo1 in stevilo2 zapišemo z izrazom: stevilo1.compareto( stevilo2 ) Če deklariramo razred, ki implementira vmesnik Comparable<T>, potem moramo določiti metodo compareto. Metoda compareto vrne 0, če sta objekta enaka; negativno celo število, če je objekt1 manjši od objekta2 ali pozitivno celo število, če je objekt1 večji od objekta2. 1. /* VecjeStevilo.java 2. * Splošna metoda s primerjavo objektov osnovnih podatkovnih tipov. */ 3. public class VecjeStevilo { public static void main(string[] args) { 6. // izpis večjega števila z uporabo splošne metode 7. System.out.printf("\nVečje število od števil 10 in 15 je: %d", vecjestevilo(10, 15)); 8. System.out.printf("\nVečje število od števil 10.3 in 15.7 je: %.1f", vecjestevilo(10.3, 15.7)); 9. } // main /* vrednost T extends Comparable<T> v sekciji tipa parametra metode vecjestevilo določa, 12. * da je tip parametra objekt splošnega vmesnika Comparable<T> */ 13. public static <T extends Comparable<T> > T vecjestevilo( T stevilo1, T stevilo2) { 14. if ( (stevilo1.compareto(stevilo2)) > 0 ) // stevilo1 je večje od stevilo2 15. return stevilo1; // vrnemo rezultat stevilo1 16. else 17. return stevilo2; // vrnemo rezultat stevilo2 18. } //vecjestevilo } // razred VecjeStevilo Primer izvajanja: Večje število od števil 10 in 15 je: 15 Večje število od števil 10.3 in 15.7 je: 15,7 Metoda vecjestevilo vrača rezultat tipa parametra T kot rezultat metode. Vrednost T extends Comparable<T> v sekciji tipa parametra metode vecjestevilo določa, da je tip parametra objekt splošnega vmesnika Comparable<T> Razred Comparable predstavlja omejitev najvišjega razreda (z vidika hierarhije razredov) tipa parametra. Privzeto je razred Object omejitev najvišjega razreda tipa parametra. Za deklaracija omejitve najvišjega razreda v tipu parametra vedno uporabimo rezerviranko extends ne glede na to ali parameter tipa predstavlja razširitev razreda ali implementacijo vmesnika. Omejitev uporabe tipa parametra objekta Comparable<T> je pomembna, ker ne moremo primerjati objektov vseh razredov (vsi razredi ne vsebujejo metode compareto). Prevajalnik pri prevajanju splošne metode v vmesno (zlogovno) kodo odstrani sekcijo podatkovnih tipov in nadomesti vse splošne (generične) tipe s tipom Comparable. Stran 279 ŠC VELENJE

280 1. /* prevedena vmesna zlogovna koda splošne metode */ 2. public static Comparable vecjestevilo( Comparable stevilo1, Comparable stevilo2) { 3. if ( (stevilo1.compareto(stevilo2)) > 0 ) // stevilo1 je večje od stevilo2 4. return stevilo1; // vrnemo rezultat stevilo1 5. else 6. return stevilo2; // vrnemo rezultat stevilo2 7. } //vecjestevilo Večkratno definirane splošne metode Večkratno definirane (angl. Overloading) splošne metode z istim imenom uporabimo v primeru različnega števila parametrov metode. Npr. splošno metodo za izpis elementov lahko definiramo za izpis elementov celotne tabele ali le območa elementov tabele, ki je določeno s spodnjo in zgornjo vrednostjo indeksa tabele. Splošno metodo lahko večkratno definiramo tudi z običajno metodo Splošni (generični) razredi Prednost splošnega razreda podatkovne strukture sklada je v tem, da lahko za elemente uporabimo objekte poljubnega tipa razreda. Takšne razrede imenujemo parametrizirani splošni (generični) razredi. Oglejmo si primer definicije splošnega razreda sklada. V deklaraciji razreda Vozlisce smo za imenom razreda uporabili tip parametra razreda - <T>. public class Vozlisce <T> Parameter določa podatkovni tip elementa vozlišča (tip elementa razreda). Atribut element je podatkovnega tipa parametra razreda. private T element; Atribut naslednik predstavlja referenco (povezavo) na naslednji element razreda. private Vozlisce <T> naslednik 1. /* Vozlisce.java 2. vozlišče vsebuje element in referenco na naslednji element */ 3. package vaje; 4. public class Vozlisce <T> { 5. private T element; // element 6. private Vozlisce <T> naslednik=null; // referenca na naslednji element 7. // konstruktor 8. public Vozlisce(T element) { 9. this.element = element; // določimo vrednost elementa 10. } // Vozlisce public T vrnielement () { 13. return element; 14. } // vrnielement public void dolocielement(t element) { 17. this.element = element; 18. } // dolocielement public Vozlisce <T> vrninaslednik() { 21. return naslednik; 22. } // vrninaslednik 23. INFORMATIKA, Programiranje 1 in 2 Stran 280

281 24. public void dolocinaslednik(vozlisce<t> naslednik) { 25. this.naslednik = naslednik; 26. } // dolocinaslednik public void izpiselementvozlisca() { 29. System.out.printf("Vrednost elementa: %s.", element); 30. } // izpiselementvozlisca } // razred Vozlisce 1. /* PovezanSeznam.java, 2. * sklad, izvedba enosmerno povezan seznam */ 3. package vaje; 4. public class PovezanSeznam < T > { 5. private Vozlisce < T > prvi; // prvi element povezanega seznama public PovezanSeznam() { 8. prvi = null; // prvi element nima vrednosti 9. } // PovezanSeznam public void push(t podatek) { //vstavi na začetek seznama 12. Vozlisce <T> novovozlisce = new Vozlisce <T> (podatek); // ustvarimo vozlisce 13. novovozlisce.dolocinaslednik(prvi); // nasledniku vozlišča določimo referenco prvega vozlisca 14. prvi = novovozlisce; // prvemu vozlišču določimo referenco novega vozlišča 15. } // push public T pop(){ 18. if (prvi == null) // seznam prazen 19. return null; 20. else 21. { 22. T elementprvi = prvi.vrnielement(); // shranimo vrednost prvega elementa 23. Vozlisce <T> noviprvi = prvi.vrninaslednik(); // referenca novega prvega vozlišča je naslednik od prvega 24. prvi = noviprvi; // prvemu vozlišču določimo referenco novega vozlišča 25. return elementprvi; // vrnemo vrednost prvega elementa 26. } // else 27. } // pop public T vrnielementvrh(){ 30. if (prvi == null) // seznam prazen 31. return null; 32. else 33. return prvi.vrnielement(); // vrnemo vrednost prvega elementa 34. } // vrnielementvrh public void izpisi() { 38. Vozlisce <T> trenutnovozlisce = prvi; 39. // dokler trenutno vozlišče ni null 40. while (trenutnovozlisce!= null) 41. { 42. // izpišemo element vozlišča 43. System.out.printf("%s ", trenutnovozlisce.vrnielement()); Stran 281 ŠC VELENJE

282 44. // premik na naslednika 45. trenutnovozlisce = trenutnovozlisce.vrninaslednik(); 46. } // while 47. System.out.println(); 48. } // izpisi } // PovezanSeznam 1. /* PovezanSeznamTest.java 2. * Testni razred - izvedba sklada s povezanim seznamom */ 3. package vaje; 4. public class PovezanSeznamTest { public static void main(string[] args) { 7. // ustvarimo sklad, implementacija uporabniško definiran povezan seznam 8. PovezanSeznam < Integer > sklad = new PovezanSeznam < Integer > (); 9. // vstavljanje na vrh sklada sklad.push(new Integer(10)); 12. sklad.push(new Integer(20)); 13. sklad.push(new Integer(30)); 14. // izpis vseh elementov sklada 15. System.out.println("Elementi sklada: "); 16. sklad.izpisi(); 17. // izpis elementa z vrha sklada 18. System.out.printf("\nPrvi element seznama: %s.", sklad.pop()); 19. // izpis elementa z vrha sklada 20. System.out.printf("\nPrvi element seznama: %s.", sklad.pop()); 21. } // main } // razred PovezanSeznamTest Primer izvajanja: Elementi sklada: Prvi element seznama: 30. Prvi element seznama: Uporaba znaka? za določitev tipa parametra splošne metode Nadomestni znak? uporabimo v določitvi podatkovnega tipa parametra metode, če želimo določiti hierarhično najvišji razred za podatkovni tip parametra. public static double vsota( StackGen <? extends Number> sklad1 ) Podatkovni tip parametra <? extends Number> določa, da je parameter metode vsota lahko kateregakoli podatkovnega tipa, ki je naslednik razreda Number (npr. Integer, Double...). Za podatkovni tip elementov sklada uporabimo razred Number. To nam omogoča, da lahko v sklad dodajamo elemente razredov Integer, Double... Ustvarimo splošno metodo za izračun vsote elementov sklada (elemente vzamemo z vrha sklada). 1. /* StackGenDemo2.java 2. Uporaba nadomestnega znaka? pri določitvi splošnega tipa parametra metode */ 3. package vaje; INFORMATIKA, Programiranje 1 in 2 Stran 282

283 4. public class StackGenDemo2 { public static void main(string[] args) { 7. // ustvarimo in izpišemo sklad elementov tipa razreda Number 8. StackGen <Number> sklad = new StackGen <Number> (); 9. // v sklad dodamo elemente, ki so nasledniki razreda Number 10. sklad.push(new Integer(40) ); 11. sklad.push(new Double(5.5) ); 12. sklad.push(new Integer(60) ); 13. sklad.push(new Double(7.5) ); 14. System.out.printf("\nVsota elementov sklada: %f. \n",vsota(sklad) ); // nova vrstica 15. } // main // splošna metoda za izračun vsote elementov sklada 18. public static double vsota( StackGen <? extends Number> sklad1 ) { 19. double tvsota = 0.0; // tvsota je nič 20. // dokler sklad1 ni prazen 21. while (! sklad1.isempty() ) { 22. Number element = sklad1.pop(); // z vrha sklada vzamemo element 23. tvsota = tvsota + element.doublevalue(); // vrednost elementa prištejemo vsoti 24. } // while 25. return tvsota; // vrnemo vrednost tvsota 26. } // vsota } // konec razred StackGenDemo2 20 GRAFIČNI VMESNIK (NADALJEVANJE) 20.1 Drsni trak Drsnik (angl. JSliders) omogoča določitev celoštevilčne vrednosti iz območja celoštevilčnih vrednosti. Če je drsnik aktivni gradnik (aktivni focus), potem lahko vrednosti drsnika določamo s tipkovnico ali miško. Puščica v levo zmanjša vrednost drsnika za ena, puščica v desno poveča vrednost za ena, puščica navzgor poveča vrednost za večjo spremembo (10), puščica navdol zmanjša vrednost za večjo spremembo (10), tipka Home določi minimalno vrednost, tipka End pa največjo vrednost. Drsnik lahko ima vodoravno ali navpično postavitev. Relativni položaj drsnika v drsnem traku določa vrednost drsnika. Konstruktor Opis JSlider() Ustvari drsni trak z območjem od 0 do 100 s privzeto vrednostjo 50. JSlider(int postavitev) Ustvari drsni trak določene postavitve z območjem od 0 do 100 s privzeto vrednostjo 50. JSlider(int min, int maks) Ustvari vodoravni drsnik za določeno območje min.. maks z vrednostjo povprečja območja. JSlider(int min, int max, int vrednost) Ustvari vodoravni drsnik za določeno območje s podano privzeto vrednostjo. JSlider (int postavitev, int min, int maks, int Ustvari drsni trak določene postavitve z območjem od min do maks s vrednost) privzeto vrednostjo vrednost. Stran 283 ŠC VELENJE

284 Metoda Opis void setminimum (int minimum) Določi najmanjšo vrednost območja drsnega traka. void setmaximum (int maximum) Določi največjo vrednost območja drsnega traka. void setvalue (int n) Določi vrednost drsnika na n. int getvalue () Vrne vrednost drsnika. addchangelistener (ChangeListener l) Doda poslušalca dogodkov void setmajortickspacing (int n) Določi vrednost območja glavnih ločilnih črt. void setminortickspacing (int n) Določi vrednost območja pomožnih ločilnih črt. Oglejmo si primer, ko vmesnik vsebuje drsnik za izbiro vrednosti od 0 do 100. Vrednost drsnika predstavlja vrednosti stranic pravokotnika, ki ga izrišemo ob vsaki spremembi vrednosti drsnika. 1. /* PloscaPravokotnik.java 2. * Razred s ploščo na katero izrišemo pravokotnik. */ 3. import java.awt.color; 4. import java.awt.graphics; 5. import java.util.random; 6. import javax.swing.jpanel; public class PloscaPravokotnik extends JPanel { 9. private int x, y; // levi zgornji rob pravokotnika 10. private int a, b; // stranici pravokotnika 11. private Color barva; // metoda za izris 14. public void paintcomponent (Graphics g) { 15. super.paintcomponent(g); 16. // izberemo naključno barvo 17. barva=new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); 18. g.setcolor(barva); // določimo barvo risanja 19. g.fillrect(x, y, a, b); // izrišemo pravokotnik levi zgornji rob točka (x,y), stranici a in b 20. } // paintcomponent // konstruktor 23. public PloscaPravokotnik(int x, int y, int a, int b) { 24. this.x = x; 25. this.y = y; 26. this.a = a; 27. this.b = b; 28. } // PloscaPravokotnik // določitev lastnosti pravokotnika 31. public void dolocipravokotnik(int x, int y, int a, int b) { 32. this.x = x; 33. this.y = y; 34. this.a = a; 35. this.b = b; 36. repaint(); // ponovni izris 37. } // dolocipravokotnik } // razred PloscaPravokotnik 1. /* OknoJSlider1.java INFORMATIKA, Programiranje 1 in 2 Stran 284

285 2. * Vmesnik, okno z drsnikom in ploščo s pravokotnikom */ 3. import javax.swing.jframe; 4. import javax.swing.jslider; 5. import javax.swing.border.emptyborder; 6. import javax.swing.event.changeevent; 7. import javax.swing.event.changelistener; public class OknoJSlider1 extends JFrame { 10. private PloscaPravokotnik plosca; // plošča s pravokotnikom 11. private JSlider drsnik; // drsnik // konstruktor za ustvarjanje okna 14. public OknoJSlider1() { 15. // določimo naslov okna 16. settitle("drsnik, izris pravokotnika"); 17. setdefaultcloseoperation(jframe.exit_on_close); // privzeta operacija, ko zapremo okno - izhod 18. // določimo območje okna 19. setbounds(100, 100, 400, 327); // ustvarimo ploščo s pravokotnikom, levi zgornji rob točka (10,10), starnici 50, plosca = new PloscaPravokotnik(10,10, 50,50); 23. plosca.setborder(new EmptyBorder(5, 5, 5, 5)); // ustarimo prazno obrobo 24. setcontentpane(plosca); // določimo delovno ploščo 25. plosca.setlayout(null); // določimo absolutno razporejanje drsnik = new JSlider(); 28. // odzivni dogodek, sprememba vrednosti drsnika 29. drsnik.addchangelistener(new ChangeListener() { 30. public void statechanged(changeevent arg0) { 31. plosca.dolocipravokotnik(10, 10, drsnik.getvalue(),drsnik.getvalue() ); 32. } // statechanged 33. }); // ChangeListener 34. drsnik.setmajortickspacing(10); // razmik glavnih črtic drsnik.setminortickspacing(5); // razpik pomožnih črtic drsnik.setpaintticks(true); // na drsniku prikažemo črtice 37. drsnik.setbounds(10, 255, 364, 31); // določimo območje drsnika 38. getcontentpane().add(drsnik); // drsnik dodamo na ploščo 39. } // OknoJSlider } // razred OknoJSlider1 1. /* OknoJSlider1.java 2. * */ 3. public class OknoSliderTest { public static void main(string[] args) { 6. // ustvarimo okno 7. OknoJSlider1 okno = new OknoJSlider1(); 8. okno.setvisible(true); // prikažemo okno; 9. } // main } // razred OknoSliderTest Stran 285 ŠC VELENJE

286 Primer izvajanja: Meni Meniji (angl. Menus) omogočajo uporabniku izvajanje aktivnosti programa. V Swing vmesnikih lahko meni določimo komponenti razreda, ki vsebuje metodo setjmenubar (npr. JFrame in JApplet). Meni prikažemo v menijski vrstici ali vsebinskem (priročnem) meniju. Vsebinski meni se prikaže pod položajem utripalke (angl. cursor). Za izdelavo menijev uporabljamo razrede JMenuBar, JMenu, JMenuItem, JCheckBoxMenuItem in JRadioButtonMenuItem. INFORMATIKA, Programiranje 1 in 2 Stran 286

287 Razred JMenuBar (vsebnik za menije) omogoča delo z menijsko vrstico. Razred JMenu (razširitev razreda JMenuItem) vsebuje metode za upravljanje menija. Razred JMenuItem omogoča upravljanje elementov menija. Element menija lahko uporabimo za izvršitev aktivnosti ali za prikaz podmenija. Razred JCheckBoxMenuItem predstavlja preklopni gumb menija (vklopljen ali izklopljen). Razred JRadioButtonMenuItem predstavlja radijski gumb menija. JMenuBar Objekt JMenuBar predstavlja menijsko vrstico, ki jo z metodo objektjframe.setmenubar povežemo z objektom razreda JFrame. Menijska vrstica vsebuje ukaze, bližnjice... za izvajanje aktivnosti. Konstruktor MenuBar() Ustvari novo menijsko vrstico. Metoda Opis Menu add (Menu m) Doda meni v menijsko vrstico. void remove (int indeks) Iz menijske vrstice odstrani meni na določenem indeksu. void remove (MenuComponent m) Iz menijske vrstice odstrani komponento. Menu getmenu (int indeks) Iz menijske vrstice vrne meni na položaju indeksa. MenuItem getshortcutmenuitem Vrne element menija, ki je povezan s podano bljižnico. (MenuShortcut bljiznica) void deleteshortcut (MenuShortcut Brisanje določene bljižnice. bljiznica) Enumeration<MenuShortcut> shortcuts () Vrne naštevni seznam vseh bljižnic menija. Stran 287 ŠC VELENJE

288 JMenu Objekt JMenu predstavlja implementacijo menija. Meni predstavlja podokno z elementi menija, ki se prikažejo, ko izberemo element menijske vrstice. Poleg elementov menija lahko vsebuje tudi ločitvene črte (JSeparators). Konstruktor JMenu () JMenu (String besedilo) JMenu (Action aktivnost) Ustvari nov meni brez besedila. Ustvari nov meni z besedilom. Ustvari nov element menija z lastnostmi pridobljenimi iz aktivnosti. Element menija doda na konec menija. Metoda Opis JMenuItem add (JMenuItem elemmenija) Na konec menija doda nov element menija. Component add (Component komponenta) Na konec menija doda novo komponento. Component add (Component komponenta, Na določeno mesto indeksa v meni doda novo komponento. int indeks) JMenuItem add (String besedilo) Ustvari nov element menija z določenim besedilom in ga doda na konec menija. AbstractButton Metoda void setmnemonic (char mnemonic) int getmnemonic () void doclick () void seticon (Icon ikona) Icon geticon () void setaction (Action a) Action getaction () Opis Določi ali vrne znak za aktiviranje gumba (znak je lahko 'a'.. 'z' ali 'A'.. 'Z'). Programsko izvrši klik. Določi ali vrne ikono gumba. Določi ali vrne aktivnost. JMenuItem Objekt JMenuItem predstavlja element menija. Konstruktor JMenuItem() JMenuItem(Icon icon) JMenuItem(String text) JMenuItem (Action aktivnost) JMenuItem (String besedilo, Icon ikona) Metoda void setaccelerator (KeyStroke tipke) KeyStroke getaccelerator () Ustvari nov element menija brez besedila in ikone. Ustvari nov element menija z določeno ikono. Ustvari nov element menija z določenim besedilom. Ustavri nov element menija z vrednostmi lastnosti pridobljenimi iz aktivnosti. Ustvari nov element menija z določenim besedilom in ikono. Opis Določi ali vrni bližnjico (kombinacija tipk). INFORMATIKA, Programiranje 1 in 2 Stran 288

289 Oglejmo si primer menija za določitev oblikovnih lastnosti oznake besedila. Oznaki besedila s pomočjo menija oblikovanje določimo barvo, tipografijo in slog pisave. Meni datoteka vsebuje ukaza za prikaz sporočilnega okna z informacijo in izhod iz programa. 1. /* MeniOkno1.java */ 2. /* Primer menijske vrstice z dvema menijema datoteka in oblikovanje. 3. * Meni datoteka vsebuje ukaza informacije in izhod. 4. * Meni oblikovanje vsebuje podmenija barva (črna, modra, siva) in pisava (tipografija pisave: Arial Narrow, Calibri, SansSerif; slog: krepko, poševno). 5. * Oblikovne lastnosti določimo komponenti besedilne oznake (JLabel). 6. * */ 7. import java.awt.borderlayout; 8. import java.awt.color; 9. import java.awt.font; 10. import java.awt.event.actionevent; 11. import java.awt.event.actionlistener; 12. import java.awt.event.itemevent; 13. import java.awt.event.itemlistener; import javax.swing.buttongroup; 16. import javax.swing.jcheckboxmenuitem; 17. import javax.swing.jframe; 18. import javax.swing.jlabel; 19. import javax.swing.jmenu; 20. import javax.swing.jmenubar; 21. import javax.swing.jmenuitem; 22. import javax.swing.joptionpane; 23. import javax.swing.jradiobuttonmenuitem; 24. import javax.swing.swingconstants; public class MeniOkno1 extends JFrame { 27. // atributi za izdelavo menija 28. private final Color [] barvepisave = { Color.BLACK, Color.BLUE, Color.GRAY }; // tabela nabor barv 29. private JRadioButtonMenuItem [] barvemenitabelementi; // tabela radijskih gumbov menija za barve 30. private ButtonGroup barvaskupina; // skupina menija za barvo 31. private JRadioButtonMenuItem [] pisavemenitabelementi; // tabela radijskih gumbov menija za pisave 32. private ButtonGroup pisavaskupina; // skupina menija za pisavo 33. private JCheckBoxMenuItem [] slogimenitabelementi; // tabela stikal menija za slog pisave (krepko...) 34. int slogvrednost; // vrednost za izbor sloga pisave 35. private JLabel lbloznakabesedilo; // oznaka z besedilom public MeniOkno1() { 38. super("demonstracija menijev"); // izvršio konstruktor razreda JFrame 39. JMenu datotekameni = new JMenu("Datoteka"); // ustvarimo meni Datoteka 40. datotekameni.setmnemonic('d'); // izbor ALT+D 41. Stran 289 ŠC VELENJE

290 42. // Informacije 43. JMenuItem infodatoteka = new JMenuItem("Informacije"); // ustvarimo element menija 44. infodatoteka.setmnemonic('i'); // izbor ALT+I 45. datotekameni.add(infodatoteka); // element menija dodamo v meni Datoteka 46. // registracija poslušalca odzivnih dogodkov 47. infodatoteka.addactionlistener( 48. // anonimni notranji razred 49. new ActionListener() { // odzivni dogodek za Informacije 51. public void actionperformed(actionevent e) { 52. // izpišemo obvestilo s pogovornim oknom 53. JOptionPane.showMessageDialog(MeniOkno1.this, "Primer izdelave menijev","info",joptionpane.information_message); 54. } // actionperformed 55. } /* anonimni notranji razred */ ); // addactionlistener // Izhod 58. JMenuItem izhoddatoteka = new JMenuItem("Izhod"); // ustvarimo element menija 59. izhoddatoteka.setmnemonic('z'); // izbor ALT+Z 60. datotekameni.add(izhoddatoteka); // element menija dodamo v meni Datoteka 61. // registracija poslušalca dogodkov 62. izhoddatoteka.addactionlistener( 63. new ActionListener() { 65. public void actionperformed(actionevent e) { 66. System.exit(0); // izhod iz programa 67. } // actionperformed 68. } /*anonimni notranji razred */ ); // addactionlistener // ustvarimo menijsko vrstico 71. JMenuBar menijskavrstica = new JMenuBar(); 72. this.setjmenubar(menijskavrstica); // menijsko vrstico dodamo v okno 73. menijskavrstica.add(datotekameni); // meni datoteka vstavimo v menijsko vrstico JMenu oblikovanjemeni = new JMenu("Oblikovanje"); // ustvarimo meni oblikovanje 76. oblikovanjemeni.setmnemonic('o'); // izbor ALT+O String barvabesedilotab[] = {"Črna", "Modra", "Siva" }; // tabela besedilnih vrednosti barv 79. JMenu barvameni = new JMenu("Barva"); // ustvarimo meni barva 80. barvameni.setmnemonic('b'); 81. // ustvarimo elemente menija barv - radijske gumbe 82. barvemenitabelementi = new JRadioButtonMenuItem[barvaBesediloTab.length]; // ustvarimo tabelo radijskih gumbov menija, število elementov tabele besedilnih vrednosti barv 83. // ustvarimo skupino radijskih gumbov za meni barv; v skupini je izbran največ en radijski gumb 84. barvaskupina = new ButtonGroup(); 85. ItemHandler itemhandler = new ItemHandler(); // upravljalec odzivnih dogodkov menija // ustvarimo elemente menija vrste radijski gumbi 88. // zanka za vse elemente tabele barvabesedilotab 89. for (int i=0; i< barvabesedilotab.length; i++) { 90. barvemenitabelementi[i] = new JRadioButtonMenuItem(barvaBesediloTab[i]); // ustvarimo element menija vrste radijski gumb 91. barvameni.add(barvemenitabelementi[i]); // v meni barvameni dodamo element menija vrste radijski gumb barve 92. barvaskupina.add(barvemenitabelementi[i] ); // element menija dodamo v skupino INFORMATIKA, Programiranje 1 in 2 Stran 290

291 93. barvemenitabelementi[i].addactionlistener(itemhandler); // registriramo poslušalca dogodkov 94. } // for barvemenitabelementi[0].setselected(true); // izberemo prvi radijski gumb menija barv 97. oblikovanjemeni.add(barvameni); // vstavimo meni barve v meni oblikovanje 98. oblikovanjemeni.addseparator(); // v meni vstavimo separator - ločilno črto // ustvarimo tabelo seznama pisav 101. String [] pisavetab = { "Arial Narrow", "Calibri", "SansSerif" }; 102. JMenu pisavameni= new JMenu("Pisava"); // ustvarimo meni pisav 103. pisavameni.setmnemonic('p'); // izbor ALT+P pisavemenitabelementi = new JRadioButtonMenuItem[pisaveTab.length]; // ustvarimo tabelo radijskih gumbov menija, število elementov tabele besedilnih vrednosti pisav 106. // ustvarimo skupino radijskih gumbov za meni pisav; v skupini je izbran največ en radijski gumb 107. pisavaskupina = new ButtonGroup(); 108. // zanka za vse elemente tabele pisavetab 109. for (int i=0; i<pisavetab.length; i++ ) { 110. pisavemenitabelementi[i]= new JRadioButtonMenuItem(pisaveTab[i]); // ustvarimo element menija vrste radijski gumb 111. pisavameni.add(pisavemenitabelementi[i]); // v meni pisavameni dodamo element menija vrste radijski gumb pisave 112. pisavaskupina.add(pisavemenitabelementi[i]); // element menija dodamo v skupino 113. pisavemenitabelementi[i].addactionlistener(itemhandler); // registriramo poslušalca dogodkov 114. } // for pisavemenitabelementi[0].setselected(true); // izberemo prvi radijski gumb menija pisav 117. pisavameni.addseparator(); // v meni vstavimo separator - ločilno črto String[] slogitab = { "Bold", "Italic" }; // tabela slogov 120. slogimenitabelementi = new JCheckBoxMenuItem[slogiTab.length]; // ustvarimo tabelo stikalnih gumbov menija, število elementov tabele lastnosti slogitab 121. StyleHandler stylehandler = new StyleHandler(); // ustvarimo elemente menija za slog pisave 124. for (int i=0; i< slogitab.length; i++) { 125. slogimenitabelementi[i] = new JCheckBoxMenuItem(slogiTab[i]); // ustvarimo element menija vrste stikalo 126. pisavameni.add(slogimenitabelementi[i]); // v meni pisavameni dodamo element menija - stikalo 127. slogimenitabelementi[i].additemlistener(stylehandler); // registriramo poslušalca dogodkov 128. } // for oblikovanjemeni.add(pisavameni); // vstavimo meni pisave v meni oblikovanje 131. menijskavrstica.add(oblikovanjemeni); // v menijsko vrstico vstavimo meni oblikovanje // ustvarimo oznako besedila 134. lbloznakabesedilo = new JLabel("Testno besedilo.",swingconstants.center); 135. lbloznakabesedilo.setforeground( barvepisave[0]); // barva ospredja privzeto prva barva pisave 136. lbloznakabesedilo.setfont(new Font(pisaveTab[0],Font.PLAIN,64) ); // ime prve vrste pisave 137. this.getcontentpane().setbackground(color.light_gray); // določimo svetlo sivo ozadje 138. this.getcontentpane().add(lbloznakabesedilo,borderlayout.center); // oznako besedila vstavimo na ploščo 139. } // konstruktor MeniOkno // notranji razred poslušalca odzivnih dogodkov vmesnika ActionListener Stran 291 ŠC VELENJE

292 142. // izbira radijski gumbi menija 143. private class ItemHandler implements ActionListener { 144. public void actionperformed(actionevent dogodek) { 145. // obdelava barv, za vse elemente barv 146. for (int i=0; i< barvemenitabelementi.length; i++) 147. if (barvemenitabelementi[i].isselected() ) // če je izbran element barve v meniju 148. { 149. lbloznakabesedilo.setforeground(barvepisave[i]); // oznaki določimo barvo ospredja 150. break; // izhod iz stavka for 151. } 152. // obdelava vrst pisav, za vse elemente menija pisav 153. for (int i=0; i< pisavemenitabelementi.length; i++) 154. if ( dogodek.getsource() == pisavemenitabelementi[i] ) // če je dogodek prožen na i-tem elemntu menija (pisavi) 155. { // določimo pisavo oznake 156. lbloznakabesedilo.setfont( 157. new Font (pisavemenitabelementi[i].gettext(), slogvrednost, 64 ) ); 158. break; // izhod iz stavka for 159. } 160. repaint(); 161. } // actionperformed 162. } // notranji razred ItemHandler // notranji razred poslušalca odzivnih dogodkov vmesnika ItemListener 166. // izbira stikal menija 167. private class StyleHandler implements ItemListener { 168. public void itemstatechanged( ItemEvent e ) { 169. String imepisave = lbloznakabesedilo.getfont().getname(); // ugotovimo ime pisave oznake besedila 170. Font pisava; // objekt pisave 171. if (slogimenitabelementi[0].isselected() && slogimenitabelementi[1].isselected() ) { 172. slogvrednost = Font.BOLD + Font.ITALIC; 173. pisava = new Font(imePisave, slogvrednost, 64); 174. } 175. else if (slogimenitabelementi[0].isselected() ) { 176. slogvrednost = Font.BOLD; 177. pisava = new Font(imePisave, Font.BOLD, 64); 178. } 179. else if (slogimenitabelementi[1].isselected() ) { 180. slogvrednost = Font.ITALIC; 181. pisava = new Font(imePisave, Font.ITALIC, 64); 182. } 183. else { 184. slogvrednost = Font.PLAIN; 185. pisava = new Font(imePisave, Font.PLAIN, 64); 186. } // if 187. lbloznakabesedilo.setfont( pisava ); 188. repaint(); // ponovni izpis plošče 189. } // itemstatechanged 190. } // notranji razred ItemHandler } // konec razred MeniOkno1 1. /* MeniOkno1Test.java 2. * Testni razred za demonstracijo menija INFORMATIKA, Programiranje 1 in 2 Stran 292

293 3. * */ 4. import javax.swing.jframe; public class MeniOkno1Test { public static void main(string[] args) { 9. // ustvarimo objekt razreda MeniOkno1 (okno z menijem) 10. MeniOkno1 okno = new MeniOkno1(); 11. okno.setdefaultcloseoperation(jframe.exit_on_close); // zapiranje okna zapre program 12. okno.setbounds(100, 100, 600, 300); // območje velikosti okna 13. okno.setvisible(true); // prikažemo okno 14. } // main } // MeniOkno1Test Primer delovanja: Vsebinski (priročni) meni Vsebinski meni vsebuje najpogostejše ukaze, ki so na voljo za izbrano komponento. Vsebinski meni se običajno prikaže ob desnem kliku objekta. Swing paket vsebuje razred JPopupMenu, ki ga uporabimo za izdelavo vsebinskih menijev. JPopupMenu Konstruktor JPopupMenu () JPopupMenu (String besedilo) Ustvari nov vsebinski meni brez besedila. Ustvari nov vsebinski meni z besedilom. Metoda JMenuItem add (JMenuItem elemmenija) JMenuItem add (String besedilo) Stran 293 Opis Na konec menija doda nov element menija. Ustvari nov element menija z določenim besedilom in ga doda na konec menija. ŠC VELENJE

294 Oglejmo si primer vsebinskega menija za določitev barve ozadja okna (JFrame). 1. /* MeniPopup1.java 2. * Določitev barve ozadja okna z uporabo vsebinskega menija. */ 3. import java.awt.color; 4. import java.awt.event.actionevent; 5. import java.awt.event.actionlistener; 6. import java.awt.event.mouseadapter; 7. import java.awt.event.mouseevent; import javax.swing.buttongroup; 10. import javax.swing.jframe; 11. import javax.swing.jpopupmenu; 12. import javax.swing.jradiobuttonmenuitem; public class MeniPopup1 extends JFrame { 15. // atributi 16. private JRadioButtonMenuItem[] rbmenielementtab; // tabela elementov menija - radijski gumbi 17. private final Color[] barvecolortab = { Color.BLUE, Color.GRAY, Color.YELLOW }; // tabela barv - možnosti menija 18. private JPopupMenu pumenibarve; // vsebinski meni; public MeniPopup1() { 21. super("uporaba vsebinskega menija"); // klic konstruktorja razreda JFrame 22. String [] barvebesedilotab = { "Modra","Siva","Rumena" }; 23. PoslusalecDogodkov poslusalecdogodkov = new PoslusalecDogodkov(); // ustvarimo poslušalca dogodkov ButtonGroup bgskupinabarve = new ButtonGroup(); // ustvarimo skupino radijskih gumbov 26. pumenibarve = new JPopupMenu(); // ustvarimo vsebinski meni 27. rbmenielementtab = new JRadioButtonMenuItem[barveBesediloTab.length]; // ustvarimo tabelo, elementi menija - radijski gumbi 28. // določimo elemente tabele 29. for (int i=0; i<rbmenielementtab.length; i++) { 30. rbmenielementtab[i] = new JRadioButtonMenuItem(barveBesediloTab[i]); // ustvarimo element menija vrste radijski gumb 31. pumenibarve.add(rbmenielementtab[i]); // element menija dodamo v meni 32. bgskupinabarve.add(rbmenielementtab[i]); // element menija dodamo v skupino za izbor barve 33. rbmenielementtab[i].addactionlistener(poslusalecdogodkov); // element menija registriramo poslušalca dogodkov 34. } // for 35. this.setbackground(color.white); // določimo belo ozadje 36. getcontentpane().setlayout(null); // deklaracija poslušalca dogodkov za miško, anonimni razred implementacija vmesnika MouseAdapter 40. this.addmouselistener(new MouseAdapter() { INFORMATIKA, Programiranje 1 in 2 Stran 294

295 42. public void mousepressed(mouseevent dogodek) { 43. if (dogodek.ispopuptrigger()) // preverimo, če je dogodek prožilec prikaza vsebinskega menija 44. pumenibarve.show(dogodek.getcomponent(), dogodek.getx(), dogodek.gety()); // prikažemo vsebinski meni na mestu komponente, kjer je prožen 45. } // mousepressed public void mousereleased(mouseevent dogodek) { 49. if (dogodek.ispopuptrigger()) // preverimo, če je dogodek prožilec prikaza vsebinskega menija 50. pumenibarve.show(dogodek.getcomponent(), dogodek.getx(), dogodek.gety()); // prikažemo vsebinski meni na mestu komponente, kjer je prožen 51. } // mousereleased 52. } ); 53. } // konstruktor // notranji razred poslušalec dogodkov 56. private class PoslusalecDogodkov implements ActionListener { public void actionperformed (ActionEvent dogodek) { 59. // zanka za vse elemente tabele, elementi menija, ki predstavljajo barvo 60. for (int i=0; i<rbmenielementtab.length; i++ ) 61. if (dogodek.getsource() == rbmenielementtab[i] ) // ugotovimo kateri element menija je vir dogodka 62. { 63. getcontentpane().setbackground(barvecolortab[i]); // določimo barvo ozadja 64. break; // izhod iz zanke for 65. } // if // for 66. } // actionperformed 67. } // PoslusalecDogodkov } // razred MeniPopup1 1. /* MeniPopup1Test.java 2. * Testni razred za demonstracijo vsebinskega menija 3. * */ 4. import javax.swing.jframe; public class MeniPopup1Test { public static void main(string[] args) { 9. // ustvarimo objekt razreda MeniOkno1 (okno z menijem) 10. MeniPopup1 okno = new MeniPopup1(); 11. okno.setdefaultcloseoperation(jframe.exit_on_close); // zapiranje okna zapre program 12. okno.setbounds(100, 100, 600, 300); // območje velikosti okna 13. okno.setvisible(true); // prikažemo okno 14. } // main } // MeniPopup1Test Primer izvajanja Stran 295 ŠC VELENJE

296 Slog grafičnega vmesnika Slog GUI komponent je različen na različnih platformah (Windows, Unix, Mac). Razred javax.swing.uimanager.lookandfeel omogoča določitev sloga grafičnega vmesnika. Razred LookAndFeel uporabimo za prilagoditev sloga uporabniškega grafičnega vmesnika. Nameščene sloge uporabniškega vmesnika izbiramo z uporabo razreda javax.swing.uimanager.lookandfeelinfo. Statična metoda getinstalledlookandfeels() razreda UIManager vrne tabelo objektov razreda UIManager.LookAndFeelInfo, ki predstavlja vse nameščene sloge uporabniškega vmesnika. Metoda getname() razreda UIManager.LookAndFeelInfo vrne besedilno vrednost sloga grafičnega vmesnika. Slog Nimbus predstavlja izboljšan slog, ki se pogosto uporablja pri ustvarjanju vmesnika. S statično metodo setlookandfeel() razreda UIManager določimo slog grafičnega vmesnika. UIManager.setLookAndFeel(lfIzglediTabela[i].getClassName() Statična metoda updatecomponenttreeui razreda SwingUtilities uveljavi določen slog na vseh komponentah kontrolnika (vsebnika). SwingUtilities.updateComponentTreeUI(this); Oglejmo si primer prikaza oblik vseh nameščenih slogov grafičnega vmesnika. V spodnjem delu okna z uporabo radijskih gumbov omogočimo izbiro nameščenega sloga grafičnega vmesnika. V zgornjem delu okna v besedilu oznake izpišimo izbran slog. Pod oznako postavimo gumb z napisom "Gumb...". Pod gumb vstavimo kombinirano polje s prikazom nameščenih slogov. 1. /* LookAndFeel1.java 2. * Demonstracija uporabe sloga izgleda - razred UIManager */ 3. import java.awt.gridlayout; 4. import java.awt.event.itemevent; 5. import java.awt.event.itemlistener; 6. import javax.swing.buttongroup; 7. import javax.swing.jbutton; 8. import javax.swing.jcombobox; 9. import javax.swing.jframe; 10. import javax.swing.jlabel; 11. import javax.swing.jpanel; 12. import javax.swing.jradiobutton; 13. import javax.swing.swingconstants; 14. import javax.swing.swingutilities; 15. import javax.swing.uimanager; 16. INFORMATIKA, Programiranje 1 in 2 Stran 296

297 17. public class LookAndFeel1 extends JFrame { 18. // atributi 19. private UIManager.LookAndFeelInfo[] lfizgleditabela; // tabela izgledov 20. private String[] izglediimenatab; // besedilne vrednosti imen izdledov 21. private JRadioButton[] rbizgleditabela; // tabela radijskih gumbov izgledov 22. private ButtonGroup bgizgledi; // skupina radijskih gumbov 23. private JButton btnuporabiizgled; // prikaz izgleda gumba 24. private JLabel lblizgled; // prikaz izgleda oznake 25. private JComboBox cbizgled; // prikaz izgleda kombiniranega polja public LookAndFeel1() { 28. super("slogi GUI"); 29. lfizgleditabela = UIManager.getInstalledLookAndFeels(); // v tabelo shranimo nameščene izglede 30. izglediimenatab = new String[lfIzglediTabela.length]; // ustvarimo tabelo besedil izgledov, število elementov nameščenih izgledov 31. // določimo besedilne vrednosti imen izgledov 32. for (int i=0; i< lfizgleditabela.length; i++) 33. izglediimenatab[i] = lfizgleditabela [i].getname(); // določimo besedilno vrednost izgleda JPanel ploscavrh = new JPanel(); // ustvarimo ploščo za zgornji del vmesnika 36. ploscavrh.setlayout(new GridLayout(3, 1, 5, 5)); // plošči določimo mrežno razporejanje; 3 vrstice, 1 stolpec, razmik //ustvarimo besedilno oznako in določimo privzeto vrednost besedilne oznake za izbran izgled 38. lblizgled = new JLabel("Izbran izgled: " + izglediimenatab[0], SwingConstants.CENTER); 39. ploscavrh.add(lblizgled); // oznako vstavimo v ploščo btnuporabiizgled = new JButton("Gumb..."); // ustvarimo gumb 42. ploscavrh.add(btnuporabiizgled); // gumb vstavimo v ploščo cbizgled = new JComboBox<String>(izglediImenaTab); // ustvarimo kombinirano polje, imena izgledov 45. ploscavrh.add(cbizgled); // kombinirano polje vstavimo v ploščo this.getcontentpane().setlayout(new GridLayout(2, 1)); // // oknu določimo mrežno razporejanje 2 vrstici; 1 stolpec 49. this.getcontentpane().add(ploscavrh); // v okno vstavimo ploščo // ustvarmo tabelo radijskih gumbov 52. rbizgleditabela = new JRadioButton[ lfizgleditabela.length ]; JPanel ploscadno= new JPanel(); // ustvarimo ploščo za spodnji del vmesnika // ustvarimo mrežni razporejevalnik z dvema gumboma v vsaki vrstici 57. int stevilovrstic = (int) Math.ceil( lfizgleditabela.length / 2.0 ); 58. ploscadno.setlayout( new GridLayout(steviloVrstic, 2,5,5)); // plošči določimo mrežno razporejanje; stevilovrstic vrstic, 2 stolpca, razmik ButtonGroup bgizborizgleda = new ButtonGroup(); // ustvarimo skupino radijskih gumbov, gumbi izbora izgleda PoslusalecDogodkov poslusalecdogodkov = new PoslusalecDogodkov(); // ustvarimo poslušalca dogodkov radijske skupine // ustvarimo radijske gumbe izgleda Stran 297 ŠC VELENJE

298 65. for (int i=0; i<lfizgleditabela.length; i++) { 66. rbizgleditabela[i] = new JRadioButton(izglediImenaTab[i]); // ustvarimo radijski gumb in ga shranimo v tabelo 67. rbizgleditabela[i].additemlistener(poslusalecdogodkov); // gumbu dodamo odzivni dogodek 68. bgizborizgleda.add(rbizgleditabela[i]); // radijski gumb dodamo v skupino 69. ploscadno.add(rbizgleditabela[i] ); // radijski gumb vstavimo v ploščo 70. } // for this.getcontentpane().add(ploscadno); // v okno vstavimo ploščo rbizgleditabela[0].setselected(true); // privzetoizbran prvi radijski gumb 75. } // konstruktor private void spremeniizgled (int i) { 78. try { 79. UIManager.setLookAndFeel(lfIzglediTabela[i].getClassName() ); // določimo izbran izgled 80. SwingUtilities.updateComponentTreeUI(this); // izgled uveljavimo na vseh komponentah vmesnika 81. } catch (Exception izjema) { 82. izjema.printstacktrace(); // izpišemo klicni sklad 83. } // catch 84. } // spremeniizgled private class PoslusalecDogodkov implements ItemListener { public void itemstatechanged(itemevent dogodek) { 89. // zanka za vse elemente radijske skupine 90. for (int i = 0; i < rbizgleditabela.length; i++) { 91. if (rbizgleditabela[i].isselected()) { // če je izbran i-t radijski gumb 92. lblizgled.settext(izglediimenatab[i] ); // oznaki določimo besedilo izbranega izgleda 93. cbizgled.setselectedindex(i); // kombiniranemo polju določimo izbor 94. spremeniizgled(i); // izvršimo metodo za spremembo izgleda 95. } 96. } // for 97. } // itemstatechanged } // PoslusalecDogodkov } // LookAndFeel1 1. /* LookAndFeel1Test.java 2. * Testni razred za demonstracijo izgleda 3. * */ 4. import javax.swing.jframe; public class LookAndFeel1Test { public static void main(string[] args) { 9. // ustvarimo objekt razreda MeniOkno1 (okno z menijem) 10. LookAndFeel1 okno = new LookAndFeel1(); 11. okno.setdefaultcloseoperation(jframe.exit_on_close); // zapiranje okna zapre program 12. okno.setbounds(100, 100, 300, 200); // območje velikosti okna 13. okno.setvisible(true); // prikažemo okno 14. } // main 15. INFORMATIKA, Programiranje 1 in 2 Stran 298

299 16. } // LookAndFeel1Test Primer izvajanja: Kontrolnik z zavihki (JTabbedPane) Kontrolnik z zavihki omogoča prikaz grafičnega vmesnika na več plasteh vmesnika. Posamezno plast izberemo z izbiro zavihka. Razred JTabbedPane predstavlja razširitev razreda JComponent.... Stran 299 ŠC VELENJE

300 20.2 Zbirke podatkov (JDBC) JDBC Java komunicira z zbirkami podatkov z uporabo Java Database Connectivity (JDBC ) API vmesnika. JDBC gonilnik omogoča vzpostavitev povezave s podatkovnim strežnikom in delo s podatki v zbirki podatkov. Vsi aktualni sistemi za upravljanje podatkovnih zbirk omogočajo dostop z uporabo JDBC gonilnika. Vir: ( ) JDBC je standardni vmesnik (API) za podatkovno neodvisno povezovanje med Java programi in podatkovnimi zbirkami. JDBC API omogoča migracijo med različnimi platformami (OS). JDBC vsebuje dve glavni komponenti: JDBC Driver Manager - aplikacijo poveže z generičnim razredom, ki je zadolžen za vzpostavitev (namestitev) zahtevanega JDBC gonilnika, JDBC Driver - gonilnik za vzpostavitev povezave s podatkovnim strežnikom. Tipi JDBC gonilnikov: Type 4 - Direct-to-Database Pure Java Driver using database network protocol for driver communication with database from Java. Type 3 - Pure Java Driver for Database Middleware using a middleware vendor''s protocol-layer for connectivity to the Database. Type 2 - A native API partly Java technology-enabled driver converting JDBC calls into the Database vendor''s CLI calls for communication with the database. Type 1 - JDBC-ODBC Bridge using an existing ODBC Driver for connecting to remote databases. JDBC API uporabljamo v aktivnostih: INFORMATIKA, Programiranje 1 in 2 Stran 300

301 vzpostavitve povezave z zbirko podatkov, posredovanje SQL stavkov zbirki podatkov, pridobivanje in obdelava rezultatov poizvedb iz zbirke podatkov. JDBC podpira dvo in trinivojsko arhitekturo za povezovanje z zbirko podatkov. Vir: Vir: Namestitev JDBC gonilnika za postgres Z naslova prenesemo jdbc gonilnik. Gonilnik (postgresql jdbc42.jar) kopiramo v mapo jre\lib\ext JRE (C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext). V okolju Eclipse uredimo JRE (Window Preferences Java Installed JREs Edit... ) dodamo JRE gonilnik (Add External JARs). Stran 301 ŠC VELENJE

302 Vzpostavitev povezave z zbirko podatkov Vmesnik (API) JDBC predstavljajo razredi paketa java.sql. 1. korak: Registracija JDBC gonilnika razreda Razreda gonilnika registriramo z metodo forname() razreda Class. Metoda dinamično naloži razred gonilnika. Metoda forname: public static void forname(string imerazreda) throws ClassNotFoundException Primer registracije postgresql razreda: Class.forName("org.postgresql.Driver"); 2. korak: Vzpostavitev povezave z zbirko podatkov Povezavo z zbirko podatkov vzpostavimo z metodo getconnection() razreda DriverManager. Metoda getconnection: public static Connection getconnection(string url) throws SQLException public static Connection getconnection(string url,string uporabnik,string geslo) throws SQLException Primer: String DATABASE_URL = "jdbc:postgresql://localhost:5432/poste"; Connection povezava = DriverManager.getConnection(DATABASE_URL, "postgres", "postgres"); INFORMATIKA, Programiranje 1 in 2 Stran 302

303 RDBMS PostgreSQL MySQL ORACLE DB2 Java DB/Apache Derby Microsoft SQL Server Sybase URL oblika jdbc:postgresql://hostname:portnumber/databasename jdbc:mysql://hostname:portnumber/databasename jdbc:db2:hostname:portnumber/databasename jdbc:derby:databasename (embedded) jdbc:derby://hostname:portnumber/databasename (network) jdbc:sqlserver://hostname:portnumber;databasename=databasename jdbc:sybase:tds:hostname:portnumber/databasename 3. korak: Ustvarimo objekt razreda Statement, ki predstavlja SQL stavek, ki ga želimo izvršiti Objekt razreda Statement ustvarimo z metodo createstatement() vmesnika (interface) Connection. Primer: Statement poizvedba = povezava.createstatement(); // ustvarimo objekt SQL stavka 4. korak: Izvršimo SQL stavek in obdelamo rezultat SQL poizvedbo izvršimo z metodo executequery() vmesnika Statement. Metoda vrne objekt razreda ResultSet, ki ga uporabimo za pridobitev vrednosti rezultata poizvedbe. Metoda executequery: public ResultSet executequery(string sql) throws SQLException Primer: // v objekt razreda ResultSet shranimo rezultat izvršitve poizvedbe ResultSet zapisi = poizvedba.executequery("select id_postne_stevilke as ID, postna_stevilka as \"Poštna številka\", kraj FROM postne_stevilke" ); Obdelava rezultata poizvedbe: // pridobimo meta podatke (strukturo) rezultata poizvedbe ResultSetMetaData metapodatki = zapisi.getmetadata(); // ugotovimo število stolpcev rezultata poizvedbe int stevilostolpcev = metapodatki.getcolumncount(); System.out.println( "Vsebina tabele poštne številke:\n" ); // izpis naslovne vrstice tabele for ( int i = 1; i <= stevilostolpcev; i++ ) // izpis naslova stolpca System.out.printf( "%-8s\t\t",metaPodatki.getColumnName( i ) ); // dokler obstajajo vrstice rezultata poizvedbe while (zapisi.next()) { // vsi stolpci rezultata for ( int i = 1; i <= stevilostolpcev; i++ ) // izpis vrednosti polja System.out.printf( "%-8s\t\t", zapisi.getobject( i )); 5. korak: Zapremo povezavo z zbirko podatkov Povezavo zapremo z metodo close() vmesnika Connection. Metoda close: Stran 303 ŠC VELENJE

304 Primer: public void close() throws SQLException poizvedba.close(); // zapremo poizvedbo povezava.close(); // zapremo povezavo 1. /* PostneStevilkeIzpis.java 2. * Izpis podatkov tabele poštne številke iz zbirke poste na lokalnem postgres podatkovnem strežniku. */ import java.sql.connection; 5. import java.sql.drivermanager; 6. import java.sql.resultset; 7. import java.sql.resultsetmetadata; 8. import java.sql.sqlexception; 9. import java.sql.statement; 10. public class PostneStevilkeIzpis { 11. // naslov zbirke 12. static final String DATABASE_URL = "jdbc:postgresql://localhost:5432/poste"; public static void main(string[] args) { 15. Connection povezava = null; // objekt za upravljanje povezave 16. Statement poizvedba = null; // objekt poizvedbe 17. ResultSet zapisi = null; // objekt rezultata poizvedbe 18. try { 19. // registracija razreda gonilnika za postgres 20. Class.forName("org.postgresql.Driver"); 21. // vzpostavimo povezave s podatkovno zbirko, klic statične metode DriverManager.getConnection 22. povezava = DriverManager.getConnection(DATABASE_URL, "postgres", "postgres"); 23. // ustvarimo objekt razreda Statement, SQL stavek 24. poizvedba = povezava.createstatement(); 25. // v objekt razreda ResultSet shranimo rezultat izvršitve poizvedbe 26. zapisi = poizvedba.executequery("select id_postne_stevilke as ID, postna_stevilka as \"poštna št.\", kraj FROM postne_stevilke " ); 27. // pridobimo meta podatke (strukturo) rezultata poizvedbe 28. ResultSetMetaData metapodatki = zapisi.getmetadata(); 29. // določimo število stolpcev rezultata poizvedbe 30. int stevilostolpcev = metapodatki.getcolumncount(); 31. System.out.println( "Vsebina tabele poštne številke:\n" ); 32. // izpis naslovne vrstice tabele 33. for ( int i = 1; i <= stevilostolpcev; i++ ) 34. // izpis naslova stolpca 35. System.out.printf( "%-8s\t\t",metaPodatki.getColumnName( i ) ); 36. // prehod v novo vrstico 37. System.out.println(); 38. // izpis podatkov rezultata poizvedbe; dokler obstajajo vrstice rezultata poizvedbe 39. while (zapisi.next() ) { 40. // vsi stolpci rezultata 41. for ( int i = 1; i <= stevilostolpcev; i++ ) 42. // izpis vrednosti polja 43. System.out.printf("%-8s\t\t", zapisi.getobject( i )); 44. // prehod v novo vrstico 45. System.out.println(); 46. } // while 47. } // try 48. catch (SQLException sqlexception) { INFORMATIKA, Programiranje 1 in 2 Stran 304

305 49. sqlexception.printstacktrace(); 50. } // SQLException 51. catch (ClassNotFoundException e) { 52. e.printstacktrace(); 53. } // ClassNotFoundException finally // zapremo povezave 56. { 57. try 58. { 59. poizvedba.close(); // zapremo stavek poizvedbe 60. povezava.close(); // zapremo povezavo 61. } // end try 62. catch ( Exception exception ) 63. { 64. exception.printstacktrace(); 65. } // catch 66. } // finally } // main } // razred PostneStevilkeIzpis Primer izvajanja: Vsebina tabele poštne številke: id poštna št. kraj Adlešiči Ajdovščina Ankaran/Ancarano Apače Artiče Begunje na Gorenjskem Begunje pri Cerknici Beltinci Benedikt Bistrica ob Dravi Bistrica ob Sotli Bizeljsko Blagovica Blanca Bled... Stran 305 ŠC VELENJE

306 Paket java.sql (JDBC) Razred DriverManager Konstruktor Opis Metode static void registerdriver(driver gonilnik) static void deregisterdriver(driver gonilnik) static Connection getconnection(string url) static Connection getconnection(string url,string uporabnik, String geslo) Registriramo JDBC gonilnik. Odstranimo registracijo JDBC gonilnika. Vzpostavimo povezavo z zbirko podatkov z določenim URL naslovom. Vzpostavimo povezavo z zbirko podatkov z uporabniškim imenom in geslom z določenim URL naslovom. Vmesnik (interface) Connection Objekt povezave predstavlja sejo med java programom in podatkovno zbirko. Razredi Statement, PreparedStatement, DatabaseMetaData implementirajo vmesnik Connection. Vmesnik Connection vsebuje metode za delo s transakcijami kot sta potrditev transakcije - commit() in razveljavitev transakcije - rollback(). Konstruktor Metode public Statement createstatement() public Statement createstatement(int resultsettype,int resultsetconcurrency) public void setautocommit(boolean status) public void commit() public void rollback() public void close() Opis Ustvarimo objekt razreda Statment, ki predstavlja SQL stavek. Ustvarimo objekt Statement z določeno vrsto zapisov rezultata in določeno obravnavo sočasnih aktivnosti. Določimo oz. prekličemo samodejno potrjevanje transakcij. Potrdimo aktivnosti transakcije. Razveljavimo aktivnosti transakcije. Zapremo povezavo in sprostimo JDBC vire v pomnilniku. Vmesnik (interface) Statement Vmesnik Statement določa metode za izvajanje poizvedb. Razred ResultSet implementira vmesnik. Metode public ResultSet executequery (String sql) Izvršimo poizvedbo. Metoda vrne objekt razreda ResultSet. public int executeupdate(string sql) Izvršimo SQL stavek (create, drop, insert, update, delete...). Vrne število vrstic na katere se je nanašal stavek, npr. število izbrisanih vrstic v primeru delete stavka. public boolean execute(string sql) Izvršimo SQL stavek, ki vrne večkratne rezultate. public int[] executebatch() Izvršimo zaporedje ukazov. Vmesnik (interface) ResultSet INFORMATIKA, Programiranje 1 in 2 Stran 306

307 Objekt ResultSet vzdržuje položaj (kurzor) na določeni vrstici podatkov. Začetna privzeta vrednost položaja je začetek podatkov. Privzeto lahko objekt ResultSet premikamo samo naprej brez možnosti spreminjanja podatkov. Privzete vrednosti lahko spremenimo z določitvijo vrednosti TYPE_SCROLL_INSENSITIVE ali TYPE_SCROLL_SENSITIVE. Metode public boolean next() public boolean previous() public boolean first() public boolean last() public boolean absolute(int row) public boolean relative(int row) public int getint(int columnindex) public int getint(string columnname) public String getstring(int columnindex) public String getstring(string columnname) Naslednjo vrstico določimo za nov trenutni položaj. Prejšnjo vrstico določimo za nov trenutni položaj. Prvo vrstico določimo za nov trenutni položaj. Zadnjo vrstico določimo za nov trenutni položaj. Določimo trenutni položaj na določeno vrstico. Določimo trenutni položaj glede na relativni odmik od trenutnega položaja. Pridobimo celoštevilčno vrednost s parametrom določenega stolpca v trenutni vrstici. Pridobimo celoštevilčno vrednost s parametrom določenega imena stolpca v trenutni vrstici. Pridobimo besedilno vrednost s parametrom določenega stolpca v trenutni vrstici. Pridobimo besedilno vrednost s parametrom določenega imena stolpca v trenutni vrstici. Vmesnik (interface) PreparedStatement Vmesnik PreparedStatement je razširitev vmesnika Statement. Uporabljamo ga za izvršitev parametrizirane poizvedbe. Izvod razreda PreparedStatement dobimo z metodo preparestatement() vmesnika Connection. public PreparedStatement preparestatement(string query) throws SQLException { } Metode public void setint(int paramindex, int value) Parametru na določenem indeksu določimo celoštevilčno vrednost. public void setstring(int paramindex, String value) Parametru na določenem indeksu določimo besedilno vrednost. public void setfloat(int paramindex, float value) Parametru na določenem indeksu določimo številčno vrednost tipa float. Parametru na določenem indeksu določimo številčno vrednost tipa double. public void setdouble(int paramindex, double value) public int executeupdate() Izvršimo SQL stavek (create, drop, insert, update, delete...). Vrne število vrstic na katere se je nanašal stavek, npr. število izbrisanih vrstic v primeru delete stavka. Metodo executeupdate uporabimo za izvršitev SQL stavkov, ki ne vračajo vrednosti. public ResultSet executequery() public void setbinarystream(int paramindeks, InputStream stream) throws SQLException public void setbinarystream(int paramindeks, InputStream stream, long dolzina) throws SQLException Izvršimo poizvedbo. Metoda vrne objekt razreda ResultSet. Parametru na določenem indeksu določimo vrednost zaporedja zlogov (npr. dokumenti: slike...). Parametru na določenem indeksu določimo vrednost zaporedja zlogov z določeno dolžino. Stran 307 ŠC VELENJE

308 Oglejmo si primer insert stavka s parametri. 1. // PreparedStatement 2. try { 3. // registriramo razred gonilnika 4. Class.forName("org.postgresql.Driver"); 5. // povezava z zbirko 6. Connection povezava = DriverManager.getConnection(DATABASE_URL, "postgres", "postgres"); 7. // ustvarimo objekt insert stavka, mesto parametra določa znak? 8. PreparedStatement stavekinsert=povezava.preparestatement("insert into postne_stevilke (postna_stevilka, kraj) values(?,?)"); stavekinsert.setstring(1, "3320"); // določimo vrednost prvega parametra 11. stavekinsert.setstring(2, "Velenje"); // določimo vrednost drugega parametra 12. // izvršimo insert stavek 13. int i = stavekinsert.executeupdate(); 14. // zapremo povezavo 15. povezava.close(); } catch(exception e) { 18. System.out.println(e); // izpišemo izjemo 19. } // catch Vmesnik (interface) ResultSetMetaData Vmesnik ResultSetMetaData zagotavlja informacije strukture tabele (npr. imena stolpcev, število stolpcev...). Metoda getmetadata() vmesnika ResultSet vrne objekt ResultSetMetaData. public ResultSetMetaData getmetadata() throws SQLException Metode public int getcolumncount() throws SQLException Vrne število stolpcev. public String getcolumnname (int indeks) throws Vrne naziv stolpca za določen indeks stolpca. SQLException public String getcolumntypename (int indeks) Vrne podatkovni tip stolpca za določen indeks stolpca. throws SQLException public String gettablename (int indeks) throws Vrne ime tabele za določen indeks stolpca. SQLException 1. // ResultSetMetaData 2. try { 3. // registriramo razred gonilnika 4. Class.forName("org.postgresql.Driver"); 5. // povezava z zbirko 6. Connection povezava = DriverManager.getConnection(DATABASE_URL, "postgres", "postgres"); 7. // ustvarimo objekt razreda Statement, SQL stavek 8. Statement poizvedba = povezava.createstatement(); 9. // v objekt razreda ResultSet shranimo rezultat izvršitve poizvedbe 10. ResultSet zapisi = poizvedba.executequery("select id_postne_stevilke as ID, postna_stevilka as \"poštna št.\", kraj FROM postne_stevilke " ); 11. // pridobimo meta podatke (strukturo) rezultata poizvedbe 12. ResultSetMetaData metapodatki = zapisi.getmetadata(); INFORMATIKA, Programiranje 1 in 2 Stran 308

309 13. // določimo število stolpcev rezultata poizvedbe 14. int stevilostolpcev = metapodatki.getcolumncount(); 15. System.out.println( "Vsebina tabele poštne številke:\n" ); 16. // izpis naslovne vrstice tabele 17. for ( int i = 1; i <= stevilostolpcev; i++ ) 18. // izpis naslova stolpca 19. System.out.printf( "%-8s\t\t",metaPodatki.getColumnName( i ) ); 20. // zapremo povezavo 21. povezava.close(); } catch(exception e) { 24. System.out.println(e); // izpišemo izjemo 25. } Vmesnik (interface) DatabaseMetaData Vmesnik DatabaseMetaData zagotavlja metode za meta podate zbirke podatkov (npr. verzija podatkovnega strežnika, ime gonilnika, število tabel, število pogledov...). Metode public String getdrivername() throws SQLException public String getdriverversion() throws SQLException public String getusername() throws SQLException public String getdatabaseproductname() throws SQLException public String getdatabaseproductversion() throws SQLException public ResultSet gettables(string katalog, String VzorecSheme, String imevzorcatabele, String[] tiptabele) throws SQLException Vrne ime gonilnika. Vrne verzijo JDBC gonilnika. Vrne uporabniško ime uporabnika. Vrne ime podatkovnega strežnika. Vrne verzijo podatkovnega strežnika. Vrne opis tabel iz kataloga. Možne vrednosti tipa tabele so TABLE, VIEW, ALIAS, SYSTEM TABLE, SYNONYM. Primer: 1. // DatabaseMetaData 2. try { 3. // registriramo razred gonilnika 4. Class.forName("org.postgresql.Driver"); 5. // povezava z zbirko 6. Connection povezava = DriverManager.getConnection(DATABASE_URL, "postgres", "postgres"); 7. DatabaseMetaData dbmetapodatki=povezava.getmetadata(); 8. System.out.println("Gonilnik: "+dbmetapodatki.getdrivername()); 9. System.out.println("Verzija gonilnika: "+dbmetapodatki.getdriverversion()); 10. System.out.println("Uporabniško ime: "+dbmetapodatki.getusername()); 11. System.out.println("Naziv podatkovnega strežnika: "+dbmetapodatki.getdatabaseproductname()); 12. System.out.println("Verzija podatkovnega strežnika: "+dbmetapodatki.getdatabaseproductversion()); 13. // določimo tip tabele 14. String table[]={"table"}; 15. // ugotovimo metapodatke tabel 16. ResultSet zapis=dbmetapodatki.gettables(null,null,null,table); 17. System.out.println("\nSeznam tabel:"); Stran 309 ŠC VELENJE

310 18. // za vse vrstice 19. while(zapis.next()){ 20. System.out.printf("\t%s \t\t\t%s \t\t\t%s \n", zapis.getstring(2),zapis.getstring(3),zapis.getstring(4)); // izpišemo ime tabele (ime je na indeksu 3) 21. } 22. povezava.close(); // zapremo povezavo 23. } catch(exception e) { 24. System.out.println(e); // izpišemo izjemo 25. } 26. } Primer izvajanja: Gonilnik: PostgreSQL Native Driver Verzija gonilnika: PostgreSQL 9.3 JDBC3g (build 1103) Uporabniško ime: postgres Naziv podatkovnega strežnika: PostgreSQL Verzija podatkovnega strežnika: Seznam tabel: public drzave TABLE public postne_stevilke TABLE JTable 1. /* ResultSetTableModel1.java 2. * Razširitev razreda AbstractTableModel uporabimo za model tabele rezultata poizvedbe. 3. * */ 4. import java.sql.connection; 5. import java.sql.drivermanager; 6. import java.sql.resultset; 7. import java.sql.resultsetmetadata; 8. import java.sql.sqlexception; 9. import java.sql.statement; import javax.swing.table.abstracttablemodel; public class ResultSetTableModel1 extends AbstractTableModel { 14. private Connection dbpovezava; // povezava z zbirko 15. private Statement staveksql; // stavek poizvedbe 16. private ResultSet rszapisi; // vrstice rezultata poizvedbe 17. private ResultSetMetaData rsmdstruktura; // meta struktura rezultata poizvedbe 18. private int stevilovrstic; // število vrstic 19. private boolean dbpovezavastatus = false; // status povezave z zbirko podatkov public ResultSetTableModel1(String dburl, String dbuporabnik, String dbgeslo, String staveksqlselect) { 22. super(); // nadrejeni konstruktor 23. try { 24. dbpovezava = DriverManager.getConnection(dbURL, dbuporabnik, dbgeslo); // povezava z zbirko 25. // ustvarimo objekt stavka poizvedbe (objekt razreda Statement) 26. staveksql = dbpovezava.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_READ_ONLY ); 27. dbpovezavastatus = true; // določimo status povezave 28. izvediselectstavek(staveksqlselect); // kličemo metodo za izvršitev select staveka INFORMATIKA, Programiranje 1 in 2 Stran 310

311 29. } catch (SQLException e) { 30. e.printstacktrace(); 31. } // catch 32. } // konstruktor ResultSetTableModel // metoda za izvršitev poizvedbe, SQL select stavka 35. public void izvediselectstavek( String sqlselectstavek ) throws SQLException, IllegalStateException { 36. if (! dbpovezavastatus ) // če ni povezave prožimo izjemo 37. throw new IllegalStateException( "Povezava z zbirko podatkov ni vzpostavljena." ); 38. // izvršimo poizvedbo 39. rszapisi = staveksql.executequery( sqlselectstavek ); 40. // ustvarimo objekt strukture rezultata poizvedbe 41. rsmdstruktura = rszapisi.getmetadata(); 42. // določimo število vrstic 43. rszapisi.last(); // postavimo se na zadnji zapis 44. stevilovrstic = rszapisi.getrow(); // določimo število vrstic 45. firetablestructurechanged(); // obvestimo vse poslušalce dogodkov, sprememba strukture 46. } // izvediselectstavek // vrne tip razreda stolpca 49. public Class getcolumnclass( int stolpec ) throws IllegalStateException{ 50. if (! dbpovezavastatus ) // če ni povezave prožimo izjemo 51. throw new IllegalStateException("Povezava z zbirko podatkov ni vzpostavljena." ); 52. try { 53. String tiprazredastolpca = rsmdstruktura.getcolumnclassname( stolpec + 1 ); // poiščemo tip razreda stolpca 54. return Class.forName( tiprazredastolpca ); // vrnemo tip razreda stolpca 55. } // end try 56. catch ( Exception exception ) 57. { exception.printstacktrace(); 58. } // catch 59. return Object.class; // v primeru pojavitve problema predvidimo tip Object 60. } // getcolumnclass // vrne število stolpcev 63. public int getcolumncount() throws IllegalStateException { 64. if (! dbpovezavastatus ) // če ni povezave prožimo izjemo 65. throw new IllegalStateException("Povezava z zbirko podatkov ni vzpostavljena." ); 66. try { 67. return rsmdstruktura.getcolumncount(); // vrnemo število stolpcev 68. } // end try 69. catch ( SQLException sqlexception ) 70. { sqlexception.printstacktrace(); 71. } // end catch 72. return 0; // v primeru pojavitve problema vrnemo 0 stolpcev 73. } // getcolumncount // vrne ime stolpca 76. public String getcolumnname(int stolpec) throws IllegalStateException { 77. if (! dbpovezavastatus ) // če ni povezave prožimo izjemo 78. throw new IllegalStateException("Povezava z zbirko podatkov ni vzpostavljena." ); 79. try { 80. return rsmdstruktura.getcolumnname( stolpec + 1 ); // vrnemo ime stolpca Stran 311 ŠC VELENJE

312 81. } // end try 82. catch ( SQLException sqlexception ) 83. { sqlexception.printstacktrace(); 84. } // end catch 85. return ""; // v primeru pojavitve problema vrnemo "" 86. } // getcolumncount // vrne število vrstic 89. public int getrowcount() throws IllegalStateException{ 90. if (! dbpovezavastatus ) // če ni povezave prožimo izjemo 91. throw new IllegalStateException("Povezava z zbirko podatkov ni vzpostavljena." ); 92. return stevilovrstic; 93. } // getrowcount // vrne vrednost iz tabele 96. public Object getvalueat(int vrstica, int stolpec) throws IllegalStateException { 97. if (! dbpovezavastatus ) // če ni povezave prožimo izjemo 98. throw new IllegalStateException("Povezava z zbirko podatkov ni vzpostavljena." ); 99. try { 100. rszapisi.absolute( vrstica + 1 ); // položaj kurzorja premaknemo na podano vrstico 101. return rszapisi.getobject( stolpec + 1 ); // vrnemo objekt določenega stolpca na položaju kurzorja 102. } // end try 103. catch ( SQLException sqlexception ) 104. { sqlexception.printstacktrace(); 105. } // end catch 106. return ""; // v primeru pojavitve problema vrnemo "" 107. } // getvalueat // prekinemo povezavo z zbirko podatkov 110. public void prekinipovezavo() { 111. // če je povezava aktivna 112. if ( dbpovezavastatus ) { 113. try { // 114. rszapisi.close(); // zapremo resultset 115. staveksql.close(); // zapremo statment 116. dbpovezava.close(); // zapremo povezavo 117. } // end try 118. catch ( SQLException sqlexception ) { 119. sqlexception.printstacktrace(); 120. } // end catch 121. finally // osvežimo stanje povezave 122. { dbpovezavastatus = false; } 123. } // if 124. } // prekinipovezavo } // konec razreda ResultSetTableModel1 1. /* PrikazRezultataPoizvedbe.java 2. * GUI vmesnik za prikaz rezultata SQL select stavka. 3. * */ 4. import java.awt.borderlayout; 5. import java.awt.event.actionevent; 6. import java.awt.event.actionlistener; 7. import java.awt.event.windowadapter; INFORMATIKA, Programiranje 1 in 2 Stran 312

313 8. import java.awt.event.windowevent; 9. import java.sql.sqlexception; 10. import java.util.regex.patternsyntaxexception; import javax.swing.box; 13. import javax.swing.jbutton; 14. import javax.swing.jframe; 15. import javax.swing.jlabel; 16. import javax.swing.joptionpane; 17. import javax.swing.jscrollpane; 18. import javax.swing.jtable; 19. import javax.swing.jtextarea; 20. import javax.swing.jtextfield; 21. import javax.swing.rowfilter; 22. import javax.swing.scrollpaneconstants; 23. import javax.swing.table.tablemodel; 24. import javax.swing.table.tablerowsorter; public class PrikazRezultataPoizvedbe extends JFrame { 27. static final String DB_URL = "jdbc:postgresql://localhost:5432/poste"; // URL podatkovne baze 28. static final String UPORABNIK = "postgres"; // uporabniško ime 29. static final String GESLO = "postgres"; // geslo 30. static final String PRIVZETA_POIZVEDBA = "SELECT drzava_slo as Drzava,oznaka_dvomestna AS Oznaka, oznaka_tromestna as Oznaka_koda, opomba AS Opomba FROM drzave;"; // privzeta poizvedba private ResultSetTableModel1 tablemodel; // model tabele 33. private JTextArea txtapoizvedba; // besedilno področje poizvedbe 34. private TableRowSorter< TableModel > sorter =null; // objekt naslovne vrstice tabele za izbiro razvrščanja // konstruktor 37. public PrikazRezultataPoizvedbe() { 38. super( "Rezultat poizvedbe" ); // poslušalec dogodkov okna 41. addwindowlistener(new WindowAdapter() { // odzivna metoda za zapiranje okna 43. public void windowclosed(windowevent arg0) { 44. tablemodel.prekinipovezavo(); // prekinemo povezavo 45. System.exit(0); // izhod iz aplikacije 46. } // windowclosed 47. }); // poslušalec dogodkov okna try { 50. // ustvarimo objekt razreda JTextArea za vnos poizvedbe 51. txtapoizvedba = new JTextArea( PRIVZETA_POIZVEDBA, 3, 100 ); // področje poizvedbe, 3 vrstice, 100 stolpcev 52. txtapoizvedba.setwrapstyleword( true ); // določimo wordow slog prenosa besedila v naslednjo vrstico 53. txtapoizvedba.setlinewrap( true ); // določimo prenos besedila v naslednjo vrstico 54. // ustvarimo ploščo z navpičnim drsnikom, besedilno področje poizvedbe 55. JScrollPane ploscadrsnik = new JScrollPane( txtapoizvedba, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); 56. // ustvarimo gumb izvršitve poizvedbe 57. JButton btnizvedipoizvedbo = new JButton( "Izvedi poizvedbo" ); Stran 313 ŠC VELENJE

314 // poslušalec dogodkov gumba btnizvedipoizvedbo 60. btnizvedipoizvedbo.addactionlistener(new ActionListener() { 61. public void actionperformed(actionevent arg0) { // odzivna metoda, klik gumba 62. try { // izvršimo poizvedbo 63. tablemodel.izvediselectstavek( txtapoizvedba.gettext() ); 64. } // try 65. catch ( SQLException sqlexception ) { 66. JOptionPane.showMessageDialog( null, sqlexception.getmessage(), "Napaka", JOptionPane.ERROR_MESSAGE ); 67. try { 68. tablemodel.izvediselectstavek( PRIVZETA_POIZVEDBA ); 69. txtapoizvedba.settext( PRIVZETA_POIZVEDBA ); // besedilnemu polju poizvedbe določimo privzeto poizvedbo } // try 72. catch ( SQLException sqlizjema ) { 73. JOptionPane.showMessageDialog( null, sqlizjema.getmessage(), "Napaka", JOptionPane.ERROR_MESSAGE ); 74. tablemodel.prekinipovezavo(); // prekinemo povezave 75. System.exit( 1 ); // končamo izvajanje 76. } // catch 77. } // catch 78. } // actionperformed 79. }); // addactionlistener // ustvarimo model tabele za rezultat poizvedbe 83. tablemodel = new ResultSetTableModel1( DB_URL, UPORABNIK, GESLO, PRIVZETA_POIZVEDBA ); 84. // postavitev oz. razporejanje bomponent 85. Box boxvrh = Box.createHorizontalBox(); 86. boxvrh.add( ploscadrsnik ); 87. boxvrh.add( btnizvedipoizvedbo ); JLabel lblfilter = new JLabel( "Filter:" ); 90. final JTextField txtfilter = new JTextField(); 91. JButton btnfilter = new JButton( "Uveljavi filter" ); // klik gumba btnfilter 94. btnfilter.addactionlistener(new ActionListener() { 95. public void actionperformed(actionevent e) { 96. String text = txtfilter.gettext(); // besedilo filtra shranimo v objekt besedila 97. if ( text.length() == 0 ) // preverimo ali je vneseno besedilo filtra 98. sorter.setrowfilter( null ); 99. else { 100. try { 101. sorter.setrowfilter(rowfilter.regexfilter( text ) ); 102. } // try 103. catch ( PatternSyntaxException izjemafilter ) 104. { 105. JOptionPane.showMessageDialog( null, "Neveljaven filter", "Napaka, pogoj oz. filter", JOptionPane.ERROR_MESSAGE ); 106. } // catch 107. } // if 108. } // actionperformed INFORMATIKA, Programiranje 1 in 2 Stran 314

315 109. }); // poslušalec dogodkov gumba btnfilter Box boxdno = Box.createHorizontalBox(); // vodoravno prilagajanje 112. // vstavimo komponente 113. boxdno.add( lblfilter ); 114. boxdno.add( txtfilter ); 115. boxdno.add( btnfilter ); 116. // ustvarimo objekt JTable, vsebino določa model tabele 117. JTable tblrezultatpoizvedbe = new JTable( tablemodel ); 118. // vstavimo komponente 119. getcontentpane().add( boxvrh, BorderLayout.NORTH ); 120. getcontentpane().add( new JScrollPane( tblrezultatpoizvedbe ), BorderLayout.CENTER); 121. getcontentpane().add( boxdno, BorderLayout.SOUTH ); // ustvarimo objekt razvrščanja, model tabele 124. sorter = new TableRowSorter< TableModel >( tablemodel ); 125. tblrezultatpoizvedbe.setrowsorter( sorter ); // tabeli določimo objekt razvrščanja 126. setvisible( true ); // prikažemo okno 127. } // try 128. catch ( Exception e ) 129. { // prikažemo pogovorno okno z obvestilom 130. JOptionPane.showMessageDialog( null, e.getmessage(), "Napaka", JOptionPane.ERROR_MESSAGE ); 131. tablemodel.prekinipovezavo(); // prekinemo povezavo 132. System.exit( 1 ); // prekinemo izvajanje 133. } // catch 134. setbounds(100, 100, 746, 485); // določimo območje okna 135. setdefaultcloseoperation( DISPOSE_ON_CLOSE ); // sprostimo pomnilnik objekta okno 136. } // PrikazRezultataPoizvedbe public static void main( String args[] ) 139. { 140. new PrikazRezultataPoizvedbe(); 141. } // main } // razred PrikazRezultataPoizvedbe Primer izvajanja: Stran 315 ŠC VELENJE

316 Vmesnik Rowset Vmesnik Rowset zagotavlja metode, ki omogočajo določitev lastnosti za vzpostavitev povezave z zbirko podatkov in ustvarjanje objekta razreda Statement (SQL stavek). Obstajata dve vrsti objektov razreda Rowset. Povezani objekti razreda Rowset po vzpostavitvi povezave z zbirko podatkov ostanejo povezani dokler je objekt v uporabi. Nepovezani objekti vzpostavijo povezavo, izvršijo SQL stavek in prekinejo povezavo z zbirko podatkov. Program lahko spreminja podatke v nepovezanem objektu razreda Rowset. Spremembe podatkov se v zbirko zapišejo po ponovni vzpostavitvi povezave. Paket Package javax.sql.rowset vsebuje dve razširitvi vmesnika RowSet in sicer JdbcRowSet in CachedRowSet. JdbcRowSet (povezan RowSet) je ovojni razred objektov ResultSet in omogoča pomikanje med vrsticami zapisov in spreminjanje vrednosti zapisov. Objekt ResultSet privzeto ne podpira premikanja in omogoča le pregled (angl. read only). Z uporabo konstant TYPE_SCROLL_INSENSITIVE in CONCUR_UPDATABLE lahko objektu Rowset omogočimo premikanje in spreminjanje podatkov. Objekt JdbcRowSet ima privzeto omogočeno premikanje in spreminjanje podatkov. Objekt razreda CachedRowSet predstavlja nepovezan objekt Rowset. Podatke shrani v pomnilnik in prekine povezavo z zbirko podatkov. CachedRowSet ima omejitve glede količine podatkov, ki jo lahko shrani v pomnilnik. Oglejmo si primer uporabe objekta razreda JdbcRowSet za izpis rezultata poizvedbe. 1. /* JdbcRowSet1.java 2. * JDBC, izpis rezultata poizvedbe, uporaba JdbcRowSet 3. * */ 4. import java.sql.resultsetmetadata; 5. import java.sql.sqlexception; 6. import javax.sql.rowset.jdbcrowset; 7. import javax.sql.rowset.rowsetfactory; 8. import javax.sql.rowset.rowsetprovider; public class JdbcRowSet1 { 12. static final String DB_URL = "jdbc:postgresql://localhost:5432/poste"; // URL podatkovne baze 13. static final String UPORABNIK = "postgres"; // uporabniško ime 14. static final String GESLO = "postgres"; // geslo public JdbcRowSet1() { 17. try { 18. // ustvarimo objekt RowSetFactory 19. RowSetFactory rowsetfactory = RowSetProvider.newFactory(); 20. // ustvarimo objekt JdbcRowSet 21. JdbcRowSet rowset = rowsetfactory.createjdbcrowset(); 22. rowset.seturl( DB_URL ); // določimo zbirko 23. rowset.setusername( UPORABNIK ); // določimo uporabniško ime 24. rowset.setpassword( GESLO ); // določimo geslo 25. rowset.setcommand( "SELECT id_postne_stevilke as ID, postna_stevilka as \"poštna št.\", kraj FROM postne_stevilke;" ); // določimo SQL stavek 26. rowset.execute(); // izvršimo SQL stavek 27. // ustvarimo objekt meta podatkov rezultata poizvedbe 28. ResultSetMetaData metapodatki = rowset.getmetadata(); 29. // določimo število stolpcev rezultata poizvedbe INFORMATIKA, Programiranje 1 in 2 Stran 316

317 30. int stevilostolpcev = metapodatki.getcolumncount(); 31. System.out.println( "Vsebina tabele poštne številke:\n" ); 32. // izpis naslovne vrstice tabele 33. for ( int i = 1; i <= stevilostolpcev; i++ ) 34. // izpis naslova stolpca 35. System.out.printf( "%-8s\t\t",metaPodatki.getColumnName( i ) ); 36. // prehod v novo vrstico 37. System.out.println(); 38. // izpis podatkov rezultata poizvedbe; dokler obstajajo vrstice rezultata poizvedbe 39. while (rowset.next() ) { 40. // vsi stolpci rezultata 41. for ( int i = 1; i <= stevilostolpcev; i++ ) 42. // izpis vrednosti polja 43. System.out.printf("%-8s\t\t", rowset.getobject( i )); 44. // prehod v novo vrstico 45. System.out.println(); 46. } // while 47. rowset.close(); // zapremo 48. } // try 49. catch (SQLException sqlexception) { 50. sqlexception.printstacktrace(); 51. } // SQLException } // konstruktor JdbcRowSet public static void main(string[] args) { 57. JdbcRowSet1 rowsetposte = new JdbcRowSet1(); 58. } // main } // razred JdbcRowSet Krmarjenje po zapisih (tabela države) 1. /* Drzave.java 2. * Razred države. 3. * */ 4. public class Drzave { // atributi 7. private int iddrzave; 8. private String drzavaslo; 9. private String drzavaiso; 10. private String oznakadvomestna; 11. private String oznakatromestna; 12. private String opomba; // konstruktor s parametri 15. public Drzave(int iddrzave, String drzavaslo, String drzavaiso, String oznakadvomestna, String oznakatromestna, 16. String opomba) { 17. super(); 18. this.iddrzave = iddrzave; Stran 317 ŠC VELENJE

318 19. this.drzavaslo = drzavaslo; 20. this.drzavaiso = drzavaiso; 21. this.oznakadvomestna = oznakadvomestna; 22. this.oznakatromestna = oznakatromestna; 23. this.opomba = opomba; 24. } // konstruktor // konstruktor brez parametrov 27. public Drzave() { 28. } // konstruktor public int vrniiddrzave() { 32. return iddrzave; 33. } // vrniiddrzave public void dolociiddrzave(int iddrzave) { 36. this.iddrzave = iddrzave; 37. } // dolociiddrzave public String vrnidrzavaslo() { 40. return drzavaslo; 41. } // vrnidrzavaslo public void dolocidrzavaslo(string drzavaslo) { 44. this.drzavaslo = drzavaslo; 45. } // dolocidrzavaslo public String vrnidrzavaiso() { 48. return drzavaiso; 49. } // vrnidrzavaiso public void dolocidrzavaiso(string drzavaiso) { 52. this.drzavaiso = drzavaiso; 53. } // dolocidrzavaiso public String vrnioznakadvomestna() { 56. return oznakadvomestna; 57. } // vrnioznakadvomestna public void dolocioznakadvomestna(string oznakadvomestna) { 60. this.oznakadvomestna = oznakadvomestna; 61. } // dolocioznakadvomestna public String vrnioznakatromestna() { 64. return oznakatromestna; 65. } // vrnioznakatromestna public void dolocioznakatromestna(string oznakatromestna) { 68. this.oznakatromestna = oznakatromestna; 69. } // dolocioznakatromestna public String vrniopomba() { 72. return opomba; 73. } // vrniopomba INFORMATIKA, Programiranje 1 in 2 Stran 318

319 public void dolociopomba(string opomba) { 76. this.opomba = opomba; 77. } // dolociopomba } // razred Drzave 1. /* DrzaveSQLStavki.java 2. * Razred za vzpostavitev povezave z zbirko podatkov in izvajanje SQL stavkov za tabelo drzave 3. * */ 4. import java.sql.connection; 5. import java.sql.drivermanager; 6. import java.sql.preparedstatement; 7. import java.sql.resultset; 8. import java.sql.sqlexception; 9. import java.util.arraylist; 10. import java.util.list; public class DrzaveSQLStavki { 13. static final String DB_URL = "jdbc:postgresql://localhost:5432/poste"; // URL podatkovne baze 14. static final String UPORABNIK = "postgres"; // uporabniško ime 15. static final String GESLO = "postgres"; // geslo 16. private Connection povezavadb = null; // upravljanje povezave z zbirko podatkov 17. private PreparedStatement selectdrzavevse = null; // Select stavek, seznam vseh držav 18. private PreparedStatement selectdrzavenaziv = null; // Select stavek, seznam držav po polju drzavaslo 19. private PreparedStatement insertdrzave = null; // Insert stavek, tabela drzave public DrzaveSQLStavki () { try { // vzpostavitev povezave 24. povezavadb = DriverManager.getConnection(DB_URL, UPORABNIK, GESLO); 25. // ustvarimo objekt razreda PreparedStatement, select stavek 26. selectdrzavevse = povezavadb.preparestatement("select id_drzave, drzava_slo, drzava_iso, oznaka_dvomestna, oznaka_tromestna," " opomba FROM drzave order by drzava_slo"); 28. // ustvarimo objekt razreda PreparedStatement, select stavek 29. selectdrzavenaziv = povezavadb.preparestatement("select id_drzave, drzava_slo, drzava_iso, oznaka_dvomestna, oznaka_tromestna, " " opomba FROM drzave where drzava_slo like?"); 31. // ustvarimo objekt razreda PreparedStatement, insert stavek 32. insertdrzave = povezavadb.preparestatement("insert INTO drzave(drzava_slo,drzava_iso,oznaka_dvomestna,oznaka_tromestna) " " VALUES (?,?,?,?) "); 34. } // try 35. catch (SQLException e) { 36. // TODO Auto-generated catch block 37. e.printstacktrace(); 38. System.exit( 1 ); // izhod iz programa 39. } // catch 40. } // konstruktor // vrne seznam vseh drzav 43. public List <Drzave> vrnidrzavevse() { Stran 319 ŠC VELENJE

320 44. List <Drzave> lstdrzave = null; // seznam vseh držav 45. ResultSet rsdrzave = null; // zapisi rezultata poizvedbe; try { 48. rsdrzave = selectdrzavevse.executequery(); // izvršimo poizvedbo 49. lstdrzave = new ArrayList<Drzave>(); // ustvarimo povezan seznam drzav // obdelava vseh vrstic rezultata poizvedbe 52. while (rsdrzave.next()) { 53. // v seznam dodamo nov element, rezultat poizvedbe prenesemo v objekt razreda osebe 54. lstdrzave.add(new Drzave ( rsdrzave.getint("id_drzave"), rsdrzave.getstring("drzava_slo"), rsdrzave.getstring("drzava_iso"), 55. rsdrzave.getstring("oznaka_dvomestna"), rsdrzave.getstring("oznaka_tromestna"), rsdrzave.getstring("opomba") )); 56. } // while 57. } // try 58. catch (SQLException sqlexception) { 59. sqlexception.printstacktrace(); 60. } // catch 61. finally { 62. try { 63. rsdrzave.close(); // zapremo rezultat poizvedbe 64. } catch (SQLException sqlexception) { 65. sqlexception.printstacktrace(); 66. } 67. } // finally 68. return lstdrzave; } // vrnidrzavevse // vrne seznam drzav, kriterij naziv drzave 73. public List <Drzave> vrnidrzavenaziv(string nazivdrzave) { 74. List <Drzave> lstdrzave = null; // seznam vseh držav 75. ResultSet rsdrzave = null; // zapisi rezultata poizvedbe; try { 78. selectdrzavenaziv.setstring(1, nazivdrzave); // določimo vrednost parametra 79. rsdrzave = selectdrzavenaziv.executequery(); // izvršimo poizvedbo 80. lstdrzave = new ArrayList<Drzave>(); // ustvarimo povezan seznam držav // obdelava vseh vrstic rezultata poizvedbe 83. while (rsdrzave.next()) { 84. // v seznam dodamo nov element, rezultat poizvedbe prenesemo v objekt razreda osebe 85. lstdrzave.add(new Drzave ( rsdrzave.getint("id_drzave"), rsdrzave.getstring("drzava_slo"), rsdrzave.getstring("drzava_iso"), 86. rsdrzave.getstring("oznaka_dvomestna"), rsdrzave.getstring("oznaka_tromestna"), rsdrzave.getstring("opomba") )); 87. } // while 88. } // try 89. catch (SQLException sqlexception) { 90. sqlexception.printstacktrace(); 91. } // catch 92. finally { 93. try { 94. rsdrzave.close(); // zapremo rezultat poizvedbe INFORMATIKA, Programiranje 1 in 2 Stran 320

321 95. } catch (SQLException sqlexception) { 96. sqlexception.printstacktrace(); 97. } 98. } // finally 99. return lstdrzave; 100. } // vrnidrzavenaziv // vstavi novo državo 104. public int vstavidrzave(string drzava_slo,string drzava_iso,string oznaka_dvomestna,string oznaka_tromestna,string opomba) { 105. int rezultat = 0; // rezultat izvršitve insert stavka 106. try { 107. povezavadb.setautocommit(false); // določimo vrednosti parametrov 110. insertdrzave.setstring(1,drzava_slo); 111. insertdrzave.setstring(2,drzava_iso); 112. insertdrzave.setstring(3,oznaka_dvomestna); 113. insertdrzave.setstring(4,oznaka_tromestna); 114. // insertdrzave.setstring(5,opomba); 115. rezultat = insertdrzave.executeupdate(); // izvršimo insert stavek, rezultat je število vstavljenih zapisov 116. povezavadb.commit(); 117. } // try 118. catch (SQLException e) { 119. e.printstacktrace(); 120. try { 121. povezavadb.rollback(); 122. } catch (SQLException e1) { 123. e1.printstacktrace(); 124. } 125. } // catch 126. return rezultat; 127. } // dodajdrzave // zapre povezavo z zbirko podatkov 130. public void zapri() 131. { 132. try{ 133. povezavadb.close(); 134. } // try 135. catch ( SQLException sqlexception ) 136. { 137. sqlexception.printstacktrace(); 138. } // catch 139. } // zapri } // razred DrzaveSQLStavki 1. /* GUIDrzave.java 2. * Grafični vmesnik, države 3. * */ Stran 321 ŠC VELENJE

322 4. import java.awt.flowlayout; 5. import java.awt.gridlayout; 6. import java.awt.event.actionevent; 7. import java.awt.event.actionlistener; 8. import java.awt.event.windowadapter; 9. import java.awt.event.windowevent; 10. import java.util.list; 11. import javax.swing.borderfactory; 12. import javax.swing.box; 13. import javax.swing.boxlayout; 14. import javax.swing.jbutton; 15. import javax.swing.jframe; 16. import javax.swing.jlabel; 17. import javax.swing.joptionpane; 18. import javax.swing.jpanel; 19. import javax.swing.jtextfield; 20. import javax.swing.swingconstants; public class GUIDrzave extends JFrame { 23. private Drzave trenutnizapis; // trenutni zapis tabele države 24. private DrzaveSQLStavki drzavesqlstavki; // povezava s podatkovno zbirko poste in izvajanje SQL stavkov 25. private List < Drzave > lstdrzave; // povezan seznam vrednosti tabele države 26. private int stevilozapisov = 0; // števec števila zapisov 27. private int indekstrenutnizapis; // indeks trenutnega zapisa 28. // vmesnik (GUI) 29. private JButton btnprikazivse; 30. private JLabel lbloznakadvomestna; 31. private JTextField txtfoznakadvomestna; 32. private JLabel lbldrzavaslo; 33. private JTextField txtfdrzavaslo; 34. private JLabel lblid; 35. private JTextField txtfid; 36. private JTextField txtfindeks; 37. private JLabel lbldrzavaiso; 38. private JTextField txtfdrzavaiso; 39. private JTextField txtfmaks; 40. private JButton btnnaprej; 41. private JLabel lblod; 42. private JLabel lbloznakatromestna; 43. private JTextField txtfoznakatromestna; 44. private JButton btnnazaj; 45. private JButton btnpoizvedba; 46. private JLabel lblpoizvedba; 47. private JPanel poizvedbaplosca; 48. private JPanel navigacijaplosca; 49. private JPanel prikazplosca; 50. private JTextField txtfpoizvedba; 51. private JButton btnvstavi; // no-argument constructor 54. public GUIDrzave() 55. { 56. super( "Države" ); 57. // vzpostavimo povezavo in ustvarimo SQL stavke 58. drzavesqlstavki = new DrzaveSQLStavki(); INFORMATIKA, Programiranje 1 in 2 Stran 322

323 59. // ustvarimo vmesnik (GUI) 60. navigacijaplosca = new JPanel(); 61. btnnazaj = new JButton(); 62. btnnazaj.addactionlistener(new ActionListener() { 63. public void actionperformed(actionevent e) { 64. btnnazajklik(e); 65. } 66. }); 67. txtfindeks = new JTextField( 2 ); 68. txtfindeks.addactionlistener(new ActionListener() { 69. public void actionperformed(actionevent e) { 70. txtfindekssprememba(e); 71. } 72. }); 73. lblod = new JLabel(); 74. txtfmaks = new JTextField( 2 ); 75. btnnaprej = new JButton(); 76. btnnaprej.addactionlistener(new ActionListener() { 77. public void actionperformed(actionevent e) { 78. btnnaprejklik(e); 79. } 80. }); 81. prikazplosca = new JPanel(); 82. lblid = new JLabel(); 83. lblid.sethorizontalalignment(swingconstants.trailing); 84. txtfid = new JTextField( 10 ); 85. lbldrzavaslo = new JLabel(); 86. lbldrzavaslo.sethorizontalalignment(swingconstants.trailing); 87. txtfdrzavaslo = new JTextField( 50 ); lbldrzavaiso = new JLabel(); 90. lbldrzavaiso.sethorizontalalignment(swingconstants.trailing); 91. txtfdrzavaiso = new JTextField( 30 ); 92. lbloznakadvomestna = new JLabel(); 93. lbloznakadvomestna.sethorizontalalignment(swingconstants.trailing); 94. txtfoznakadvomestna = new JTextField( 2 ); 95. txtfoznakadvomestna.sethorizontalalignment(swingconstants.trailing); 96. lbloznakatromestna = new JLabel(); 97. lbloznakatromestna.sethorizontalalignment(swingconstants.trailing); 98. txtfoznakatromestna = new JTextField( 3 ); 99. poizvedbaplosca = new JPanel(); 100. lblpoizvedba = new JLabel(); 101. txtfpoizvedba = new JTextField( 30 ); 102. btnpoizvedba = new JButton(); 103. btnpoizvedba.addactionlistener(new ActionListener() { 104. public void actionperformed(actionevent e) { 105. btnpoizvedbaklik(e); 106. } 107. }); btnprikazivse = new JButton(); 110. btnprikazivse.addactionlistener(new ActionListener() { 111. public void actionperformed(actionevent e) { 112. btnprikazivseklik( e ); Stran 323 ŠC VELENJE

324 113. } 114. }); 115. btnvstavi = new JButton(); 116. btnvstavi.addactionlistener(new ActionListener() { 117. public void actionperformed(actionevent e) { 118. btninsertklik(e); 119. } 120. }); getcontentpane().setlayout( new FlowLayout( FlowLayout.CENTER, 10, 10 ) ); // razporeditev FlowLayout, vodoravni in navpični razmik setsize( 663, 294 ); // določimo velikost 124. setresizable( false ); 125. navigacijaplosca.setlayout( new BoxLayout( navigacijaplosca, BoxLayout.X_AXIS ) ); 126. btnnazaj.settext( "Nazaj" ); 127. btnnazaj.setenabled( false ); navigacijaplosca.add( btnnazaj ); 130. navigacijaplosca.add( Box.createHorizontalStrut( 10 ) ); // razmik 10 znakov 131. txtfindeks.sethorizontalalignment( 132. JTextField.CENTER ); navigacijaplosca.add( txtfindeks ); 135. navigacijaplosca.add( Box.createHorizontalStrut( 10 ) ); // razmik 10 znakov 136. lblod.settext( "od" ); 137. navigacijaplosca.add( lblod ); 138. navigacijaplosca.add( Box.createHorizontalStrut( 10 ) ); // razmik 10 znakov txtfmaks.sethorizontalalignment( 141. JTextField.CENTER ); 142. txtfmaks.seteditable( false ); 143. navigacijaplosca.add( txtfmaks ); 144. navigacijaplosca.add( Box.createHorizontalStrut( 10 ) ); // razmik 10 znakov 145. btnnaprej.settext( "Naprej" ); 146. btnnaprej.setenabled( false ); navigacijaplosca.add( btnnaprej ); 149. getcontentpane().add( navigacijaplosca ); 150. prikazplosca.setlayout( new GridLayout( 6, 2, 5, 8 ) ); 151. lblid.settext( "ID" ); 152. prikazplosca.add( lblid ); 153. txtfid.seteditable( false ); 154. prikazplosca.add( txtfid ); 155. lbldrzavaslo.settext( "Država (SLO)" ); 156. prikazplosca.add( lbldrzavaslo ); 157. prikazplosca.add( txtfdrzavaslo ); 158. lbldrzavaiso.settext( "Država (ISO):" ); 159. prikazplosca.add( lbldrzavaiso ); 160. prikazplosca.add( txtfdrzavaiso ); 161. lbloznakadvomestna.settext( "Oznaka (2 zanka)" ); 162. prikazplosca.add( lbloznakadvomestna ); 163. prikazplosca.add( txtfoznakadvomestna ); 164. lbloznakatromestna.settext( "Tromestna številka:" ); 165. prikazplosca.add( lbloznakatromestna ); 166. prikazplosca.add( txtfoznakatromestna ); INFORMATIKA, Programiranje 1 in 2 Stran 324

325 167. getcontentpane().add( prikazplosca ); 168. poizvedbaplosca.setlayout( new BoxLayout( poizvedbaplosca, BoxLayout.X_AXIS) ); 169. poizvedbaplosca.setborder( BorderFactory.createTitledBorder("Iskanje po nazivu države (SLO): " ) ); 170. lblpoizvedba.settext( "Država (SLO): " ); poizvedbaplosca.add( Box.createHorizontalStrut( 5 ) ); // razmik 5 znakov 173. poizvedbaplosca.add( lblpoizvedba ); 174. poizvedbaplosca.add( Box.createHorizontalStrut( 10 ) ); // razmik 10 znakov 175. poizvedbaplosca.add( txtfpoizvedba ); 176. poizvedbaplosca.add( Box.createHorizontalStrut( 10 ) ); // razmik 10 znakov 177. btnpoizvedba.settext( "Najdi" ); poizvedbaplosca.add( btnpoizvedba ); 180. poizvedbaplosca.add( Box.createHorizontalStrut( 5 ) ); // razmik 5 znakov 181. getcontentpane().add( poizvedbaplosca ); 182. btnprikazivse.settext( "Prikaži vse" ); getcontentpane().add( btnprikazivse ); btnvstavi.settext( "Nov zapis" ); 187. getcontentpane().add( btnvstavi ); 188. addwindowlistener( new WindowAdapter() { 189. public void windowclosing( WindowEvent evt ) 190. { 191. drzavesqlstavki.zapri(); // zapremo povezavo z zbirko podatkov 192. System.exit( 0 ); 193. } // windowclosing 194. } // anonimni razred 195. ); // addwindowlistener // btnprikazivse.doclick(); // izvršimo klik gumba Prikaži vse 198. setvisible( true ); // prikažemo okno 199. } // konstruktor // metoda premik na prejšnji zapis 202. private void btnnazajklik( ActionEvent evt ) 203. { 204. indekstrenutnizapis--; // zmanjšamo indeks trenutnega elementa 205. if ( indekstrenutnizapis < 0 ) // če je indeks manjši od nič 206. indekstrenutnizapis = stevilozapisov - 1; // določimo zadnji indeks 207. txtfindeks.settext( "" + ( indekstrenutnizapis + 1 ) ); 208. txtfindekssprememba( evt ); // izvršimo metodo za spremembo vrednosti indeksa 209. } // btnnazajklik // metoda premik na naslednji zapis 212. private void btnnaprejklik( ActionEvent evt ) 213. { 214. indekstrenutnizapis++; // povečamo indeks trenutnega elementa 215. if ( indekstrenutnizapis >= stevilozapisov ) // če je indeks večji od zadnjega veljavnega 216. indekstrenutnizapis = 0; // določimo prvi indeks 217. txtfindeks.settext( "" + ( indekstrenutnizapis + 1 ) ); 218. txtfindekssprememba( evt ); // izvršimo metodo za spremembo vrednosti indeksa 219. } // btnnaprejklik 220. Stran 325 ŠC VELENJE

326 221. // metoda za vstavljanje zapisa 222. private void btninsertklik( ActionEvent evt ) 223. { 224. // izvršimo insert stavek 225. int rezultat = drzavesqlstavki.vstavidrzave( txtfdrzavaslo.gettext(),txtfdrzavaiso.gettext(), txtfoznakadvomestna.gettext(), 226. txtfoznakatromestna.gettext(),"" ); 227. if ( rezultat == 1 ) // 1 uspešno vstavljanje zapisa 228. JOptionPane.showMessageDialog( this, "Vstavljen nov zapis!", "Obvestilo", JOptionPane.PLAIN_MESSAGE ); 229. else // neuspešno vstavljanje 230. JOptionPane.showMessageDialog( this, "Neuspešno dodajanje zapisa", "Napaka", JOptionPane.PLAIN_MESSAGE ); 231. btnprikazivseklik( evt ); // izvršimo metodo za prikaz vseh zapisov 232. } // btninsertklik // metoda za iskanje oz. poizvedbo 235. private void btnpoizvedbaklik( ActionEvent evt ) 236. { 237. // izvršimo poizvedbo s kriterijem in rezultat shranimo v povezan seznam 238. lstdrzave = drzavesqlstavki.vrnidrzavenaziv( txtfpoizvedba.gettext() ); 239. stevilozapisov = lstdrzave.size(); // določimo število zapisov 240. if ( stevilozapisov!= 0 ) // če obstajajo zapisi 241. { 242. indekstrenutnizapis = 0; // določimo vrednosti vmesnika 243. trenutnizapis = lstdrzave.get( indekstrenutnizapis ); 244. txtfid.settext( "" + trenutnizapis.vrniiddrzave() ); 245. txtfdrzavaslo.settext( trenutnizapis.vrnidrzavaslo() ); 246. txtfdrzavaiso.settext( trenutnizapis.vrnidrzavaiso() ); 247. txtfoznakadvomestna.settext( trenutnizapis.vrnioznakadvomestna() ); 248. txtfoznakatromestna.settext( trenutnizapis.vrnioznakatromestna() ); 249. txtfmaks.settext( "" + stevilozapisov ); 250. txtfindeks.settext( "" + ( indekstrenutnizapis + 1 ) ); 251. btnnaprej.setenabled( true ); 252. btnnaprej.setenabled( true ); 253. } // if 254. else 255. btnprikazivseklik( evt ); // izvršimo metodo za prikaz vseh zapisov 256. } // btnpoizvedbaklik // metoda za prikaz vseh zapisov tabele 259. private void btnprikazivseklik( ActionEvent evt ) { 260. try 261. { 262. // rezultat poizvedbe shrnimo v seznam 263. lstdrzave = drzavesqlstavki.vrnidrzavevse(); 264. stevilozapisov = lstdrzave.size(); // določimo število zapisov 265. if ( stevilozapisov!= 0 ) // če obstajajo zapisi 266. { 267. indekstrenutnizapis = 0; // določimo vrednosti vmesnika 268. trenutnizapis = lstdrzave.get( indekstrenutnizapis ); 269. txtfid.settext( "" + trenutnizapis.vrniiddrzave() ); 270. txtfdrzavaslo.settext( trenutnizapis.vrnidrzavaslo() ); 271. txtfdrzavaiso.settext( trenutnizapis.vrnidrzavaiso() ); 272. txtfoznakadvomestna.settext( trenutnizapis.vrnioznakadvomestna() ); INFORMATIKA, Programiranje 1 in 2 Stran 326

327 273. txtfoznakatromestna.settext( trenutnizapis.vrnioznakatromestna() ); 274. txtfmaks.settext( "" + stevilozapisov ); 275. txtfindeks.settext( "" + ( indekstrenutnizapis + 1 ) ); 276. btnnaprej.setenabled( true ); 277. btnnazaj.setenabled( true ); 278. } // if 279. } // try 280. catch ( Exception e ) 281. { e.printstacktrace(); } // catch 282. } // btnprikazivseklik // zetoda za spremembo indeksa prikazanega zapisa 285. private void txtfindekssprememba( ActionEvent evt ) 286. { 287. // določimo vrednost indeksa (vrednost vnosnega polja) 288. indekstrenutnizapis =( Integer.parseInt( txtfindeks.gettext() ) - 1 ); 289. if ( stevilozapisov!= 0 && indekstrenutnizapis < stevilozapisov ) // preverimo če je vpisan indeks ustrezen 290. { // v trenutni zapis shranimo element seznama na podanem indeksu 291. trenutnizapis = lstdrzave.get( indekstrenutnizapis ); 292. // določimo vsebino vmesnika (GUI) 293. txtfid.settext( "" + trenutnizapis.vrniiddrzave() ); 294. txtfdrzavaslo.settext( trenutnizapis.vrnidrzavaslo() ); 295. txtfdrzavaiso.settext( trenutnizapis.vrnidrzavaiso() ); 296. txtfoznakadvomestna.settext( trenutnizapis.vrnioznakadvomestna() ); 297. txtfoznakatromestna.settext( trenutnizapis.vrnioznakatromestna() ); 298. txtfmaks.settext( "" + stevilozapisov ); 299. txtfindeks.settext( "" + ( indekstrenutnizapis + 1 ) ); 300. } // if 301. } // txtfindekssprememba // zagonska metoda 304. public static void main( String args[] ) 305. { 306. new GUIDrzave(); // ustvarimo objek vmesnika 307. } // main } // razred GUIDrzave Primer izvajanja: Stran 327 ŠC VELENJE

328 21 WINDOWBUILDER Eclipsov vtičnik WindowBuilder podpira izdelavo GUI vmesnikov oz. aplikacij. Namestitev vtičnika 1. V meniju izberemo Help Install New Software. Odpre se pogovorno okno Install. 2. V pogovornem oknu Install kliknemo gumb Add. Odpre se pogovorno okno Add Repository. 3. V oknu Add Repository vpišemo ime npr. WindowBuilder in URL naslov (na strani poiščemo ustrezno povezavo za nameščeno verzijo Eclipse razvojnega okolja). Vnos potrdimo s klikom na gumb OK (V redu). Prikaže se seznam elementov, ki so na voljo za namestitev. Slika 97: Določitev mesta prenosa INFORMATIKA, Programiranje 1 in 2 Stran 328

329 Slika 98: Izbor elementov Izberemo vse elemente s klikom na gumb (Select All) in nato kliknemo gumb. Izpiše se vsebina licenčnega besedila. Potrdimo strinjanje z licenco z izbiro radijskega gumba Nastavitve namestitve potrdimo s klikom na gumb.. Vtičniki se prenesejo in samodejno namestijo. Po namestitvi izvedemo vnovični zagon programa Eclipse. Orodje je nameščeno za uporabo. Stran 329 ŠC VELENJE

Diapozitiv 1

Diapozitiv 1 Pogojni stavek Pogojni (if) stavek Tip bool Primerjanje Uranič Srečo If stavek Vsi dosedanji programi so se izvajali zaporedoma, ni bilo nobenih vejitev Program razvejimo na osnovi odločitev pogojnega

Prikaži več

Strojna oprema

Strojna oprema Asistenta: Mira Trebar, Miha Moškon UIKTNT 2 Uvod v programiranje Začeti moramo razmišljati algoritmično sestaviti recept = napisati algoritem Algoritem za uporabo poljubnega okenskega programa. UIKTNT

Prikaži več

Microsoft PowerPoint - Java_spremenljivke

Microsoft PowerPoint - Java_spremenljivke Java Spremenljivke, prireditveni stavek Spremenljivke Prostor, kjer hranimo vrednosti Ime Znak, števka, _ Presledkov v imenu ne sme biti! Tip spremenljivke int (cela števila) Vse spremenljivke napovemo

Prikaži več

RAM stroj Nataša Naglič 4. junij RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni

RAM stroj Nataša Naglič 4. junij RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni RAM stroj Nataša Naglič 4. junij 2009 1 RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni trak, pomnilnik ter program. Bralni trak- zaporedje

Prikaži več

Microsoft Word - M docx

Microsoft Word - M docx Š i f r a k a n d i d a t a : Državni izpitni center *M17178111* SPOMLADANSKI IZPITNI ROK Izpitna pola 1 Četrtek, 1. junij 2017 / 90 minut Dovoljeno gradivo in pripomočki: Kandidat prinese nalivno pero

Prikaži več

MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje prir

MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje prir MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje priročno programsko okolje tolmač interpreter (ne prevajalnik)

Prikaži več

Microsoft Word - M _mod..docx

Microsoft Word - M _mod..docx Državni izpitni center *M17278113* JESENSKI IZPITNI ROK NAVODILA ZA OCENJEVANJE Ponedeljek, 28. avgust 2017 SPLOŠNA MATURA Državni izpitni center Vse pravice pridržane. M172-781-1-3 2 IZPITNA POLA 1 1

Prikaži več

Diapozitiv 1

Diapozitiv 1 9. Funkcije 1 9. 1. F U N K C I J A m a i n () 9.2. D E F I N I C I J A F U N K C I J E 9.3. S T A V E K r e t u r n 9.4. K L I C F U N K C I J E I N P R E N O S P A R A M E T R O V 9.5. P R E K R I V

Prikaži več

Microsoft Word - UP_Lekcija04_2014.docx

Microsoft Word - UP_Lekcija04_2014.docx 4. Zanka while Zanke pri programiranju uporabljamo, kadar moramo stavek ali skupino stavkov izvršiti večkrat zaporedoma. Namesto, da iste (ali podobne) stavke pišemo n-krat, jih napišemo samo enkrat in

Prikaži več

Microsoft PowerPoint - Objekti_gradnja.ppt

Microsoft PowerPoint - Objekti_gradnja.ppt Naredimo razred Katera so stanja/lastnosti Kaj hočemo o objektih te vrste vedeti Kakšne lastnosti imajo Katere so metode Kakšno je znanje objektov Na katere ukaze se odzovejo Način predstavitve lastnosti

Prikaži več

Slide 1

Slide 1 Tehnike programiranja PREDAVANJE 10 Uvod v binarni svet in računalništvo (nadaljevanje) Logične operacije Ponovitev in ilustracija Logične operacije Negacija (eniški komplement) Negiramo vse bite v besedi

Prikaži več

Microsoft Word - avd_vaje_ars1_1.doc

Microsoft Word - avd_vaje_ars1_1.doc ARS I Avditorne vaje Pri nekem programu je potrebno izvršiti N=1620 ukazov. Pogostost in trajanje posameznih vrst ukazov računalnika sta naslednja: Vrsta ukaza Štev. urinih period Pogostost Prenosi podatkov

Prikaži več

Microsoft Word - M docx

Microsoft Word - M docx Š i f r a k a n d i d a t a : ržavni izpitni center *M15178112* SPOMLNSKI IZPITNI ROK Izpitna pola 2 Četrtek, 4. junij 2015 / 90 minut ovoljeno gradivo in pripomočki: Kandidat prinese nalivno pero ali

Prikaži več

Turingov stroj in programiranje Barbara Strniša Opis in definicija Definirajmo nekaj oznak: Σ abeceda... končna neprazna množica simbolo

Turingov stroj in programiranje Barbara Strniša Opis in definicija Definirajmo nekaj oznak: Σ abeceda... končna neprazna množica simbolo Turingov stroj in programiranje Barbara Strniša 12. 4. 2010 1 Opis in definicija Definirajmo nekaj oznak: Σ abeceda... končna neprazna množica simbolov (običajno Σ 2) Σ n = {s 1 s 2... s n ; s i Σ, i =

Prikaži več

RAČUNALNIŠKI PRAKTIKUM d o c. d r. A N D R E J T A R A N E N K O Kdo bo z vami? Predavatelj: dr. Andrej Taranenko

RAČUNALNIŠKI PRAKTIKUM d o c. d r. A N D R E J T A R A N E N K O Kdo bo z vami? Predavatelj: dr. Andrej Taranenko RAČUNALNIŠKI PRAKTIKUM d o c. d r. A N D R E J T A R A N E N K O Kdo bo z vami? Predavatelj: dr. Andrej Taranenko andrej.taranenko@uni-mb.si kabinet: 0/95 govorilne ure: http://matematika-racunalnistvo.fnm.uni-mb.si/

Prikaži več

Microsoft Word - vaje2_ora.doc

Microsoft Word - vaje2_ora.doc II UKAZI 1. Napišite zaporedje ukazov, ki vrednost enobajtne spremenljivke STEV1 prepiše v enobajtno spremenljivko STEV2. Nalogo rešite z neposrednim naslavljanjem (zaporedje lahko vsebuje le 2 ukaza v

Prikaži več

NAVODILA AVTORJEM PRISPEVKOV

NAVODILA AVTORJEM PRISPEVKOV Predmetna komisija za nižji izobrazbeni standard matematika Opisi dosežkov učencev 6. razreda na nacionalnem preverjanju znanja Slika: Porazdelitev točk pri matematiki (NIS), 6. razred 1 ZELENO OBMOČJE

Prikaži več

COBISS3/Medknjižnična izposoja

COBISS3/Medknjižnična izposoja 3/Medknjižnična izposoja 2.2 KATALOG Katalog nam omogoča: iskanje gradiva prikaz izbranih bibliografskih zapisov ali pripadajočih podatkov o zalogi iz lokalne baze podatkov v formatu COMARC vpogled v stanje

Prikaži več

Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefo

Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefo Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefonih. Obstaja precej različic, sam pa sem sestavil meni

Prikaži več

Diapozitiv 1

Diapozitiv 1 RAČUNALNIŠKA ARHITEKTURA 5 Operandi RA - 5 2018, Škraba, Rozman, FRI Predstavitev informacije - vsebina 5 Operandi - cilji: Razumevanje različnih formatov zapisovanja operandov Abecede (znaki) Števila

Prikaži več

Microsoft Word - CNC obdelava kazalo vsebine.doc

Microsoft Word - CNC obdelava kazalo vsebine.doc ŠOLSKI CENTER NOVO MESTO VIŠJA STROKOVNA ŠOLA STROJNIŠTVO DIPLOMSKA NALOGA Novo mesto, april 2008 Ime in priimek študenta ŠOLSKI CENTER NOVO MESTO VIŠJA STROKOVNA ŠOLA STROJNIŠTVO DIPLOMSKA NALOGA Novo

Prikaži več

Orodje za izvoz podatkov

Orodje za izvoz podatkov Pomoč uporabnikom -NA-SI-200, V6.13-00 IZUM, 2018 COBISS, COMARC, COBIB, COLIB, IZUM so zaščitene znamke v lasti javnega zavoda IZUM. KAZALO VSEBINE 1 Uvod... 1 2 Predstavitev orodja za izvoz podatkov...

Prikaži več

Document ID / Revision : 0519/1.3 ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov

Document ID / Revision : 0519/1.3 ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov Gospodarski subjekti Definicija: V skladu z 2. členom Izvedbene uredbe Komisije (EU) 2018/574

Prikaži več

Datum in kraj

Datum in kraj Ljubljana, 5. 4. 2017 Katalog znanj in vzorci nalog za izbirni izpit za vpis na magistrski študij Pedagoško računalništvo in informatika 2017/2018 0 KATALOG ZNANJ ZA IZBIRNI IZPIT ZA VPIS NA MAGISTRSKI

Prikaži več

SESTAVA VSEBINE MATEMATIKE V 6

SESTAVA VSEBINE MATEMATIKE V 6 SESTAVA VSEBINE MATEMATIKE V 6. RAZREDU DEVETLETKE 1. KONFERENCA Št. ure Učne enote CILJI UVOD (1 ura) 1 Uvodna ura spoznati vsebine učnega načrta, način dela, učne pripomočke za pouk matematike v 6. razredu

Prikaži več

Delavnica Načrtovanje digitalnih vezij

Delavnica Načrtovanje digitalnih vezij Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Programirljivi Digitalni Sistemi Digitalni sistem Digitalni sistemi na integriranem vezju Digitalni sistem

Prikaži več

Microsoft Word - N _moderacija.docx

Microsoft Word - N _moderacija.docx 2 N151-401-2-2 SPLOŠNA NAVODILA Prosimo, da moderirano različico navodil za vrednotenje dosledno upoštevate. Če učenec pravilno reši nalogo na svoj način (ki je matematično korekten) in je to razvidno

Prikaži več

APS1

APS1 Algoritmi in podatkovne strukture 1 Visokošolski strokovni študij Računalništvo in informatika Abstraktni podatkovni tipi Jurij Mihelič, UniLj, FRI Podatkovni tipi Razvil Pascal, Oberon itd. Software is

Prikaži več

4.Racionalna števila Ulomek je zapis oblike. Sestavljen je iz števila a (a ), ki ga imenujemo števec, in iz števila b (b, b 0), ki ga imenujemo imenov

4.Racionalna števila Ulomek je zapis oblike. Sestavljen je iz števila a (a ), ki ga imenujemo števec, in iz števila b (b, b 0), ki ga imenujemo imenov 4.Racionalna števila Ulomek je zapis oblike. Sestavljen je iz števila a (a ), ki ga imenujemo števec, in iz števila b (b, b 0), ki ga imenujemo imenovalec, ter iz ulomkove črte. Racionalna števila so števila,

Prikaži več

Priloga 1: Pravila za oblikovanje in uporabo standardiziranih referenc pri opravljanju plačilnih storitev Stran 4012 / Št. 34 / Uradni lis

Priloga 1: Pravila za oblikovanje in uporabo standardiziranih referenc pri opravljanju plačilnih storitev Stran 4012 / Št. 34 / Uradni lis Priloga 1: Pravila za oblikovanje in uporabo standardiziranih referenc pri opravljanju plačilnih storitev Stran 4012 / Št. 34 / 24. 5. 2019 Uradni list Republike Slovenije PRILOGA 1 PRAVILA ZA OBLIKOVANJE

Prikaži več

BiokemInfo - Pregled funkcij

BiokemInfo - Pregled funkcij Navodila veljajo tako za Microsoft Excel (v slednjem so pripravljeni tudi prikazani primeri) kot tudi za OpenOffice Calc. Med obema programoma obstajajo malenkostne, a ne bistvene razlike. Celice naslavljamo

Prikaži več

Microsoft PowerPoint - OAPS1- P12.ppt

Microsoft PowerPoint - OAPS1- P12.ppt Univerza v Ljubljani Fakulteta za računalništvo in informatiko Igor Rožanc Osnove algoritmov in podatkovnih struktur I (OAPS I) 2. letnik, VSP Računalništvo in informatika, vse smeri PROSOJNICE ZA 12.

Prikaži več

Univerza v Ljubljani FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Tržaška c. 25, 1000 Ljubljana Realizacija n-bitnega polnega seštevalnika z uporabo kvan

Univerza v Ljubljani FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Tržaška c. 25, 1000 Ljubljana Realizacija n-bitnega polnega seštevalnika z uporabo kvan Univerza v Ljubljani FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Tržaška c. 25, 1000 Ljubljana Realizacija n-bitnega polnega seštevalnika z uporabo kvantnih celičnih avtomatov SEMINARSKA NALOGA Univerzitetna

Prikaži več

Prekinitveni način delovanja PLK Glavni program (OB1; MAIN) se izvaja ciklično Prekinitev začasno ustavi izvajanje glavnega programa in zažene izvajan

Prekinitveni način delovanja PLK Glavni program (OB1; MAIN) se izvaja ciklično Prekinitev začasno ustavi izvajanje glavnega programa in zažene izvajan Prekinitveni način delovanja PLK Glavni program (OB1; MAIN) se izvaja ciklično Prekinitev začasno ustavi izvajanje glavnega programa in zažene izvajanje prekinitvene rutine Dogodek GLAVNI PROGRAM (MAIN-OB1)

Prikaži več

INFORMATOR BIROKRAT 1/2011

INFORMATOR BIROKRAT 1/2011 ta Veleprodaja Maloprodaja Storitve Računovodstvo Proizvodnja Gostinstvo Turizem Hotelirstvo Ticketing CRM Internetna trgovina Izdelava internetnih strani Grafično oblikovanje NOVOSTI IN NASVETI ZA DELO

Prikaži več

ARS1

ARS1 Nepredznačena in predznačena cela števila Dvojiški zapis Nepredznačeno Predznačeno 0000 0 0 0001 1 1 0010 2 2 0011 3 3 Pri odštevanju je stanje C obratno (posebnost ARM)! - če ne prekoračimo 0 => C=1 -

Prikaži več

1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatk

1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatk 1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatkov in njihov prenos med spletnimi mesti. Obrazec v

Prikaži več

Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje:

Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje: Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje: 17.07.2013 Ver. 2.9.1.2 Spletni portal članov uporabniška navodila

Prikaži več

Delavnica Načrtovanje digitalnih vezij

Delavnica Načrtovanje digitalnih vezij Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL Strukturno načrtovanje in testiranje Struktura vezja s komponentami

Prikaži več

PRIPOROČILA ZA OBLIKOVANJE KATALOGOV ZNANJA ZA MODULE V PROGRAMIH VIŠJEGA STROKOVNEGA IZOBRAŽEVANJA

PRIPOROČILA ZA OBLIKOVANJE KATALOGOV ZNANJA ZA MODULE V PROGRAMIH VIŠJEGA STROKOVNEGA IZOBRAŽEVANJA KATALOG ZNANJA 1. IME PREDMETA ZBIRKE PODATKOV I ZBIRKE PODATKOV II 2. SPLOŠNI CILJI Splošni cilji predmeta so: razvijanje sposobnosti za uporabo znanstvenih metod in sredstev, razvijanje odgovornosti

Prikaži več

Microsoft Word - ELEKTROTEHNIKA2_ junij 2013_pola1 in 2

Microsoft Word - ELEKTROTEHNIKA2_ junij 2013_pola1 in 2 Šifra kandidata: Srednja elektro šola in tehniška gimnazija ELEKTROTEHNIKA PISNA IZPITNA POLA 1 12. junij 2013 Čas pisanja 40 minut Dovoljeno dodatno gradivo in pripomočki: Kandidat prinese nalivno pero

Prikaži več

Microsoft PowerPoint - Java-rekurzija.ppt

Microsoft PowerPoint - Java-rekurzija.ppt Pesmica Živel je mož, imel je psa, lepo ga je učil. Nekoč ukradel mu je kos mesa, zato ga je ubil. Postavil mu je spomenik in nanj napisal: Živel je mož, imel je psa, lepo ga je učil. Nekoč ukradel mu

Prikaži več

M

M Š i f r a k a n d i d a t a : Državni izpitni center *M16140111* Osnovna raven MATEMATIKA Izpitna pola 1 SPOMLADANSKI IZPITNI ROK Sobota, 4. junij 016 / 10 minut Dovoljeno gradivo in pripomočki: Kandidat

Prikaži več

NAJRAJE SE DRUŽIM S SVIČNIKOM, SAJ LAHKO VADIM ČRTE IN KRIVULJE, PA VELIKE TISKANE ČRKE IN ŠTEVILKE DO 20. Preizkusite znanje vaših otrok in natisnite

NAJRAJE SE DRUŽIM S SVIČNIKOM, SAJ LAHKO VADIM ČRTE IN KRIVULJE, PA VELIKE TISKANE ČRKE IN ŠTEVILKE DO 20. Preizkusite znanje vaših otrok in natisnite NAJRAJE SE DRUŽIM S SVIČNIKOM, SAJ LAHKO VADIM ČRTE IN KRIVULJE, PA VELIKE TISKANE ČRKE IN ŠTEVILKE DO 20. Preizkusite znanje vaših otrok in natisnite vzorčne strani iz DELOVNIH LISTOV 1 v štirih delih

Prikaži več

Delavnica Načrtovanje digitalnih vezij

Delavnica Načrtovanje digitalnih vezij Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Procesorji Model računalnika, mikrokrmilnik CPE = mikrosekvenčnik + podatkovna

Prikaži več

Spoznajmo PowerPoint 2013

Spoznajmo PowerPoint 2013 Spoznajmo PowerPoint 2013 13 Nova predstavitev Besedilo v predstavitvi Besedilo, ki se pojavlja v predstavitvah lahko premaknemo kamorkoli v diapozitivu. Kadar izdelamo diapozitiv z že ustvarjenimi okvirji

Prikaži več

GHOSTBUSTERS navodila za učitelje O PROJEKTU S tem projektom se učenci sami naučijo izdelati igro. Ustvariti morajo več ikon (duhcov ali kaj drugega)

GHOSTBUSTERS navodila za učitelje O PROJEKTU S tem projektom se učenci sami naučijo izdelati igro. Ustvariti morajo več ikon (duhcov ali kaj drugega) GHOSTBUSTERS navodila za učitelje O PROJEKTU S tem projektom se učenci sami naučijo izdelati igro. Ustvariti morajo več ikon (duhcov ali kaj drugega) in za vsako napisati svojo kodo. Dve ikoni imata isto

Prikaži več

DN5(Kor).dvi

DN5(Kor).dvi Koreni Število x, ki reši enačbo x n = a, imenujemo n-ti koren števila a in to označimo z n a. Pri tem je n naravno število, a pa poljubno realno število. x = n a x n = a. ( n a ) n = a. ( n a ) m = n

Prikaži več

DES

DES Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Model vezja Računalniški model in realno vezje Model logičnega negatorja Načini

Prikaži več

Urejevalna razdalja Avtorji: Nino Cajnkar, Gregor Kikelj Mentorica: Anja Petković 1 Motivacija Tajnica v posadki MARS - a je pridna delavka, ampak se

Urejevalna razdalja Avtorji: Nino Cajnkar, Gregor Kikelj Mentorica: Anja Petković 1 Motivacija Tajnica v posadki MARS - a je pridna delavka, ampak se Urejevalna razdalja Avtorji: Nino Cajnkar, Gregor Kikelj Mentorica: Anja Petković 1 Motivacija Tajnica v posadki MARS - a je pridna delavka, ampak se velikokrat zmoti. Na srečo piše v programu Microsoft

Prikaži več

Microsoft Word - M doc

Microsoft Word - M doc Državni izpitni center *M11145113* INFORMATIKA SPOMLADANSKI IZPITNI ROK NAVODILA ZA OCENJEVANJE Petek, 10. junij 2011 SPLOŠNA MATURA RIC 2011 2 M111-451-1-3 IZPITNA POLA 1 1. b 2. a 3. Pojem se povezuje

Prikaži več

PowerPointova predstavitev

PowerPointova predstavitev INTRANET - DETEKTIV Detektivska zbornica Republike Slovenije Pozdravljeni, v kratki predstaviti in navodilih za delo z intranet sistemom Detektiv. Intranet članom Detektivske zbornice RS omogoča, da: -

Prikaži več

NEVTRIN d.o.o. Podjetje za razvoj elektronike, Podgorje 42a, 1241 Kamnik, Slovenia Telefon: Faks.: in

NEVTRIN d.o.o. Podjetje za razvoj elektronike, Podgorje 42a, 1241 Kamnik, Slovenia Telefon: Faks.: in NEVTRIN d.o.o. Podjetje za razvoj elektronike, Podgorje 42a, 1241 Kamnik, Slovenia Telefon: +386 1 729 6 460 Faks.: +386 1 729 6 466 www.nevtrin.si info@elektrina.si USB RFID READER Navodila za uporabo?

Prikaži več

resitve.dvi

resitve.dvi FAKULTETA ZA STROJNISTVO Matematika 2. kolokvij. december 2 Ime in priimek: Vpisna st: Navodila Pazljivo preberite besedilo naloge, preden se lotite resevanja. Veljale bodo samo resitve na papirju, kjer

Prikaži več

Excel 2016

Excel 2016 PRIDOBIVANJE TEMELJN IH IN POKLICNIH KOMPETENC OD 2019 DO 2022 HIPERPOVEZAVA Gradivo za interno uporabo AVTOR: Belinda Lovrenčič Gradivo ni lektorirano V Maj 2019 Operacijo sofinancira Evropska unija,

Prikaži več

Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna str

Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna str Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna stran: http://www.coks.si/ Elektronski naslov: podpora@coks.si

Prikaži več

Microsoft PowerPoint _12_15-11_predavanje(1_00)-IR-pdf

Microsoft PowerPoint _12_15-11_predavanje(1_00)-IR-pdf uporaba for zanke i iz korak > 0 oblika zanke: for i iz : korak : ik NE i ik DA stavek1 stavek2 stavekn stavek1 stavek2 stavekn end i i + korak I&: P-XI/1/17 uporaba for zanke i iz korak < 0 oblika zanke:

Prikaži več

Microsoft Word - NAVODILA ZA UPORABO.docx

Microsoft Word - NAVODILA ZA UPORABO.docx NAVODILA ZA UPORABO VODILO CCM-18A/N-E (K02-MODBUS) Hvala ker ste se odločili za nakup našega izdelka. Pred uporabo enote skrbno preberite ta Navodila za uporabo in jih shranite za prihodnjo rabo. Vsebina

Prikaži več

INDIVIDUALNI PROGRAM PREDMET: MATEMATIKA ŠOL. LETO 2015/2016 UČITELJ: ANDREJ PRAH Učenec: Razred: 7. Leto šolanja: Ugotovitev stanja: Učenec je lani n

INDIVIDUALNI PROGRAM PREDMET: MATEMATIKA ŠOL. LETO 2015/2016 UČITELJ: ANDREJ PRAH Učenec: Razred: 7. Leto šolanja: Ugotovitev stanja: Učenec je lani n INDIVIDUALNI PROGRAM PREDMET: MATEMATIKA ŠOL. LETO 2015/2016 UČITELJ: ANDREJ PRAH Učenec: Razred: 7. Leto šolanja: Ugotovitev stanja: Učenec je lani neredno opravljal domače naloge. Pri pouku ga je bilo

Prikaži več

Microsoft Word - CNR-BTU3_Bluetooth_vmesnik

Microsoft Word - CNR-BTU3_Bluetooth_vmesnik CNR-BTU3 Bluetooth vmesnik A. Vsebina pakiranja Bluetooth USB Adapter Bluetooth programska oprema in CD z gonilniki Navodila za uporabo in CD 1. Namestitev Bluetooth programske opreme za Windowse 1. Vstavite

Prikaži več

Kazalo 1 DVOMESTNE RELACIJE Operacije z dvomestnimi relacijami Predstavitev relacij

Kazalo 1 DVOMESTNE RELACIJE Operacije z dvomestnimi relacijami Predstavitev relacij Kazalo 1 DVOMESTNE RELACIJE 1 1.1 Operacije z dvomestnimi relacijami...................... 2 1.2 Predstavitev relacij............................... 3 1.3 Lastnosti relacij na dani množici (R X X)................

Prikaži več

Slide 1

Slide 1 Projektno vodenje PREDAVANJE 7 doc. dr. M. Zajc matej.zajc@fe.uni-lj.si Projektno vodenje z orodjem Excel Predstavitev Najbolj razširjeno orodje za delo s preglednicami Dva sklopa funkcij: Obdelava številk

Prikaži več

Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet NPA Vprašanja Visual C# (4. letnik) 1. Uporabniški vmesnik razvojnega okolja Visual C#

Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet NPA Vprašanja Visual C# (4. letnik) 1. Uporabniški vmesnik razvojnega okolja Visual C# Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet NPA Vprašanja Visual C# (4. letnik) 1. Uporabniški vmesnik razvojnega okolja Visual C# Pomen posameznih oken uporabniškega vmesnika, urejevalnik

Prikaži več

Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet APJ Vsako izpitno vprašanje je sestavljeno iz posameznih delov, od katerih je vsak del

Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet APJ Vsako izpitno vprašanje je sestavljeno iz posameznih delov, od katerih je vsak del Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet APJ Vsako izpitno vprašanje je sestavljeno iz posameznih delov, od katerih je vsak del točkovan z določenim številom točk (odstotkov). Celotno

Prikaži več

CelotniPraktikum_2011_verZaTisk.pdf

CelotniPraktikum_2011_verZaTisk.pdf Elektrotehniški praktikum Osnove digitalnih vezij Namen vaje Videti, kako delujejo osnovna dvovhodna logi na vezja v obliki integriranih vezij oziroma, kako opravljajo logi ne funkcije Boolove algebre.

Prikaži več

Microsoft Word - M docx

Microsoft Word - M docx Š i f r a k a n d i d a t a : Državni izpitni center *M15245112* JESENSKI IZPITNI ROK Izpitna pola 2 / 90 minut Dovoljeno gradivo in pripomočki: Kandidat prinese nalivno pero ali kemični svinčnik in računalo.

Prikaži več

Matematika Diferencialne enačbe prvega reda (1) Reši diferencialne enačbe z ločljivimi spremenljivkami: (a) y = 2xy, (b) y tg x = y, (c) y = 2x(1 + y

Matematika Diferencialne enačbe prvega reda (1) Reši diferencialne enačbe z ločljivimi spremenljivkami: (a) y = 2xy, (b) y tg x = y, (c) y = 2x(1 + y Matematika Diferencialne enačbe prvega reda (1) Reši diferencialne enačbe z ločljivimi spremenljivkami: (a) y = 2xy, (b) y tg x = y, (c) y = 2x(1 + y 2 ). Rešitev: Diferencialna enačba ima ločljive spremenljivke,

Prikaži več

Microsoft PowerPoint - IPPU-V2.ppt

Microsoft PowerPoint - IPPU-V2.ppt Informatizacija poslovnih procesov v upravi VAJA 2 Procesni pogled Diagram aktivnosti IPPU vaja 2; stran: 1 Fakulteta za upravo, 2006/07 Procesni pogled Je osnova za razvoj programov Prikazuje algoritme

Prikaži več

Microsoft Word - Seštevamo stotice.doc

Microsoft Word - Seštevamo stotice.doc UČNA PRIPRAVA: MATEMATIKA UČNI SKLOP: Računske operacije UČNA TEMA: Seštevamo in odštevamo stotice Seštevamo stotice UČNE METODE: razlaga, prikazovanje, demonstracija, grafično in pisno delo UČNE OBLIKE:

Prikaži več

Navodila Trgovina iCenter

Navodila Trgovina iCenter Napredovanja v plačne razrede javnih uslužbencev 2019 S pomočjo SAOP programa Kadrovska evidenca lahko ob dokupljeni kodi vodimo napredovanja javnih uslužbencev. Za napredovanja v letu 2019 je potrebno

Prikaži več

Navodila za pripravo oglasov na strani Med.Over.Net v 2.2 Statistično najboljši odziv uporabnikov je na oglase, ki hitro in neposredno prenesejo osnov

Navodila za pripravo oglasov na strani Med.Over.Net v 2.2 Statistično najboljši odziv uporabnikov je na oglase, ki hitro in neposredno prenesejo osnov Navodila za pripravo oglasov na strani Med.Over.Net v 2.2 Statistično najboljši odziv uporabnikov je na oglase, ki hitro in neposredno prenesejo osnovno sporočilo. Izogibajte se daljših besedil in predolgih

Prikaži več

Vrste

Vrste Matematika 1 17. - 24. november 2009 Funkcija, ki ni algebraična, se imenuje transcendentna funkcija. Podrobneje si bomo ogledali naslednje transcendentne funkcije: eksponentno, logaritemsko, kotne, ciklometrične,

Prikaži več

Mladi za napredek Maribora srečanje DOLŽINA»SPIRALE«Matematika Raziskovalna naloga Februar 2015

Mladi za napredek Maribora srečanje DOLŽINA»SPIRALE«Matematika Raziskovalna naloga Februar 2015 Mladi za napredek Maribora 015 3. srečanje DOLŽINA»SPIRALE«Matematika Raziskovalna naloga Februar 015 Kazalo 1. Povzetek...3. Uvod...4 3. Spirala 1...5 4. Spirala...6 5. Spirala 3...8 6. Pitagorejsko drevo...10

Prikaži več

Objektno usmerjeno programiranje

Objektno usmerjeno programiranje Objektno usmerjeno programiranje Izrazoslovje OOP Razred pomeni kategorijo stvari Ime razreda lahko v Javi uporabimo kot tip polja ali lokalne spremenljivke ali kot povratni tip funkcije (metode) Objekt

Prikaži več

N

N Državni izpitni center *N19141132* 9. razred FIZIKA Ponedeljek, 13. maj 2019 NAVODILA ZA VREDNOTENJE NACIONALNO PREVERJANJE ZNANJA v 9. razredu Državni izpitni center Vse pravice pridržane. 2 N191-411-3-2

Prikaži več

ŠTEVCI PROMETA IN NJIHOVA UPORABA ZA NAMENE STATISTIK ČRT GRAHONJA

ŠTEVCI PROMETA IN NJIHOVA UPORABA ZA NAMENE STATISTIK ČRT GRAHONJA ŠTEVCI PROMETA IN NJIHOVA UPORABA ZA NAMENE STATISTIK ČRT GRAHONJA Navdih Poizvedovanje po BD podatkovnih virih, ki imajo časovno dimenzijo in so dostopni. Večji promet pomeni večje število dobrin in močnejšo

Prikaži več

Osnove matematicne analize 2018/19

Osnove matematicne analize  2018/19 Osnove matematične analize 2018/19 Neža Mramor Kosta Fakulteta za računalništvo in informatiko Univerza v Ljubljani Funkcija je predpis, ki vsakemu elementu x iz definicijskega območja D f R priredi natanko

Prikaži več

Nameščanje Adopt Open Java Development Kit 8

Nameščanje Adopt Open Java Development Kit 8 Nameščanje Adopt Open Java Development Kit 8 za Windows x64 IZUM, 2019 IZUM, COBISS, COMARC, COBIB, COLIB, CONOR, SICRIS, E-CRIS so zaščitene znamke v lasti javnega zavoda IZUM. KAZALO VSEBINE 1 Uvod...

Prikaži več

APS1

APS1 Algoritmi in podatkovne strukture 1 Visokošolski strokovni študij Računalništvo in informatika Algoritmi in problemi Jurij Mihelič, UniLj, FRI Algoritmi Izvor izraza al-khwārizmī algoritmi Sem Muhammad

Prikaži več

PowerPoint Presentation

PowerPoint Presentation Uporaba storitve Office 365 v napravi iphone ali ipad Priročnik za hiter začetek dela Ogled e-pošte Nastavite napravo iphone ali ipad tako, da boste lahko pošiljali in prejemali e-pošto iz računa v storitvi

Prikaži več

Zavod sv. Stanislava Škofijska klasična gimnazija Programiranje v Pythonu Program za računanje Maturitetna seminarska naloga iz informatike Kandidat:

Zavod sv. Stanislava Škofijska klasična gimnazija Programiranje v Pythonu Program za računanje Maturitetna seminarska naloga iz informatike Kandidat: Zavod sv. Stanislava Škofijska klasična gimnazija Program za računanje Maturitetna seminarska naloga iz informatike Kandidat: Tinkara Čadež Mentor: Helena Starc Grlj Ljubljana Šentvid, april 2019 POVZETEK

Prikaži več

Uradni list RS - 12(71)/2005, Mednarodne pogodbe

Uradni list RS - 12(71)/2005, Mednarodne pogodbe PRILOGA 3 Osnovne značilnosti, ki se sporočajo za usklajevanje 1. Zgradba podatkovne zbirke Podatkovno zbirko sestavljajo zapisi, ločeni po znakovnih parih "pomik na začetek vrstice pomik v novo vrstico"

Prikaži več

Nameščanje Adopt Open Java Development Kit 8

Nameščanje Adopt Open Java Development Kit 8 Nameščanje Adopt Open Java Development Kit 8 za Windows x64 IZUM, 2019 IZUM, COBISS, COMARC, COBIB, COLIB, CONOR, SICRIS, E-CRIS so zaščitene znamke v lasti javnega zavoda IZUM. KAZALO VSEBINE 1 Uvod...

Prikaži več

PREDMETNI KURIKULUM ZA RAZVOJ METEMATIČNIH KOMPETENC

PREDMETNI KURIKULUM ZA RAZVOJ METEMATIČNIH KOMPETENC MATEMATIKA 1.razred OSNOVE PREDMETA POKAZATELJI ZNANJA SPRETNOSTI KOMPETENCE Naravna števila -pozna štiri osnovne računske operacije in njihove lastnosti, -izračuna številske izraze z uporabo štirih računskih

Prikaži več

Navodila:

Navodila: 1 Napišite zaporedje ukazov, ki vrednost enobajtne spremenljivke STEV1 prepiše v enobajtno spremenljivko STEV2. Nalogo rešite z neposrednim naslavljanjem (zaporedje lahko vsebuje le 2 ukaza v zbirniku

Prikaži več

Podatkovni model ER

Podatkovni model ER Podatkovni model Entiteta- Razmerje Iztok Savnik, FAMNIT 2018/19 Pregled: Načrtovanje podatkovnih baz Konceptualno načtrovanje: (ER Model) Kaj so entite in razmerja v aplikacijskem okolju? Katere podatke

Prikaži več

MATEMATIKA Zbirka nalog za nacionalno preverjanje znanja Jana Draksler in Marjana Robič 9+ znam za več

MATEMATIKA Zbirka nalog za nacionalno preverjanje znanja Jana Draksler in Marjana Robič 9+ znam za več MATEMATIKA Zbirka nalog za nacionalno preverjanje znanja Jana Draksler in Marjana Robič 9+ znam za več ZBIRKA ZNAM ZA VEČ imatematika 9+ Zbirka nalog za nacionalno preverjanje znanja Avtorici: Jana Draksler

Prikaži več

5 Programirljiva vezja 5.1 Kompleksna programirljiva vezja - CPLD Sodobna programirljiva vezja delimo v dve veliki skupini: CPLD in FPGA. Vezja CPLD (

5 Programirljiva vezja 5.1 Kompleksna programirljiva vezja - CPLD Sodobna programirljiva vezja delimo v dve veliki skupini: CPLD in FPGA. Vezja CPLD ( 5 Programirljiva vezja 5.1 Kompleksna programirljiva vezja - CPLD Sodobna programirljiva vezja delimo v dve veliki skupini: CPLD in FPGA. Vezja CPLD (angl. Complex Programmable Logic Device) so manjša

Prikaži več

Zadeva: Ponudba

Zadeva: Ponudba Navodila za urejanje Spletne strani CTEK.si 1. Dodajanje novega polnilnika Za dodajanje novega polnilnika nikoli ne prepisujte že objavljenih vsebin, ampak sledite tem navodilom. Ta so zagotovilo, da bodo

Prikaži več

Učinkovita izvedba algoritma Goldberg-Tarjan Teja Peklaj 26. februar Definicije Definicija 1 Naj bo (G, u, s, t) omrežje, f : E(G) R, za katero v

Učinkovita izvedba algoritma Goldberg-Tarjan Teja Peklaj 26. februar Definicije Definicija 1 Naj bo (G, u, s, t) omrežje, f : E(G) R, za katero v Učinkovita izvedba algoritma Goldberg-Tarjan Teja Peklaj 26. februar 2009 1 Definicije Definicija 1 Naj bo (G, u, s, t) omrežje, f : E(G) R, za katero velja 0 f(e) u(e) za e E(G). Za v V (G) definiramo presežek

Prikaži več

ACAD-BAU-Analiza-prostorov

ACAD-BAU-Analiza-prostorov ANALIZA PROSTOROV Ko obdelujemo večje projekte, je analiza prostorov zelo pomembna v vseh fazah projektiranja. Pri idejnem snovanju moramo npr. za določeno površino trgovske namembnosti zagotoviti primerno

Prikaži več

Diapozitiv 1

Diapozitiv 1 Računalništvo in informatika Program: Mehatronika dr. Hubert Fröhlich, univ. dipl. el. Podatkovne baze 2 Podatkovne baze Podatki osnova za odločanje in izvajanje akcij tiskana oblika elektronska oblika

Prikaži več

Strokovni izobraževalni center Ljubljana, Srednja poklicna in strokovna šola Bežigrad PRIPRAVE NA PISNI DEL IZPITA IZ MATEMATIKE 2. letnik nižjega pok

Strokovni izobraževalni center Ljubljana, Srednja poklicna in strokovna šola Bežigrad PRIPRAVE NA PISNI DEL IZPITA IZ MATEMATIKE 2. letnik nižjega pok Strokovni izobraževalni center Ljubljana, Srednja poklicna in strokovna šola Bežigrad PRIPRAVE NA PISNI DEL IZPITA IZ MATEMATIKE 2. letnik nižjega poklicnega izobraževanja NAVODILA: Izpit iz matematike

Prikaži več

(Microsoft Word - U\350enje telegrafije po Kochovi metodi.doc)

(Microsoft Word - U\350enje telegrafije po Kochovi metodi.doc) MORSE UČENJE PO KOCHOVI METODI Računalniški program za učenje skupaj z nekaterimi dodatnimi datotekami dobite na spletni strani avtorja: http://www.g4fon.net/. Zanimive strani so tudi: - http://www.qsl.net/n1irz/finley.morse.html

Prikaži več

UNIVERZA V LJUBLJANI FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Andraž Drčar Prevajanje javanskih programov z vstavljeno zložno kodo DIPLOMSKO DELO UNI

UNIVERZA V LJUBLJANI FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Andraž Drčar Prevajanje javanskih programov z vstavljeno zložno kodo DIPLOMSKO DELO UNI UNIVERZA V LJUBLJANI FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Andraž Drčar Prevajanje javanskih programov z vstavljeno zložno kodo DIPLOMSKO DELO UNIVERZITETNI ŠTUDIJSKI PROGRAM PRVE STOPNJE RAČUNALNIŠTVO

Prikaži več

EndNote Basic Online navodila za uporabo Vsebina 1 Kaj je EndNote Online? Dostop in prijava Ustvarjanje računa Uporaba

EndNote Basic Online navodila za uporabo Vsebina 1 Kaj je EndNote Online? Dostop in prijava Ustvarjanje računa Uporaba EndNote Basic Online navodila za uporabo Vsebina 1 Kaj je EndNote Online?... 2 2 Dostop in prijava... 3 2.1 Ustvarjanje računa... 3 3 Uporaba... 5 3.1 Dodajanje referenc... 5 3.2 Navodila za pripravo in

Prikaži več

Diapozitiv 1

Diapozitiv 1 Vhodno izhodne naprave Laboratorijska vaja 4 - AV 4 Linije LTSpice, simulacija elektronskih vezij VIN - LV 1 Rozman,Škraba, FRI LTSpice LTSpice: http://www.linear.com/designtools/software/ https://www.analog.com/en/design-center/design-tools-andcalculators/ltspice-simulator.html

Prikaži več

rm.dvi

rm.dvi 1 2 3 4 5 6 7 Ime, priimek Razred 14. DRŽAVNO TEKMOVANJE V RAZVEDRILNI MATEMATIKI NALOGE ZA PETI IN ŠESTI RAZRED OSNOVNE ŠOLE Čas reševanja nalog: 90 minut Točkovanje 1., 2., in 7. naloge je opisano v

Prikaži več