Informatika | Grafika » Hálózati grafika és képfeldolgozás kiegészítő jegyzet

Alapadatok

Év, oldalszám:2002, 30 oldal

Nyelv:magyar

Letöltések száma:111

Feltöltve:2009. október 03.

Méret:170 KB

Intézmény:
-

Megjegyzés:

Csatolmány:-

Letöltés PDF-ben:Kérlek jelentkezz be!



Értékelések

Nincs még értékelés. Legyél Te az első!


Tartalmi kivonat

Budapesti Műszaki Főiskola Kandó Kálmán Villamosmérnöki Főiskolai Kar Távoktatás HÁLÓZATI GRAFIKA ÉS KÉPFELDOLGOZÁS KIEGÉSZÍTŐ JEGYZET Készítette: dr. Nagy Rezső főiskolai docens Közreműködött: Hajnal Éva, Furucz János és Molnár Éva Székesfehérvár, 2002. 2 1 A Java nyelv kialakulása Az 1990-es évek elején a Sun nevű cég elindított egy fejlesztést azzal a céllal, hogy betörjön az elektronikai piac ún. "okos" processzorral vezérelt, programozható készülékeket alkalmazó területére.(Pl Kábel-TV társaságok által használt vezérlő) Az ilyen készülékeknél szükség lehetett egy olyan technológiára, amely lehetővé tette a kész programoknak a hálózaton keresztül a készülékbe letöltését, megbízható futtatását. Ehhez először a C++ nyelvet használták, de elkezdtek kifejleszteni egy új nyelvet is a C++ alapján, ami erre a feladatra még alkalmasabb lehetne. Kihagyták a C++ nyelvből az

általuk bonyolultnak, vagy nem megbízhatónak ítélt szerkezeteket és néhány nyelvi elemet pedig hozzáadtak. Közben az Internet hálózat rohamos fejlődésnek indult, és éppen ilyen típusú programozási technológiára mutatkozott nagy igény. A létrehozott nyelvet, a megalkotásakor megivott kávé származási helye után nevezték Java-nak. 2 A nyelv legfontosabb tulajdonságai       Egyszerű: A nyelv a C++ nyelvhez nagyon hasonlít, egyszerű utasításokat tartalmaz, és a program szerkezete is egyszerű formai szabályokkal leírható. Objektumorientált: A program építőkövei az objektumok. Az objektum tulajdonképpen egy összetett szerkezet, részei lehetnek adatok, és részei az ezeken az adatokon végezhető műveletek (úgynevezett metódusok). Adatstruktúra független és hordozható: A Java az Internet egyik programnyelve, ezért fontos követelmény, hogy egészen különböző géptípusokon és különböző operációs

rendszer alatt is használható legyen. Ez úgy oldható meg, hogy egy fordítóprogram a programot egy képzeletbeli hardver (virtuális gép) utasításrendszerére fordítja le. Így egy úgynevezett byte-kódot kapunk, amit aztán a konkrét számítógépen a java virtuális gépet megvalósító program értelmez és hajt végre. Appletek: Olyan programokat is lehet készíteni, amelyek html file-ba szerkeszthetők be, ezáltal a weblapjainkat egyedivé, színesebbé, mozgalmasabbá tehetjük. Biztonságos: Biztonságos a nyelv, mert lehetőséget ad arra, hogy a futás közben fellépő hibákat (exception) le lehet kezelni, és a program végrehajtását normálisan folytatni, vagy a program futását megfelelőképpen leállítani. Mivel az interneten terjeszthető programokat is írhatunk java nyelven, fontos, hogy a számítógépünk védett legyen különféle támadások ellen is. Sajnos ezekért a tulajdonságokért azt az árat kell fizetnünk, hogy a java programok

eléggé lassan futnak (kb. 10* gyorsabbak a C++ programok), és erőforrás-igényesek. Párhuzamosság: A feladatok jó része párhuzamosan végrehajtható részletekre bontható fel, amelyet, ha több processzor van a gépen a processzorok egymással párhuzamosan végezhetnek el. Ezek az úgynevezett szálak Így jobban kihasználható a számítógép központi egysége, a programok a külső, pl. felhasználói eseményekre gyorsabban reagálhatnak. 3 3 A Java programozási nyelv 3.1 Első program: public class Jonapot { public static void main(String[] args) { System.outprintln("Pálinkás jó reggelt"); //szöveg kiírató metódus karakteres képernyőre } } A fenti program az idézőjelek közötti szöveget kiírja a képernyőre a System.outprintln metódus segítségével. A programok kötelezően tartalmaznak egy main függvényt, és meg kell adni ennek a típusát is. A void szó azt jelenti, hogy nincs visszaadott típusa a main függvénynek,

valójában tehát egy eljárásról van itt szó. A String[] args a program paramétereit deklarálja, a public és a static szavak ún. módosítók, amely a függvény elérését szabályozzák. 3.2 Egy Java program szerkezete A programok az import utasításokkal kezdődhetnek, felsorolva a programban felhasznált könyvtárak nevét. Ez nem kötelező, az egyes könyvtári elemekre való hivatkozásnál is megadható az adott könyvtár neve. Importálásnál csomagokból (package) osztályok (class) kerülnek importálásra, azaz a program számára felhasználhatóvá válnak. Pl. import java.awt*; import java.io*; A * az adott csomag összes osztályát jelenti. Ezután rögtön osztálydeklaráció következik. Az összes változó, és minden utasítás csak osztályok törzsében szerepelhet. A legfontosabb formai szabályok:  A program Class osztálynév{.} szerkezetű  Minden utasítás pontosvesszővel zárul.  Az utasításblokkokat {} zárójelek

határolják.  A Java megkülönbözteti a kis- és nagybetűket.  A változónevek tetszőleges hosszúságúak lehetnek és betűvel, esetleg az „ ” vagy „$” szimbólumok egyikével kell kezdődniük.  Nem használhatjuk változónévnek a Java kulcsszavait. Java program kötelezően tartalmaz egy main metódust, ez a tulajdonképpeni főprogram. 3.3 Appletek Az eddig ismertetett program egy Java alkalmazás, de léteznek Weblapba szerkeszthető Java appletek: Az applet olyasmit jelent, hogy ‘kis alkalmazás’. Az appletek nem önálló programok, mert meghatározott környezetet igényelnek, amiben egyáltalán képesek létezni és végrehajtódni. Ezt a környezetet a WWW-böngészők jelentik, de csak azok, amelyek 4 biztosítják a Java támogatást. Ezek a böngészők például a Netscape Navigator, az Internet Explorer vagy a Hot Java. Egy egyszerű példa, mely kiírja, hogy ”Hello!!”: public static class peldaprogram extends java.appletApplet {

publis static void paint(java.awtGraphics gc) { gc.drawString(”Hello!!”,100,100); //gc.drawString szöveg kiírás a grafikus ablakba } } Beágyazás a HTML fájlba: <applet code = ”peldaprogram.class” width = 350 height = 300 ></applet> Az appletek ugyanis önállóan nem léteznek. Szükségük van egy HTML dokumentumra E dokumentumba az applet, az <APPLET> tag segítségével ágyazható be, a <BODY> tartományba. 3.4 Az appletek szerkezete Az appleteknél nincs jelen kötelezően a main() metódus, viszont a program neve után kell írni, hogy: extends java.appletApplet Ehelyett van más automatikusan meghívódó metódus, melyek közül néhányat ismertetünk:  init() – Akkor fut le, amikor az applet betöltődik a böngészőbe.  start() - A start() metódus hozza működésbe az appletet. A start() metódus meghívására akkor kerül sor, amikor az olvasó először tölti be a Webdokumentumot, vagy amikor a többoldalas dokumentum

olvasásánál ismét láthatóvá válik az applet.  paint() - Az applet ábrázolása végett kerül sor a paint() metódus meghívására.Ez végzi a rajzolási feladatokat  stop() - A start() metódus ellenpárja a stop() metódus, ami akkor hívódik meg, amikor az applet már nem látható.  destroy() Az init() metódus ellenpárja a destroy() metódus, ami az applet elhagyásakor hívódik meg. 5 4 Adatok, operátorok A programban használt változók kezelésével kapcsolatos lépések: 1. A változókat deklarálni kell, ami egyrészt szükséges ahhoz, hogy a fordító megfelelően tudja kezelni a változók memóriaterületét, másrészt ahhoz, hogy a megadott nevet a változó azonosításához szükséges változónévnek használja. A változódeklaráció a program tetszőleges helyén lehet. 2. A változókat inicializálni kell, ami a változók kezdeti értékadását jelenti Ez általában a deklaráció során, vagy közvetlenül utána történik. 3.

A változó használata, vagyis a változó értékének kiolvasása illetve megváltoztatása a megfelelő utasításokkal lehetséges. 4.1 Az egyszerű adattípusok Egyszerű adattípusok Adattípus Leírás boolean boole-algebrai érték char betűk, jelek byte egész szám short egész szám int egész szám long egész szám float double lebegőpontos szám lebegőpontos szám Értéktartomány true, false Unicod-érték -128.+128 -32768.+32767 -2.147483648+2147483647 -9.223372036854775808 +9.223372036854775808 -3,40282347E+38.+3,40282347E+38 -1,7976931348623157E+308. +1,7976931348623157E+308. Az adattípus rögzítése megadja, hogy mekkora memóriaterületet kell lefoglalni a számára. 4.2 Összetett adatszerkezetek: Tömbök: A Java nyelvben [] jellel lehet tömböt megadni, a [] lehet a tömb azonosító ( int k[];) vagy az alaptípus után is (int[] k;). A tömb indexelése 0-val kezdődik A tömböt new() operátorral lehet létrehozni: (Például int k[]=new int[10]

10 elemű tömb létrehozása). A tömb ismeri, saját méretét, és ezt le is lehet kérdezni a program futása közben a length mező segítségével (Például k.length) Ha a programban megpróbálunk olyan elemre hivatkozni, amely már nem létezik, akkor ezt a futtató rendszer észreveszi, és egy futás közbeni hiba váltódik ki. Eredendően a Java nyelvben nincs többdimenziós tömb, de létrehozhatunk többdimenziós tömböt úgy, hogy készítünk egy egydimenziós tömböt (vektor), aminek az elemei is vektorok, akár különféle elemszámú vektorok is lehetnek. Létezik még a String típus, amely tulajdonképpen egy osztály, ezt később ismertetjük. Bonyolultabb adatszerkezetek megvalósítását is támogatja a Java, például a verem adatszerkezet létrehozását és kezelését, és ehhez metódusokat is biztosít. 4.3 Konstansok 6 A változóknál lehetőség van a változó értékének megváltoztatására. Azonban van lehetőség olyan adat

használatára, aminek az értékét nem lehet megváltoztatni. Ezek a konstansok. Előállításukra két mód van: 1. A konstanst azonnal konkrét értékkel ruházzuk fel, ilyenkor úgynevezett literálokról beszélünk. tort szam=26.12; Ha egy literál nincs konkrét adattípushoz rendelve, a fordítónak a literál szintaxisából kell kikövetkeztetnie annak adattípusát. 2. Amikor egy változót a final kulcsszóval deklaráljuk: final double tort szam=33.14 Literálok Adattípus Boolean Char char (különleges jelek) pl soremelés char (Unicode) string byte, short, sint long oktális hexadecimális float double Literál true, false ‘c’, ‘Ü’ ‘ ’ ‘u1234’ „Ez egy string” 12, -128 12L, 1400000 077 OxFF 47,11F, 12F, 10e-2F 47.11, 12F, 10e-2 Az alábbi táblázatban összefoglaltuk a Javaban használható főbb műveleteket. 4.4 Operátorok A fontosabb operátorok Operátor ++ -! */ % -+ <= <> >= = = != && || & | Leírás Növelés,

csökkentés logikai NEM szorzás, osztás moduloosztás (egész osztás) kivonás, összeadás összehasonlítás összehasonlítás (egyenlő/nem egyenlő) logikai ÉS logikai VAGY bitszintű ÉS bitszintű VAGY 5 Vezérlési struktúrák Egy programozónak minden nagyobb program írásakor szinte biztos, hogy meg kell oldania a következő két feladatot: 7  Feltételek vizsgálata (ha teljesül a feltétel, akkor A esemény történjen meg, ha nem teljesül, akkor B esemény.  Bizonyos utasítások többszöri végrehajtása. Ezen problémák megoldására a többi nyelvhez hasonlóan a Java is biztosít bizonyos szerkezeteket. 5.1 Feltételes szerkezetek: if-else, switch A feltételes programvégrehajtásra használható szerkezet: if(feltétel) { //ha a feltétel igaz utasítás(ok); } else { //ha a feltétel hamis utasítás(ok); } Ha nincs szükségünk rá, akkor az else rész el is maradhat. A feltétel logikai értéket jelent. Értéke lehet True vagy false

Ezért vagy boolean típusú változót használunk, vagy egy logikai kifejezést, amihez a fordító egy logikai értéket rendel a kiértékelés során. Van olyan eset, amikor egy változó, több értékkel történő összehasonlítása során dől el, hogy a program milyen utasítással folytatódik. Ez esetben használható a switch utasítás: char x; x=’B’; switch(x) { case ’A’:utasítások 1; break; case ’B’:utasítások 2; break; case ’C’:utasítások 3; break; default: utasítások ha egyik se; break; } A switch megkapja a vizsgálandó változó argumentumát, amit azután a case értékekkel összehasonlít. Ha egyezést talál, akkor a megfelelő utasítások végrehajtásra kerülnek Abban az esetben, ha az egyik case sem felel meg, akkor a default címkénél található utasítások végrehajtása kezdődik meg. A switch utasítás végrehajtásánál elkezdődik a caseek vizsgálata Ahol egyezést talál, ott elkezdődik az utasítások végrehajtása

(Ha nem talál, akkor a default-nál) továbbá a találatot követő összes case utasítása végrehajtódik. Ha valahol ki szeretnénk lépni a switch utasításból (ez gyakori), akkor ott el kell helyeznünk egy break utasítást. 5.2 A ciklus utasítások 8 A for ciklusok fejrésze három, egymástól pontosvesszővel elválasztott részre osztható. Az első részben a ciklusváltozóhoz hozzárendeljük a kezdeti értéket, a második részben megadjuk a kilépési feltételt, a harmadik részben pedig a ciklusváltozót léptető utasítást adjuk meg. A fejrész után található a ciklus törzse, ami az utasításokat tartalmazza Egy egyszerű példa: int i; for(i=0;i<10;i++) { utasítások; } A while ciklus elöltesztelős ciklus, a while kulcsszó után megadjuk az ismétlés feltételét. A zárójelben egy logikai kifejezés áll, ami lehet önmagában egy logikai típusú változó, vagy lehet egy adat, akár egy ciklusváltozó vizsgálata is. Pl. int i=0;

while(i<10) { utasítások; i++; } do-while: hátultesztelős ciklus, amely a do utáni blokkban levő utasításokat ismétli, a while után pedig a kilépés feltétele áll, amely egy logikai kifejezés. Pl. int i=0; do{ utasítások; i++; }while(i<5) Lehetőség van a break és a continue utasításokkal a ciklusból való kilépésre, valamint a ciklus újrakezdésére. 6 Objektumok Az előző feladatok programjait jelenlegi tudásunkkal is meg tudjuk már írni. Szeretnénk azonban ezeknél szebben tagolt áttekinthető programot is írni. Ehhez viszont meg kell ismerkedni kicsit részletesebben az objektumokkal. A Javaban az egyszerű adattípusok mellett léteznek komplex típusok, az osztályok. Az osztály több elemet egyesíthet (változók, metódusok). Ez az úgynevezett egységbezárás, mellyel megadható, hogy az osztály, az egyes adatelemekkel milyen műveleteket végezhet és az is megadható, hogy a változókhoz honnan lehessen hozzáférni. Egy osztály

egy típus Ebből példányosítás útján hozható létre egy konkrét objektum, ami már nem egy elvi leírást tartalmaz, hanem a programban ténylegesen felhasználható értékkel is rendelkező adatokat és metódusokat. Egy osztály, adatait és metódusait örökölheti egy másik osztálytól. Öröklődéskor az alaposztály összes metódusa és adateleme megtalálható a származtatott osztályban. A származtatott osztályban az örökölt elemek mellé, saját adatelemek és metódusok is 9 definiálhatók, sőt, az örökölt metódusokat is felül lehet írni, vagyis ugyanolyan névvel kétféle metódus is létezhet. Ez az úgynevezett polimorfizmus A Java nem támogatja a többszörös öröklődést, azaz minden osztálynak csak egy szülője van, de biztosít úgynevezett interfészeket és adaptereket, melyek segítségével egy osztály, több különböző osztálytól örökölhet adatelemet és metódust. A már megírt osztályokat, nem szükséges minden

programban leírni, ahol használni akarjuk őket. A több programban használni kívánt osztályt fel kell venni egy csomagba, és az osztály class állományát, egy ismert könyvtárban kell elhelyezni. Ezután importálható az osztály Az első lépés egy objektumorientált program előállítása során az, hogy a problémákat objektumokra bontsuk szét, rögzítsük azok tulajdonságait és viselkedésmódját, valamint meghatározzuk az őket alkotó adatelemeket és metódusokat. 6.1 Osztály létrehozása Egy új osztály létrehozására a class kulcsszóval bevezetett szerkezet használható: class osztalynev { . } Az osztályon belül lehetnek változók és metódusok. Azokat a változókat, amelyeket az osztályon belül, de az osztály összes metódusán kívül deklarálunk, példányváltozónak nevezzük, és az osztály összes metódusa hozzáfér. Létezik egy speciális példányváltozó, melynek neve this. Ezt a példányváltozót a számítógép

automatikusan hozza létre, és mindig az éppen használt osztály aktuális példányára mutat. Egy osztály metódusa különböző adatokkal dolgozhat. Egyrészt saját, lokális változóival, másrészt azon osztály példányváltozóival, amelyben definiálva lett. Ezen kívül még azokkal az adatokkal dolgozhat, melyeket paraméterátadás útján kap meg a metódus a meghívásakor, vagy azokkal, amelyeket egy másik metódus meghívásakor megkap, mint visszaadott értéket. 6.2 Osztály példányosítása A class kulcsszóval létrehozott osztályunk tulajdonképpen egy új típus. Hasonlóan az egyszerű adattípusokhoz, itt is először deklarálni kell az adattípusnak megfelelő változót és a változókat kezdőértékkel kell ellátni A metódusok között van egy különleges metódus, melynek neve megegyezik az osztály nevével. Ez az úgynevezett konstruktor Ez látja el az osztályból készített objektumot kezdőértékekkel. Minden osztálynak kell, hogy

legyen legalább egy konstruktora, hogy a példányváltozóit inicializálni tudja. Ha nem gondoskodunk a konstruktorról, akkor a fordító egy standard-konstruktort rendel az adott osztályhoz. A deklarálás után, vagy azzal egy időben lehet példányosítani az osztályt, ekkor keletkezik az objektum. Erre a new utasítás használható A new kulcsszó hatására meghívódik az osztály konstruktora, aminek átadásra kerül(nek) az általa igényelt paraméter(ek). Egy egyszerű adattípusú változó létrehozása esetén (pl.: int szam=4;) a fordító a szam nevet egy meghatározott memóriaterülethez rendeli. Egyidejűleg inicializálja is a változót a 4 értékkel, vagyis a 4 érték közvetlenül a szam változó tárterületére íródik be. Ha egy osztályt példányosítunk (pl Random r=new Random(); akkor a változó (r) a példányt tároló memóriaterület címét fogja tartalmazni. 6.3 Objektum adatainak, metódusainak elérése 10 Egy példány

változójának(mezőnek is szoktuk nevezni), illetve metódusának eléréséhez meg kell adni a példány illetve az elérni kívánt metódus (vagy változó) nevét, köztük pedig a pont-operátornak („.”) kell szerepelnie Pl. rnextFloat(); // az r objektum metódusát hívjuk Az előbbiek alapján, már meg tudjuk írni metódusokra tagoltan is a következő feladatokat. 7 Öröklődés Az osztályok képesek adatelemeiket (tulajdonságaikat) és metódusaikat más osztályok számára továbbörökíteni. Ez az úgynevezett öröklődés vagy származtatás Azt az osztályt, amely az elemeit örökíti, alaposztálynak, valamint amely az alaposztály elemeit örökli, származtatott osztálynak nevezzük. Az öröklődés négy legfontosabb eleme:     A származtatás. Ez a származtatott osztály deklarációját és az alaposztály megadását jelenti. A származtatáshoz az extends kulcsszót használjuk Ilyenkor a származtatott osztály az alaposztály

minden adatelemét és metódusát örökli, tehát rendelkezésére áll. Pl. public static class peldaprogram extends javaappletApplet Appletjeinket mindig a java.appletApplet osztályból származtajuk, amely lehetővé teszi a grafikus felületen a böngészőben való megjelenítést. Saját adatelemek és metódusok definiálása. Tehát a származtatott osztálynak az örökölt adatelemeken és metódusokon túl, lehet saját adateleme és metódusa. Az örökölt metódusok felülírása azt jelenti, hogy a származtatott osztályban létrehozunk egy ugyanolyan nevű metódust mint amilyen az alaposztályban is létezik. Ezt nevezzük polimorfizmusnak Egy örökölt metódus felüldefiniálásánál a metódus címkéinek (visszaadott érték, név, paraméterek) teljes mértékben meg kell egyeznie az alaposztály metódusának címkéivel. Az átdefiniált metódusok meghívása. Lehetőség van az alaposztály egy felüldefiniált metódusának elérésére, melyhez a super

kulcsszó használható. A super kulcsszó egy fontos használata az alaposztály konstruktorának meghívása, ami az örökölt elemek kezdeti értékkel való ellátásáért felelős. Az öröklődésnél ügyelni kell az alaposztályok tervezésénél arra, hogy a felhasznált elemek köre a legszükségesebbekre korlátozódjon, ezzel elkerülendő a származtatott osztályok haszontalan dolgokkal való terhelése. Lehetőség van a final kulcsszóval változók, metódusok és osztályok konstanssá tételére. Változó esetében ez azt jelenti, hogy a program további részében a változó értéke már nem változhat. Osztály esetében azt jeleni, hogy az adott osztályból nem lehet semmit származtatni. Ez egyrészt gyorsabban futó bájtkódot eredményezhet, másrészt biztonságosabb lesz a program, ugyanis a hackerek sok esetben az öröklődést kihasználva játsszák ki a Java biztonsági rendszerét. A konstans metódus jelentősége pedig abban áll, hogy egy

alaposztály konstans (final) metódusát a származtatott osztály nem írhatja felül. De vannak esetek, amikor éppen az a cél, hogy felülírják a származtatott osztályban valamely metódust. Ekkor az abstract kulcsszó használható Tehát ha az alaposztály 11 valamely metódusa abstract, akkor a származtatott osztályban felül kell definiálni ezt a metódust. A Javaban a metódusok lokális változóin és a példányváltozókon kívül, a változók harmadik típusa is használt, nevezetesen az osztályváltozó. Egy osztályváltozót a static kulcsszóval kell definiálni. Egy osztály osztályváltozója csak egyetlen példányban létezik, függetlenül attól, hogy hány példányt képezünk az osztályból. Az osztályváltozók jól használhatóak osztályok példányainak számolására. A statikus változókon (osztályváltozó) kívül, léteznek statikus metódusok is. Ha egy metódus static típusú, akkor hozzáférhetünk akkor is, ha az

osztálynak, amiben definiálva lett nincs egyetlen példánya sem. Ezért kell a main() függvényt static-nak definiálni, hisz a program végrehajtása a main() függvénnyel indul, és amikor a program indul, egy osztálynak sem lehet még példánya. A Javaban létezik egy szemétgyűjtő mechanizmus. Ennek köszönhetően egy objektum megszüntetésével nem kell a programozónak foglalkoznia, mert azt a Java memóriafelszabadító programja (garabage-collector) automatikusan elvégzi. Egy objektum megszűnésekor végrehajtandó utasításokat a finalize() metódusban lehet megadni. E metódus meghívásának pillanata nem pontosan definiált, de az biztos, hogy még az objektum tárterületének újrafelhasználása előtt meghívódik. 7.1 A módosítók A módosítókat osztály, mező, vagy metódus definíciójánál használhatjuk a típus megnevezése előtt. (pl public static void main()) Jelentésük a következő: abstract: Absztrakt egy metódus, ha csak a fejrésze

van megadva, mert a programírásnak azon a pontján nem lehet a benne található műveleteket pontosan megadni, hiszen ezeket esetleg több osztály is többféleképpen fel akarja majd használni. Egy osztály akkor abstract, ha tartalmaz abstract metódust. final: Végleges egy osztály, ha nem lehet belőle további osztályt származtatni.Végleges egy metódus , ha nem lehet felülírni( nincs polimorfizmus), végleges egy mező, ha nem lehet az értékét módosítani. public: Nyilvános egy mező, vagy osztály, vagy metódus, ha másik csomagból is lehet használni. private: Egyedi egy metódus vagy egy mező, ha csak a saját osztályán belül látható. protected: Védett egy mező vagy egy metódus, ha csak a saját osztályában és az abból származtatott osztályokban látható. static: Állandó a mező, vagy a metódus, ha az osztály összes objektumára állandó, nem példányosítható. A statikus mezőket osztályváltozónak is nevezik Természetesen a

statikus mezők, metódusok nem használhatják a this kulcsszót. 12 Összefoglaló táblázat a módosítószók használatához: Osztályok Metódusok Mezők abstract abstract public public public private private protected protected final final final static static static Szó jelentése elvonr nyilvános egyedi védett végleges állandó 8 Kivételkezelés Minden program futása során léphet fel hiba, melynek hatására a program nem tudja folytatni a normális működését, ezért a hibát kezelni kell. Ez a kezelés két dolgot jelenthet:  A hiba fellépése után a programot olyan állapotba kell hozni, hogy tudja folytatni a működését.  Ha nem oldható meg, hogy a program a hiba fellépése után tudja folytatni a működését, akkor a néhány dolgot végre kell hajtani a „tisztességes” befejezés érdekében. A Java nyelv hibakezelése a kivételkezelésen alapszik. A Java kivételkezelésének célja a futás közben fellépő hibák kezelése.

Ezeket a futás közben fellépő hibákat a Java exception-nek, vagyis kivételnek nevezi. Ezek olyan kivételes események, melyek a program futása közben megszakítják az utasítások végrehajtásának normális menetét, tehát a program futása kivételes módon folytatódik. Erről gondoskodik a kivételkezelés A kivételek kezelése a Java nyelvben az osztályokon alapul. Ez hibatípustól függő feldolgozást tesz lehetővé. Ha egy metódus futása közben valamilyen hiba lép fel, akkor a metódus kivált egy kivételt (throwing exception) és létrejön egy kivételobjektum, mely információkat tartalmaz a kivétel fajtájáról és a program aktuális állapotáról. Ezután a létrejött kivételobjektum a Java-futtató környezet felügyelete alá kerül. Kivétel három féle módon keletkezhet:  Valamilyen rendellenes dolog történik a program futása közben. Pl: 0val való osztás, erőforrás elfogyása, stb  A programban található throw utasítás

vált ki kivételt. Ez történhet a Java könyvtár valamelyik csomagjában, vagy a programozó által írt kódban.  Felléphet aszinkron kivétel. Ez több szálon futó program valamelyik szálának megszakadását jelenti. Kivétel az utóbbi két módon a programnak csak egy meghatározott helyén, míg az első módon a program tetszőleges pontján váltódhat ki. Miután egy kivétel kiváltódik, a Java Virtuális Gép megkeresi a programban azt a kivételkezelő kódblokkot, amely képes kezelni a keletkezett kivételt, vagyis amelyik képes elkapni. A kivételkezelő kódblokkok közül az alkalmas a kivétel kezelésére, amely megfelelő típusú, és amelynek hatáskörében keletkezett a kivétel. Akkor megfelelő egy kivételkezelő típusa egy bizonyos kivétel kezelésére, ha a kezelő által kezelt típus megegyezik a kivétel típusával, vagy őse annak az osztályhierarchiában. A kivételkezelő hatókörét maga a kivételkezelő határozza meg, és ha a

hibát okozó kód a kivételkezelő által kijelölt tartományban van, akkor úgy mondjuk, hogy a hibakezelő láthatósági 13 tartományában van, és ekkor a hibakezelő hatáskörébe tartozik. A kivételkezelő blokkok egymásba ágyazhatók, ezért sokszor előfordul, hogy a kivétel elkapására több megfelelő kivételkezelő is létezik. A több megfelelő közül kell kiválasztani azt, amely valójában elkapja a kivételt. A több megfelelő közül való választáskor a Java Virtuális Gép kifelé halad a végrehajtás szerint egymásba ágyazott blokkokból, egészen addig, míg egy megfelelőhöz nem ér. Ekkor a keresés befejeződik, és a kivételt elkapja a kiválasztott kivételkezelő, ami ezután megkapja a vezérlést. Miközben a Virtuális Gép keresi a megfelelő kivételkezelőt, el kell hogy végezzen bizonyos műveleteket. Erre azért van szükség, mert bizonyos tevékenységek elkezdődhettek a kivétel keletkezése előtt, de nem tudtak

befejeződni éppen a hiba miatt. Ilyen tevékenységek például a metódushívások és az inicializálás. Például amikor a Virtuális Gép kilép egy metódusból, akkor megszünteti annak lokális változóit, láthatósági körét és a hívásra utaló bejegyzéseket. Miután a kivétel kezelése megtörtént, a program futása abban a metódusban fog folytatódni, ahol a kivételkezelő szerepel, méghozzá oly módon, hogy a programvégrehajtás a kivételkezelő kódja utáni első utasításra kerül. Előfordulhat, hogy a kivételkezelés közben lép fel hiba. Ebben az esetben az eredeti kivételkezelés megszakad, és az éppen bekövetkezett kivételhez próbál keresni a Virtuális Gép egy, a kivétel kezelésére alkalmas kivételkezelőt. A kivételkezelés közben keletkezett kivételhez ugyanolyan módon keres a Virtuális Gép kivételkezelőt, mint bármely más, kivételkezelő blokkon kívül keletkezett kivételhez. Előfordulhat az az eset, hogy a

Virtuális Gép nem talál a kivétel kezelésére alkalmas kivételkezelőt. Ha ez az eset áll fenn, és a program egy szálon futó, akkor a Virtuális Gép és így a program is terminál. A kivételek egyik legfontosabb tulajdonsága, mely alapján két csoportra oszthatók, hogy ellenőrzöttek-e vagy sem. Az ellenőrzött kivételeket mindig el kell kapni, vagy specifikálni kell azokat. Ha egy program nem úgy van megírva, hogy nem kapja el, vagy nem specifikálja az ellenőrzött kivételeket, akkor a Java fordító hibát jelez. Akkor is hibát jelez a fordító, ha olyan ellenőrzött kivételt akarunk elkapni, ami nem keletkezhet az adott tartományban. Az ellenőrzött kivételek esetében azért ilyen szigorú a fordító (hibát jelez, és nem fordítja le a fájlt), mert ezen kivételek figyelmen kívül hagyása a program megbízhatóságát rontaná. A fordító szigorúsága rákényszeríti a programozót a hibalehetőségek figyelésére, és biztonságos program

írására. Az ellenőrzött kivételek mellett, léteznek a Java nyelvben a nem ellenőrzött kivételek. Ezek azok a kivételek, amelyeket nem kell elkapni. Az, hogy vannak olyan kivételek, amiket nem kötelező elkapni, ellentmondani látszik a megbízhatósági követelménynek. Két dolog van, amiért a Java mégis megengedi ezeknek a nem ellenőrzött kivételeknek a használatát. Egyrészt sok olyan hiba van, ami bekövetkezhet a programnak szinte bármely helyén, és kezelése nem oldható meg a Java nyelv keretein belül, vagy ha megoldható is, a programnak irreálisan sok helyén kellene gondoskodni a kivételek elkapásáról vagy specifikálásáról. Másrészt a nem ellenőrzött kivételek kiváltása, vagy fizikai korlátokból adódó problémára vagy programozási hibára vezethető vissza. Például tömbindex túllépése Az ilyen jellegű hibák a program átírásával többnyire megszüntethetők. 8.1 A kivételkezelés megvalósítása Kivételt a

Virtuális Gép vagy a program egy metódusa válthat ki. A kivételt kiváltó metódus lehet a programozó által írt kódban, vagy a Java környezethez tartozó csomagokban. Függetlenül a kivételek keletkezésének helyétől, a kivételeket vagy a Virtuális Gép generálja, vagy a throw utasítás felhasználásával jönnek létre. A throw utasítás által kiváltott kivételek elkapásához a Java utasításokat try blokkba kell írni. A 14 program, kivételkezelés szempontjából a try blokkban lévő utasításokat figyeli. A try blokk vezérli a benne keletkező kivételek kezelését, valamint meghatározza a blokkot követő catch ágak és finally ág érvényességét. A try blokk után kell következnie a vele összetartozó catch vagy finally blokknak úgy, hogy köztük nem lehet más nyelvi elem. Egy try blokkhoz több catch is tartozhat. Egy egyszerű példa: try { /*Java utasítások/ } catch(típus1 változónév1) { /*Java utasítások/ } catch(típus2

változónév2) { /*Java utasítások/ } catch(típus3 változónév3) { /*Java utasítások/ } Minden catch blokk deklarál egy formális paramétert, mely paraméter meghatározza, hogy a blokk milyen típusú kivételek kezelésére alkalmas, tehát hogy a kiváltott kivételek közül melyiket képes elkapni. Mindegyik catch blokk, a típusának megfelelő, az előtte lévő try blokkban kiváltódott kivételt tudja kezelni. A catch blokkok után megadható egy finally blokk, mely a try blokk befejeződése után lefut függetlenül attól, hogy a következő három eset közül melyik valósul meg:  Nem váltódik ki kivétel, és így a futás nem érint egyetlen catch ágat sem.  Kivétel lép fel, és a program valamelyik catch ágon halad át.  Kivétel lép fel, de a fellépő kivételt egyik catch ág sem tudja elkapni, mert a típusuk nem megfelelő. A vezérlés a hívó metódus kódjához jut 8.2 Kivétel specifikálása A Javaban lehetőség van arra, hogy

egy metódusban nem kezelünk le egy ellenőrzött kivételt, hanem a metódus hívójára hagyjuk azt. Ekkor a metódus fejében specifikálni kell az összes olyan ellenőrzött kivételt, ami a metódus láthatósági körében kiváltódhat, és nem kap el. Ezen el nem kapott kivételeket a metódus deklarációjában, a formális paraméterek után a throws kulcsszóval kell megadni. A kivétel specifikálás eredményeképpen, a metódusban el nem kapott kivételnek a Virtuális Gép, egy szinttel feljebb keres a kivétel kezelésére alkalmas catch blokkot. Ha ott sem talál, akkor tovább keres még egy szinttel feljebb. Így a kivétel eljut oda, ahol azt kezelni lehet 8.3 Kivételosztályok az osztályhierarchiában Mivel a Java objektumorientált nyelv, ezért a kivételkezelésnek is illeszkednie kell ebbe a struktúrába. Ezért minden kivételfajtát egy osztály reprezentál, ami csak abban 15 különbözik a közönséges osztálytól, hogy a kivételkezelésben

használható. Ezen osztályok példányai reprezentálják az éppen fellépő kivételeket. A hiba fajtájáról az osztályhierarchiabeli helye árulkodik. Az azonos típusú hibák egy részfát alkotnak, és az egymástól eltérő hibák a hierarchiában is távol kerülnek egymástól. Így a különböző hibák kezelése nem mosódik össze, és nem fordulhat elő olyan eset, hogy eltérő kezelést igénylő kivételek véletlenül azonos hibakódot kapjanak, hisz a hiba kódja igazából az osztályának a neve. A kivételek kezeléséhez a legmagasabb szintű osztály a java.langThrowable, amely kiváltható. Ez azt jelenti, hogy ennek az osztálynak a példányai és leszármazottjainak példányai a throw utasítással kivételként kiválthatók. Ezen kívül más objektum nem váltható ki. A Throwable-nek két gyermekosztálya van, a javalangException és a java.langError A javalangError akkor lép fel, ha valami komoly, rendszerszintű hiba lép fel (pl.: elfogyott a

memória) Ez viszonylag ritkán fordul elő, de a program bármely részén előfordulhat, és ha előfordul, akkor az általában olyan súlyos, hogy a Java program nem tudja lekezelni. Ezért az Error és utódai a nem ellenőrzött kivételosztályok közé tartoznak. A java.langException-t olyan esetben használja a Virtuális Gép, amikor valami olyan hiba lép fel, amit a Java keretein belül le lehet kezelni. Az Exception-nek sok leszármazottja van. Ezen leszármazottak, a Java környezet csomagjaiban vannak definiálva. Az Exception egyik fontos gyermekosztálya a RuntimeException, mely a futási idejű kivételeket jelenti, és leszármazottaival együtt nem ellenőrzött kivételek. Az Exception osztálynak a RuntimeException-ön kívüli leszármazottjai mind ellenőrzött kivételek. 9 Adat be- és kivitel Minden programnak tudnia kell kommunikálnia a külvilággal. A Java erre három lehetőséget biztosít:  billentyűzeten és képernyőn keresztül  a

háttértároló állományain keresztül  Interneten keresztül (WWW oldalak) A Java be- és kiviteli alapelve a stream (adatfolyam) koncepción alapul. Ez azt jelenti, hogy egy kommunikációs csatorna, egy adatfolyam van az adó és a vevő között. A Java sok stream osztályt tartalmaz, melyek közül az adó illetve a vevő fajtájtól függően választhatunk. Az adatáramlás irányának meghatározásához a programunk szemszögéből nézzük a dolgokat, így a billentyűzet adatáramát bemeneti adatfolyamnak, a képernyő adatáramát kimeneti adatfolyamnak tekintjük. A Javaban éppúgy, mint más programozási nyelvekben, az adatfolyamokat előre definiált streamek biztosítják. A képernyős megjelenítésért a System.out felelős, ezért ezt standard kimenetnek nevezik A billentyűzetről jövő bemeneti stream kezeléséért a System.in felelős, ezért standard bemenetnek nevezik. 9.1 Képernyős megjelenítés Egy egyszerű, de többnyire kielégítő

lehetőség, a System.outprintln() metódus használata, ahol a metódusnak át kell adni argumentumként, a kiíratni kívánt szöveget vagy változót. Létezik több más metódust is, amivel különböző adattípusú értékeket küldhetünk a kimenetre (Pl.: print(), write()) 16 A JDK 1.1-es verziójánál megjelentek az úgynevezett writer-ek , amik a képernyős szövegmegjelenítést és a fájlok kezelését támogató osztályok. Ahhoz, hogy a programunkban writer-eket használhassunk, a java.io csomagot kell importálni(import java.io*) A képernyős megjelenítést szolgáló writer a PrintWriter. Használatának lépései: 1. Egy PrintWriter objektum létrehozásakor, át kell a konstruktornak adni a Systemout standard kimenetet. 2. Egy writer legfontosabb metódusai a println() illetve a print() 3. Ha már nincs szükségünk a kimeneti objektumra, akkor le kell zárni a close() metódussal. A writer-ek (jelen esetben a PrintWriter) előnye abban áll az

egyszerűbb System.outprintln()-hez képest, hogy így bármely adatfolyamba (éppúgy képernyőre, mint fájlba) szinte ugyanolyan utasítássorozattal írhatunk adatokat. Egy egyszerű példa: PrintWriter kiiratas=new PrintWriter(System.out);// Kiviteli adatfolyamhoz a képernyőt rendeljük kiiras.println(”Ez egy szovegkiiratas!”); kiiratas.close();//objektum megszüntetése Az eredmény a képernyőn: Ez egy szovegkiiratas! 9.2 Fájlba írás A fájlba írás hasonló módon történik a writer-ek segítségével, mint a képernyőre írás (pont ez a writer-ek lényege). Az egyetlen nagy különbség, hogy fájlba írásnál elő kell állítani egy kimeneti streamet, míg képernyőre írásnál a System.out használható A fájlba írás a következő fő lépésekre bontható: 1. Létre kell hozni egy File objektumot, és a konstruktorának át kell adni a használni kívánt fájl nevét. 2. Létre kell hozni a tulajdonképpeni kimeneti streamet Ez a FileWriter egy

példánya, a konstruktorának a már előállított File objektumot kell átadni. 3. A PrinterWriter adatkiviteli objektum létrehozása A konstruktorának a kimeneti streamet kell átadni. 4. A PrinterWriter objektumot felhasználva tudunk a fájlba írni Egy egyszerű példa: File fajl=new File (”fajlneve.txt”); // a fajl nev és a változónév öszekapcsolása FileWriter a kimeneti stream=new FileWriter(fajl); // kimeneti adatfolyam létrehozása PrintWriter fajlbairas=new PrintWriter(a kimeneti stream);//kiviteli objektum létrehozása fajlbairas.println(”Ez kerul a fajlba!”); fajlbairas.close();// objektum megszüntetése 17 Ennek az egyszerű példának az eredményeképpen, a „fajlneve.txt” fájlba az „Ez kerul a fajlba!” szöveg kerül. A FileWriter osztály, a PrintWriter felé történő közvetítői szerepe mellett, önállóan is alkalmazható, de metódusai kezdetlegesebbek a fent említetteknél, és használatuk kevésbé kényelmes. A képernyős

megjelenítésre illetve a fájlba írásra több osztályt is biztosít a Java, de a leggyakrabban használtak a fent említett osztályok. 9.3 Olvasás a billentyűzetről A legegyszerűbb adat beolvasás a standard inputról, vagyis a billentyűzetről történő beolvasás. A bemenethez a Systemin osztály szolgál Ennek egyik metódusa a System.inread(azonosító), amely segítségével jeleket olvashatunk a billentyűzetről Mivel az adatbevitel a programhasználatnál az egyik legbizonytalanabb művelet, ezért az adatbevitelnél a Java nagyon szigorúan megköveteli, hogy a fellépő beviteli hibákat lekezeljük. A következő példában 1 byte-ot olvasunk be a billentyűzetről és azt szöveggé, valamint számmá alakítva írjuk ki a képernyőre: public class Inputproba{ public static void main(String par[]){ byte be[]={0}; try {System.inread(be);} catch (java.ioIOException e){} String kis = new String (be,0,1); // bytesorozatot string-gé alakítja

System.outprintln(kis); Int szam; szam=0; try {szam=Integer.parseInt(kis);}// számmá alakít catch (NumberFormatException f) {} System.outprintln(" "+szam+" "); }} Ha több számjegyű számot szeretnénk olvasni a billentyűzetről, akkor a program egy kissé módosul, mivel meg kell állapítani azt, hogy ténylegesen hány számjegy került be a tömbbe. Vagy teleírjuk a tömböt számjegyekkel, vagy belekerül az enter karakterkódja is, természetesen csak az ez előtti bytokat van értelme felhasználni. public class Inputproba{ public static void main(String par[]){ byte be[]={0,0,0,0}; try {System.inread(be);} catch (java.ioIOException e){} int i=0; while ((i<=3)&&(be[i]!=13)) // megkeressük az enter jelet i++; String kis = new String (be,0,i); System.outprintln(kis); int szam; szam=0; try {szam=Integer.parseInt(kis);} catch (NumberFormatException f) {} System.outprintln(" "+szam+" "); }} 18 9.4 Fájlból olvasás A

fájlból való olvasás hasonló módon történik, mint a billentyűzetről való, csak ebben az esetben gondoskodni kell az olvasandó fájl és a bemeneti stream összekapcsolásáról. A fájlból olvasás főbb lépései: 1. Létre kell hozni egy File objektumot, és a konstruktorának át kell adni, a használni kívánt fájl nevét. 2. Létre kell hozni a tulajdonképpeni bemeneti streamet Ez a FileReader egy példánya, a konstruktorának a már előállított File objektumot kell átadni. 3. A BufferedReader adatbeviteli objektum létrehozása A konstruktorának a bemeneti streamet kell átadni. 4. A BufferedReader objektumot felhasználva tudunk a fájlból olvasni A fentiek bemutatása: File fajl=new File(”fajlneve.txt”); FileReader a bemenetii stream=new FileReader(fajl); BufferedReader fajlbololvasas=new BufferedReader(a bemeneti stream); A FileReader osztály, a FileWriter osztályhoz hasonlóan egyrészt közvetítő szerepet tölt be, másrészt önállóan is

alkalmazható. 19 10 Abstract Window Toolkit Az Abstract Window Toolkit (továbbiakban AWT) az a része a Javanak, amely lehetőséget biztosít a felhasználói felületek (Graphical User Interface - GUI) előállítására. Az AWT tulajdonképpen különböző osztályok gyűjteménye (java.awt) Ezen gyűjtemény sok száz osztályt és metódust biztosít, melyekből építőkockaszerűen állíthatjuk össze a felhasználói felületet, és határozhatjuk meg annak működését. Az AWT-vel történő programozás tulajdonképpen osztályok származtatásából és az osztály metódusainak felülírásából áll. Grafikus programok kialakításához a következő elemek állnak rendelkezésre:  Komponensek (components): Ezek tulajdonképpen a windows-programok tipikus komponensei, úgymint a gombok, jelölőnégyzetek, a görgetősáv, stb.  Tárolóelemek (containers): A tárolóelemek olyan speciális komponensek, amelyek más komponenseket tartalmazhatnak, ezáltal

a felületelemek csoportosítására, illetve a felület struktúrált felosztására használhatók.  Elrendezéskezelők (layout-managers): Az elrendezéskezelők olyan osztályok, melyek segítségével a komponensek elhelyezkedését és eligazítását szabályozhatjuk.  Vászon (canvas): A vászon olyan komponens, amely festésre, illetve képek és grafikák megjelenítésére használatos.  Eseményfigyelők (event-listeners): Olyan speciális osztályok, melyek segítségével megvalósítható az eseménykezelés. 10.1 Egyszerű ábrák készítése   Applet készítése: ekkor a program osztályát a java.appletApplet osztálytól származtatjuk, nyugodtan használhatunk különféle rajzolómetódusokat, a böngészőprogram az applet indításakor a grafikus felületet biztosítja. Alkalmazás készítése: Ekkor nekünk kell gondoskodni a grafikus felületről. A program osztályát a Frame osztálytól kell leszármaztatni. Indításkor ez egy Windows-os

ablakot ad, amelyhez különféle komponenseket adhatunk, vagy rajzolhatunk is rá. Metódusok Frame beállításához: void setTitle(String) void setBounds(int lx,int ly,int x,int y) A Frame címsorának szövegét állítja A Frame helye( lx, ly) és mérete(x, y) állítható A grafikus programok az ablak beállítása után a Graphics osztály paint metódusával rajzolhatnak, itt kell elhelyezni a különféle grafikus metódusokat. Néhány grafikus metódus: void setColor(Color c) Beállítja a rajzolószínt void setFont(Font f) Beállítja a betűtípust void drawLine(int x1,int y1,int x2, int Vonalat húz x1,y1 pontból x2, y2 y2) pontba void fillRect(int x,int y, int w, int h) Teli téglalapot rajzol, bal felső sarka x,y koordinátájú, w,h a szélessége és a 20 magassága void drawRect Téglalapot rajzol, bal felső sarka x,y koordinátájú, w,h a szélessége és a magassága void drawOval(int x,int y, int w, int h) Ellipszist rajzol, amely az x,y

koordinátájú, w,h a szélességű és a magasságú téglalapba illeszkedik void drawString(String s, int x, int y) Szöveget rajzol ki, amelynek alapvonala x,y koordinátánkezdődik boolean drawImage(Image i, int x, int y, Képet rajzol ki, x,y pozíción, az ImageObserver observer) observer objektum értesítést kap a rajzolás haladásáról Végül a programban a frame objektum egy show metódussal jeleníthető meg. 10.2 Színek beállítása Az előző programban is látható, hogy a java a szín tárolására egy külön osztályt készített, ebből már sejthető, hogy nemcsak a szokásos, angol szóval megnevezhető színeket lehet beállítani. A tapasztalatok szerint az emberi szem több millió szín megkülönböztetésére képes. Számítógéppel többféle elven lehet a színeket modellezni Az RGB színkeverés azon a megfigyelésen alapul, hogy a három alapszín, a piros, a zöld, és a kék különböző arányú összetételével bármilyen szín

előállítható. Ez a monitorok működési elvével is összhangban levő színkeverési rendszer kényelmesen használható, ugyanis pl. 1 byte információt szánunk minden színösszetevő mennyiségének megadására és így igen sok szín előállítható. A javaban az RGB színkeverésnél mindegyik színösszetevő mennyisége 0-255 intervallumban van. Szín beállítás lépései: 1. Color rajzolo; A szín érték kezelésére külön objektum van, a színértéknek szánt változót ilyen típusúra kell deklarálni. 2. rajzolo= new Color(i,255-i,255-i); A változó értékadása a Color objektum segítségével, amelynek három paramétere sorrendben a piros, zöld, kék összetevő mennyisége. 3. Természetesen a már ismertetett setColor metódussal lehet az előállított színt rajzolószínnek beállítani. Egy másik színrendszer sokkal inkább az emberi szem színérzete alapján működik, kevésbé a monitorok működési elve szerint. E szerint a színnek

három fontos tulajdonsága van. A színezet (hue), ez a hétköznapi értelemben vett szín (kék, lila stb), amely tulajdonképpen a fény hullámhosszától függ. A telítettség (saturation) attól függ hogy a szín mennyi fehér összetevőt tartalmaz. A világosság (intensity) a fényenergia mennyiségétől függ. A java ezt a színrendszert is képes kezelni azáltal, hogy a színeket az RGB rendszerbe átalakítja. 10.3 Az AWT eseménymodellje A GUI programok idejük legnagyobb részét a felhasználóra való várakozással töltik. A program általában arra vár, hogy a felhasználó az egérrel kattintson, vagy begépeljen valamit. Ezen cselekvések (egérkattintás, billentyűleütés) arra késztetik a futó ablakozó 21 rendszert (mint például Windows 95), hogy egy megfelelő eseményt váltson ki, és az aktív ablak programjának végrehajtásával folytassa a tevékenységét. Ezek után a programnak fogadnia kell az operációs rendszertől érkező

utasításokat, és gondoskodni kell a végrehajtásukról. Itt ismét szerephez jut az AWT, amely az események kezelésére egy úgynevezett Delegation-Event-Model-t használ. Az események kezelése során megkülönböztetjük az eseményforrásokat és az eseményfigyelőket. A források tulajdonképpen komponensek, amiken például az egérrel kattintunk, vagy amelyekre egy billentyű leütése (például egy gomb) hatással lehet. A figyelők olyan speciális osztályok, amelyek olyan metódusok deklarációit tartalmazzák, amelyek az események bekövetkeztekor hajtódnak végre. Több eseménykategória is létezik (például: egéresemény, billentyűzetesemény), minden esemény kezeléséhez az adott séma alapján nekünk kell megírni a tényleges metódusokat. A források és figyelők összekötése egy bizonyos addListener() metódus segítségével történik. Ha egy komponenshez több figyelőt is szeretnénk rendelni, akkor külön-külön mindegyiket hozzá kell

adni a komponenshez. Ablakesemény figyelése: 1. import javaawtevent*; importálni kell a programba ezt a csomagot 2. Kell az adott ablakon belül egy beágyazott osztályt készíteni, ebben írjuk le, hogy tulajdonképpen mi történjen az eseményre ( pl. kilépés): class Bezaras extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0); } } 3. Hozzáadjuk a programhoz az eseményfigyelőt: addWindowListener(new Bezaras()); A komponensekhez kapcsolódó események figyelésére a komponensek tárgyalásakor mutatunk példát. 10.4 Képkezelés Grafikai programok készítésénél gyakran van szükség képkezelésre. Előfordul, hogy egy már elkészített, és a háttértárra lementett képet kell a programban megjeleníteni, vagy a program egy képpontonként számított képet állít elő, és azt sokkal gyorsabb egy képként kezelni, mint esetleg pontonként megjeleníteni.  Létező kép megjelenítése: A java.awtToolkit osztály public Image

getImage(String) metódusával lehet gif vagy jpg kiterjesztésű képfile-okat betölteni. A Toolkit objektumot a getToolkit metódussal lehet elérni. A kapott képet a void drawImage(Image) metódussal lehet megjeleníteni. pl Image img; try{ img=getToolkit().getImage(filnev); } //try catch (Exception ee) { System.errprintln(ee); img=null; } // catch 22  Az általunk képpontonként kiszámolt képet is lehet egyben kezelni, ehhez importálni kell a java.awtimageMemoryImageSource osztályt Az Image osztály tartalmazza az Image createImage(tomb) metódust, amely segítségével a színkódokat tartalmazó tömbből képet lehet készíteni: Pl. Image scr; scr=createImage(newMemoryImageSource(maxx,maxy,img,0,max x)); 10.5 Komponensek Az igazi felhasználóbarát Windows-os programoknál megszokhattuk, a programba beavatkozási lehetőséget a különböző gombok, gördítősáv, checkbox, rádiógombok segítségével. Ezeket a javaban komponenseknek nevezzük Az összes

komponens osztály közvetve vagy közvetlenül a Component osztályból származik, ezért annak metódusait és működésmódját örökli. Az örökölt metódusokon kívül az egyes komponensek osztályai tartalmaznak más, az adott komponensre jellemző metódusokat is. A komponensek hierarchiája: Compon -Label(címke) ent -Button(gomb) -Checkbox -Choice -List Scrollbar(gördítősáv) -TextComponent TextField TextArea -Container -Panel – Applet ScrollPanel -Window -Dialog -Frame -Canvas A fent említett komponensekhez általában többféle konstruktor tartozik, melyek közül a felhasználásnak megfelelően választhatunk. A komponensek pontos elhelyezkedését a már fent említett elrendezéskezelőkkel szabályozhatjuk. Minden Container típusú komponenshez rendelhető egy elrendezéskezelő, a különböző elrendezéskezelők közül. A hozzárendelést a setLayout() utasítás segítségével valósíthatjuk meg. A komponens hozzáadása 1. Egy komponens

hozzáadásához az add metódust használhatjuk: pl A gomb lérehozás paramétere egy String, a gomb feliratát tartalmazza. 23 add(new Button("2. gomb")); 2. A komponens hozzáadása után mindenképpen érdemes meghívni a validate metódust, amely az ablak átrendezését érvényesíti. validate(); 10.6 Gombesemény kezelése Sajnos az előző példában a gombot létre tudtuk hozni, de figyelni kell a gomb megnyomását, és ennek valamilyen eseményt kellene kiváltania.  Létre kell hozni egy beágyazott osztályt, amely azActionListener osztálytól átveszi az metódus deklarációkat, és ezen belül pl. a gomb megnyomását az actionPerformed metódus megírásával tudjuk elképzeléseink szerint kezelni. class GombListener implements ActionListener{ // gomb figyelese public void actionPerformed(ActionEvent e) { } //ActionPerformed } // GombListener  A gomb létrehozása után, Gomb= new Button("Betölt"); add("South",Gomb);

validate();  a gombot tartalmazó ablakhoz hozzáadjuk a gombesemény figyelést. Gomb.addActionListener(new GombListener()); 10.7 File lista megjelenítése A javaban létezik egy FileDialog objektum (Frame F, S String, Filedialog.LOAD) , amely egy file-listát jelenít meg. A paraméterek: Mindenképpen kell kapnia paraméterként egy Frame típusú ablakot, amelyben megjelenik majd a filelista, ( éppen ezért a filelistát a frame-hez hasonlóan a show metódus jeleníti meg), egy String megadja a lista feliratát, és meg lehet adni az üzemmódot LOAD vagy SAVE, de meg kell jegyezni, hogy ez az ablak a filelista megjelenítését, és kiválasztását végzi, a tényleges fileműveleteket külön kell a programban elhelyezni. A file-lista megjelenítését a show metódus végzi, amely addig tartja a file-listát a képernyőn, amíg egy file kiválasztás, vagy a cancel megnyomása bekövetkezik. Fontosabb metódusok String getDirectory() String getFile() 24 Útvonal

lekérdezés File-név lekérdezés 11 Xwindow  hálózatorientált grafikus felület  nincsenek operációs rendszer funkciói  socket-eken keresztül működik o UNIX domain-eken (gépen belül) o Hálózaton  nem kell tudnia, hogy a helyi vagy távoli gépen fognak megjelenni az ablakok  X-protokoll Alkalmazói program (ügyfél) WIDGET set XToolkit X-kiszolgáló Xlib ablakokat szolgáltat kezeli az inputokat (billentyûzet, egér) MOTIF (open look) widget-ek X-protokoll üzeneteként valósul meg X-ptokoll TCP X-ptokoll IP TCP IP widget – window gadget CDE – Common Desktop Enviroment  kezelői felület Ablakkezelő (window manager)  speciális ügyfél  egy kiszolgálóhoz egyszerre csak egy tartozhat (az ablakozó rendszerhez)  a különböző ablakok elhelyezését koordinálja, widget-ekkel látja el az ablakokat  az ügyfelek nemcsak azonos gépről származhatnak, hanem az engedélyezett hostokról (Xhost

parancs)  X-kiszolgáló elindulásakor megadjuk a host-okat ahonnan ügyfél jöhet, ablakkezelő indítása  25 Az ügyfél több kiszolgálót is használhat Üzenetek  ügyfél kérések (request)  kiszolgáló válaszok (reply) o események (event): a kiszolgálón következnek be   egér mozgatása  egérgomb megnyomása  kitakarás (expose)  billentyű lenyomása, felengedése  hibaüzenet (error) a hálózati kommunikáció csökkentése érdekében o szerver oldali szoftver erőforrások létrehozása  pl: GC – Graphic Context (állandó paraméterek a rajzoláshoz) rajzszín, háttérszín o ha lehet, összegyűjti a kéréseket o amit lehet, a kiszolgáló állandóan elvégez (grafikus kurzor mozgatása, alakjának megváltoztatása) o billentyűzet eseményekről melyik ügyfél kapjon értesítést?   amelyiken az ablakban van az egér  amelyik előtérben van (input focus) az ügyfél program

áttekintése o felveszi a kapcsolatot a kiszolgálóval  TCP alapú  létrehozza az ügyfél „főablakát” (a kiszolgáló „gyökér-ablakának” leszármazottja) o létrehoz widget-eket  eseményeket rendel hozzá  az eseményekhez CALLBACK függvényeket rendel o belép az esemény hurokba Ablakok Mindegyiknek van szülője, kivéve a kiszolgáló root ablakát Van színmélysége 26 Pixmap Ebbe is lehet rajzolni, de amit ide rajzolunk, az nem jelenik meg a képernyőn, viszont át lehet másolni ablakba. Ennek is van színmélysége A grafikákat érdemes pixmap-ben létrehozni és onnan expose esetén átmásolni. Ablakok jellemzői  szélesség  magasság  saját koordináta rendszer (0,0) az ablak bal felső sarkához a koordináta értékeket pixel-ben pixel-ekben adjuk meg  az ablak keretének vastagsága (akár 0, akár nem)  az ablak origójának koordinátái a szülő ablak koordinátarendszerében.  A

megjelenő ablak lehet nagyobb a szülőjénél, de a kilogó rész nem jelenik meg. A vágás automatikusan megtörténik Ablak attributtumok  Háttér, keret kitöltési  „bit gravity”  „window gravity”  milyen események figyelése / jelzése engedélyezett  milyen legyen az egérmutató alakja az ablak belsejében Ablak létrehozása  „feltenni a képernyőre” (Map) Rajzolás az ablakba Xlib primitivek: o XDrawPoint : adott koordinátára pont rajzolása o XDrawPoints: tömbben megadott koordinátára pont kirajzolása o XDrawLine : két pont közé egyenes szakasz (koordinátákkal) o XDrawLines : tömbben megadott koordinátájú pontokat összeköt o XDrawSegments : különálló szakaszokat köt össze, a tömbben a kezdő és a végpont koordináták vannak megadva o XDrawRectangle : bal felső koordinátból, szélességből és a magasságból téglalapot rajzol 27 o XDrawArc : téglalapból megrajzolható ellipszis szakaszt

rajzol o XDrawString : szövegkirajzolás o XFillArc : kifesti az XDrawArc belsejét o XFillRectangle : tele téglalapot készít Graphic Context „Toll” definálása XCreateGC Paraméterek  display o kando:0.0 o xterm5:0.0  drawable (ablak vagy pixmap)  ValueMask mely mezőket akarjuk tényleg beállítani az XGCValues-ben  XGCValues : alapértelmezett funkció GXCopy (felülírás) o GXClear (törlés) o GX and (új és régi) o új and nor régi o nem új és régi  előtér  háttér  vonalvastagság  vonalstílus  bitsík maszk  vágási bittérkép Néhány fontosabb esemény  XEvent Unió o XButtonEvent struktúra o Néhány komponens 28  subwindow  time  state  button o XExposeEvent struktúra  x, y a láthatóvá vált ablakterület bal felső sarkának koordinátái  width  height  comment o XKeyEvent struktúra  (x,y)  time  keycode o XMotionEvent struktúra

 Egérmozgatás Xtoolkit Intrinsics Widget-ek paraméterei, „erőforrásai”  pozíciója szülő widget-en belül  mérete (szélesség, magasság)  színei (előtér, háttér, keret)  widget ablakában megjelenő string, vagy pixmap  a widget-hez tartozó X-ablak azonosítója  a widget-eket használó programok szerkezete  a toolkit inicializálása (XTinitialize()), TCP kapcsolat kiépítése, root widget létrehozása  widget létrehozása  a widget belső állapot módosítása, ha kell  CALLBACK függvények hozzárendelése a widget-ekhez  Widget-ek kirajzolása (realizálása) (XRealizeWidget())  Belépés az eseményhurokba XTmainloop A widget-ek állapotai  létrehozott (constructed) XTCreateWidget  menedzselt (managed) (méretszámítás, helymeghatározás)  kirajzolás (realizált) a gyermekeivel együtt 29  aktív a belső állapotát az üzenetek befolyásolják 

megszüntetett (destroyed) Widget erőforrásainak módosítása  a felhasználó HOME könyvtárában o .xdefaults file: ebben vannak a user számára alapértelmezett értékek o az egész rendszerre: /usr/lib/X11/app.defaults könyvtárban hozható létre config file  a parancssori argumentummal lehet módosítani o lg yellow o lg red  XTSetvalues()  Xrdb CALLBACK függvények  name-of-callback(w, client-data, call-data) o w – widget azonosítója o client-data – amikor a CALLBACK-et megadjuk, a kliens által megadott adat o call-data – a toolkit ebben adja meg, hogy miért hívódik meg  CB hozzárendelése (widget-hez) o XTAddCallback(wname-of CB) A Motif Toolkit widget-osztályai Xmfüggvénynév Néhány példa:  XmPushbutton  XmScrollbar  XmCascadeButton Színkezelés Különféle kiépítettségű kiszolgálóban is működik A grafikus megjelenítés bitsíkjainak száma (pl. 8 bitnél 256 féle szín „color cella” 

egy színcella RGB  minden színcellához megadható RGB komponens max 16 bites 30 Szín definiálása  eszközfüggő (egy-egy szín egy-egy hexa számjegy) o #RGB o #RRGGBB  eszközfüggetlen rgb.txt file  milyen színhez milyen értéket kell alkalmazni a monitoron 12 Irodalom: Móricz Attila: Java alapismeretek LSI Oktatóközpont A Mikroelektronika Alkalmazásának Kultúrájáért Alapítvány Budapest 1997. Nyékyné G. Judit (szerk) Java 11 útikalauz programozóknak ELTE TTK Hallgatói Alapítvány Budapest 1998. Nyékyné G. Judit (szerk) Java 2 útikalauz programozóknak ELTE TTK Hallgatói Alapítvány Budapest 2000. 31