ADA 2020

A Debreceni Egyetem Informatikai Kara 2020. december 15-16-án megrendezte az ADA konferenciasorozat harmadik konferenciáját (ADA 2020), amely az informatika és a STEM területei iránt érdeklődők konferenciája volt.

A konferencia célja

Az ADA konferenciasorozat elsődleges célja, hogy lehetőséget és közeget biztosítson az informatikai és a STEM területeken dolgozó, kutató vagy még a tanulmányaikat folytató nők szakmai megjelenésének, kommunikációjának. A konferencia kiemelt figyelmet kíván fordítani a kapcsolódó szakterületek munkaerő utánpótlásának problémáira, az érdeklődők pályaválasztási motivációja növelésének, illetve az orientáció kialakításának lehetőségeire. A konferenciasorozat szeretne hozzájárulni a nők arányának növekedéséhez a fenti területekhez tartozó szakmákban és kutatásokban.

Kiknek érdemes részt venni?

Mindenkinek, aki érdeklődik az informatika és a STEM területeinek új eredményei iránt! Minden kutatónak, oktatónak, felsőoktatásban tanuló vagy doktori tanulmányokat folytató hallgatónak, akik tudományos eredményeiket szeretnék bemutatni egy szélesebb szakmai közönség előtt.

Akik az informatikához, a STEM területekhez, illetve ezek oktatásához kapcsolódó munkájuk és tapasztalatuk alapján kialakult jó gyakorlatukat kívánják megosztani a szakmabeliekkel.

Az eseményről

Mindkét nap 1-1 plenáris előadással indult. 11 szekcióban (Számítástudomány, Természettudomány, Okos város és okos otthon, Női tapasztalatok a STEM területén, Nők a tudományban, Virtuális valóság, Virtuális valóság és vizualizáció, Középiskolai oktatás, Új didaktikai irányvonalak, Digitális eszköztár használata, Robotika) zajlott a 40 szekció előadás. A konferencia a Webex online platformon zajlott.

Elérhető a konferencia programja: keddi program és szerdai program, valamint az absztraktok is.

2020-ban előadást tartottam „Koronavírus Java projekt – a tervezés és megvalósítás mérföldkövei” címmel, amely a konferencia Digitális eszköztár használata szekciójába került. Az absztrakt: „Az előadás/cikk egy szoftverfejlesztő OKJ képzésen használt/használható esettanulmányt ismertet. A Java projekt két különböző weboldalról ment adatokat, ezek: https://koronavirus.gov.hu/elhunytak és https://www.worldometers.info/coronavirus/country/hungary/. Az adatokat helyi állományrendszerben tárolja, konvertálja, összefésüli, végül némi adattisztítást követően feldolgozza. A Java alkalmazások gyakorlat tantárgy tematikájának kapcsolódó elemei: OOP-MVC, swing GUI, eseményvezérelt programozás, szövegfájlok kezelése, hálózati kommunikáció, kivételkezelés. Az előadás/cikk ismerteti a Java projekt tervezésének és megvalósításának fontosabb lépéseit, mérföldköveit.”

Az előadásom prezentációját és az Java projekt/esettanulmány forráskódját ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

Az előadásom témája a Java EE szoftverfejlesztő tanfolyam több alkalmához is kötődik.

Részt vettem az ADA 2019 konferencián is.

Kutatók éjszakája 2020

Kutatók éjszakája

Kutatók éjszakájaA Kutatók Éjszakája nemzetközi rendezvénysorozat 2005-ben indult. Magyarország 2006-ban csatlakozott. Azóta évről-évre egyre több intézmény nyitja meg hazánkban kapuit, szervez érdekes programokat, sok-sok településen, több száz helyszínen, több ezer eseményt meghirdetve sok tízezer érdeklődő/résztvevő látogatónak biztosít tartalmas estét.

Bár a kezdeményezés elsősorban a kutatói pálya népszerűsítését szolgálja, ezért leginkább a tizen- és huszonévesekre számít, az események vonzók és elég érdekesek ahhoz, hogy a kisgyerekektől a legidősebbekig mindenki megtalálja a számára izgalmas programokat. Korábban nagyobb felsőoktatási intézmények és kutatóintézetek szerepeltek döntően, de az utóbbi néhány évben egyre több kisebb intézmény, tehetséggondozással foglalkozó középiskola, cég, egyesület is csatlakozott a rendezvényhez. A Kutatók éjszakája rendezvény minden meghirdetett programja ingyenes.

Rendezvényünk plakátja

Az it-tanfolyam.hu 2020-ban is csatlakozott. Három oktatónk hirdetett öt programot a kutatokejszakaja.hu weblapon. Az eseményekre regisztrálni kellett a weblapon, ami talán szervezőként ránk keresve bizonyult legegyszerűbbnek. A regisztrációs időszak november 16-26-ig tartott és a programjainkra november 27-én 17:40-20:50 óráig került sor. Az élő közvetítés linkjét a programra regisztráltak e-mail-ben megkapták. Néhány online látogatónk jelzéséből megtudtuk, hogy ez a folyamat sajnos nem volt zökkenőmentes. Valószínűleg ennek az lehetett az oka, hogy a központi honlap még azután is engedte a regisztrációt a meghirdetett programokra, miután kiküldtük az élő közvetítés linkjét. Tőlük ezúttal is elnézést kérünk.

Terveztük, hogy az előadások élő közvetítését rögzíteni fogjuk és tanfolyamaink hallgatói számára – a kapcsolódó témakörökhöz, ILIAS-ra feltöltve – elérhetővé tesszük. A központi honlap szervezői a rendezvény előtt néhány órával (pénteken 10 órakor) körlevélben értesítettek mindenkit az alábbiak szerint: „Nem készíthetnek és nem tölthetnek fel semmilyen webhelyre vagy fórumra olyan videót vagy felvételt, amelyen a becsatlakozó látogató felismerhető, azaz az arca látszik, neve felismerhető, hangja nevéhez vagy arcához köthető, azaz a személy azonosítható. Ezért rögzíteni bármit csak úgy szabályos, ha erre külön beszerzik a résztvevők hozzájárulását. Amennyiben rögzítésre sor kerülne, felhívjuk a figyelmet arra is, hogy kiskorúak esetében a törvényes képviselőktől is szükséges a hozzájáruló nyilatkozat beszerzése. Hozzájárulás hiányában a felvétel rögzítése, közlése úgy lehet szabályos, ha azon a résztvevők bármilyen technika segítségével felismerhetetlenek, azaz kitakarásra, anonimizálásra kerülnek.” Sajnos erre nem készültünk fel előre és aznap már nem tudtuk megoldani a hozzájáruló nyilatkozatok beszerzését. Ezért az élő közvetítést nem rögzítettük. Ezt kifejezetten sajnáljuk, hiszen sok-sok előkészítő munkát fektettünk bele és a meghirdetett öt programból három teljesen újonnan összeállított anyag volt, egy korábbit frissítettünk és egy pedig igazi örökzöld téma. Természetesen a prezentációkat elérhetővé tettük tanfolyamaink hallgatói számára.

17:40-18:10 – Kaczur Sándor: Szoftverek architekturális tervezésének szempontjai
Az előadás áttekinti, hogyan válasszunk az ismert/tipikus tervezési minták közül és válaszokat ad a következő kérdésekre. Legalábbis megpróbálja. Mekkora a mozgástér a választás során? Mikor jó az MVC? Mikor kell a Factory? Mikor nem jó a Bridge? Mikor hasznos a Chain-of-responsibility? Hogyan csoportosítsuk az igényeinket? Hogyan osszunk szét jól specifikált funkciókat az alkalmazás rétegei között? És vajon mi a teendő kevésbé körültekintő specifikáció esetén? Milyen alapvető modulok állnak rendelkezésre? Minden célszerű ismerni ahhoz, hogy vállalható döntést tudjunk hozni? Hogyan osszunk szét funkciókat a szerver és a kliens oldal között? Mekkora strukturális redundancia kell/hasznos elosztott alkalmazások esetén? Hogyan értékelhető egy szoftver architekturális terve? Lehet két hasonló? Ha igen, melyik lehet a jobb? Ha nem, miért nem? Hogyan kell(ene) dokumentálni egy szoftver architekturális tervét? A program a Java tanfolyamaink orientáló moduljához kötődik.

18:20-18:50 – Kaczur Sándor: Java kollekciók hatékonysága
Adott egy ismert algoritmus egy ismert problémára. A gyakorlati bemutató példákat mutat arra, hogy az ismert Java kollekció keretrendszer különböző adatszerkezeteinek funkcionalitását/szolgáltatásait felhasználva mennyire eltérő megoldásokat tudunk készíteni. Mindegyik megoldás ugyanazt az eredményt adja, de alapjaiban más gondolatmenettel születtek. Vajon melyik tekinthető hatékonyabbnak? Mennyi tárhelyet igényelnek? Mennyi idő alatt hajtódnak végre? Mennyire bonyolultak, azaz mennyire könnyű/nehéz megérteni/dokumentálni/elmagyarázni? Előkerülnek különböző Set, Queue, List, Map implementációk, programozási tételek. Amit csak lehet, mérünk, összehasonlítunk, elemzünk. Végül az eredmények alapján javaslatokat adunk: mikor, miért, mit (mit ne), hogyan (hogyan ne) használjunk. A program a Java SE szoftverfejlesztő tanfolyamunk tematikájához kötődik.

19:00-19:30 – Kaczur Sándor: Reflexjátékot fejlesztünk
Játékprogramot tervezünk és fejlesztünk, grafikus felülettel. Egy 2×2, 3×3, …, 9×9 négyzetrács alkotja a játékteret, ahol minden négyzet színnel kitöltött. A kitöltés véletlenszerű, de annyiban manipulált, hogy a színek minél különbözőbbek legyenek. A játékmenet során minél gyorsabban ki kell választani a rácsban az egyik négyzetet. Azt, amelyik ugyanolyan színű, mint egy minta. A rács miatt a játék egyre nehezebb. Ez az alapeset, tekintsük ingyenes 1.0-ás verziónak. Ötletelünk a továbbfejlesztési lehetőségek között. Például beépíthetnénk időkorlátot: a teljes játékmenetre globálisat, vagy akár négyzetrácsonként lokálisat is. Csalhatnánk is, akár többféleképpen is. Tűnhetnénk engedékenynek azzal, hogy nem a pontos találatokat számoljuk össze, hanem a hasonló színek is pontot érnek, de arányosan kevesebbet, minél inkább különböznek. Skálázhatjuk a pontszámot, például százalékosan. A megjelenítést GUI kliensprogram végzi, amely a feladatokat a szervertől kapja, amely pontoz is. A program a Java EE szoftverfejlesztő tanfolyamunk tematikájához kötődik.

19:40-20:10 – Szegedi Kristóf: Mihez kezdhetünk a kétszeresen kivételes tanulókkal?
Áttekintjük milyen az, amikor találkozik a tehetség és a deficit. Hiszen a természet általában kompenzál. Hogyan vegyük észre? Hogyan éljünk vele (a lehetőséggel)? Hogyan profitáljunk belőle? Milyen soft skillek fedhetik (legalább részben) el a deficitet? Milyen tréningek javasolhatóak? Hogyan bontakoztatható ki a tehetség? Három főbb kategóriát érint az előadás: Asperger-szindróma, ADHD-szindróma, tanulási zavar. Renzulli, Czeizel, Csíkszentmihályi tehetségmodelljeiből kiindulva fokozatosan közelítünk Bagdy Emőke tehetség kibontakozási koncepciójához. Ismertetünk néhány tipikus, atipikus, kritikus és paradigmatikus esetet. Vajon Einstein, Darwin, Michelangelo, Newton, Hitchcook, Cher, Daryl Hannah, Steve Jobs miben volt tehetséges és deficites? Miben különleges a Pokémon Go megalkotója? Előkerül az Esőember, Dr. Murphy és persze Dr. Sheldon Cooper sem maradhat ki.

20:20-20:50 – Kiss Balázs: Gondolkodjunk logikusan!
Az előadás során áttekintjük az intelligencia, a kreatív problémamegoldó és logikus gondolkodás összefüggéseit és izgalmas feladatokból válogatva közösen megoldunk néhány fejtörő feladatot.

 

A programjaink népszerűek voltak. A Google Meet online platformon kb. 80-an csatlakoztak. A többség több programon is részt vett. Néhányan kifejezetten egy-egy adott program iránt érdeklődtek. Az online platform sokaknak újdonságot jelentett, de azért a chat felületen élénk kérdezz-felelek párbeszéd zajlott. Ahogyan számítottunk rá, markánsan más célközönséget vonzott az első három és az utolsó kettő programunk. Köszönöm oktató kollégáimnak, hogy örömmel csatlakoztak. Külön köszönöm Hollós Gábor kolléga előkészítő tevékenységét, valamint a rendezvény ideje alatt a technikai ügyelet biztosítását. Mindannyian jól éreztük magunkat. Igazán tartalmas esti programot állítottunk össze. Nem akartunk pusztán előre felvett videókat megosztani. Megvolt a varázsa az élő közvetítésnek, hiszen így sokkal személyesebb és interaktív élményt jelentett. Szívesen emlékszünk majd rá. Jövőre talán már az offline világban is szervezhetünk eseményeket, tarthatunk rendezvényeket.

Népesedési világnap

Népesedési világnap logó

Népesedési világnap logóAz ENSZ 1987-ben július 11-ét a népesedési világnappá (World Population Day) nyilvánította. Bolygónk lakossága aznap érte el az 5 milliárdot. További kerek számok voltak: 1999. október 12-én 6 milliárd, 2011. október 30-án 7 milliárd. További kerek számok várhatóak: 2023 – 8 milliárd, 2037 – 9 milliárd, 2057 – 10 milliárd. A KSH elemzése részletes elemzéseket közöl évről-évre a témában, például: 2019-ben, 2018-ban. A worldometer.info weboldalon folyamatosan frissülő kimutatások érhetők el a népességhez globálisan, valamint országonként is: például Magyarország aktuális népesedési adatai.

A népesedési világnap inspirált egy Java program megtervezésére és megírására. A swing GUI-s program megjeleníti a worldometer.info weboldalról kinyerhető adatok alapján régiónként (kontinensenként) az elérhető adatokat 1950-től 2020-ig az alábbiak szerint egy világtérképen.

Az elkészült program

Népesedési világnap Java program

Tervezés

Objektumorientált szemlélettel, MVC architekturális tervezési mintát követünk, angol nyelvű interfész, osztály, változó, objektum, metódus nevekkel. A projekt neve: WorldPopulation, a csomag neve: worldpopulation. Amit lehet, konstansként interfészbe (szeparálva) teszünk és az MVC rétegekhez kötődő osztályok implementálják. A modell minden évszámhoz tárolja a szükséges adatokat, mindezt egyetlen betöltéssel/letöltéssel éri el. A program kliensként hat régióra vonatkozó adatot gyűjt össze, alkalmazkodva a szerver adatforráshoz. A címsorban lévő összesített adat is elérhető közvetlenül a weboldalon, de a kisebb adatforgalom érdekében hasznos inkább a kliensben összesíteni. Mindössze egyetlen eseménykezelés szükséges: a csúszka beállításával megadott évszám alapján frissíteni kell a régiók címkéit és az ablak címsorát. Öröklődés hasznos a feladat megoldása során: egyrészt interfészek, másrészt osztályok között.

Interfészek

Az ősinterfész a WorldPopulationConstants, benne az évszám intervallum MIN_YEAR és MAX_YEAR határaival, valamint a megjeleníthető régiók neveivel tömbben: REGION_NAME_ARRAY. Két utódinterfész épül az ősre: ModelConstants és ViewConstants. Előbbi interfész az adatforráshoz kapcsolódik: URL_COMMON az URL eleje, URL_ARRAY az URL végei régiónként tömbben. Utóbbi interfész a megjelenítéshez kapcsolódik: WORLD_MAP_IMAGE a háttérkép annak WORLD_MAP_RECT méretével együtt, valamint a régiónkénti REGION_RECT_ARRAY téglalapok tömbje a kezdeti pozíciókkal/méretekkel, TITLE a sablon a program címsorához (frissítendő az évszámmal és az összesített népességgel). A megfelelő utódinterfészt mindig implementálja az MVC szerint hozzá illeszkedő osztály.

Osztályok

A belépési pont a WorldPopulation.java fájlban található.

Három összetartozó elemi adatot fog össze egybe a RegionData POJO, ezek name, year, population nevű rendre String, int, long típusú adatok. Például: Európa, 2020, 747643253. Tartalmaz két függvényt: getPopulation(), valamint toString(). Utóbbi HTML formátumban adja vissza a megjelenítendő adatokat.

A JLabel-ből származik az igényekhez alakított RegionLabel osztály. Ennek van előre megadott pozíciója, mérete, betűtípusa, betűmérete, sárga háttérszíne, piros kerete. Ezenkívül a téglalap átlátszó, valamint a benne megjelenő HTML tartalom vízszintesen középre igazított. Némi extra funkció, hogy egérrel megfogva – drag and drop – áthelyezhető, ami a MouseMotionListener egérmozgást figyelő interfész mouseDragged() metódusának felülírásával válik lehetővé. A mozgathatóságáért saját maga felel. Példaként közöljük az osztály teljes forráskódját:

A webről adatokat szerez és tárolja a Model osztály, a java.io és java.net csomagokra építve. Egy példa: a https://www.worldometers.info/world-population/europe-population/ oldal forrásából nyeri ki az osztály az alábbi adatokat:

Ezek parszolását követően elkészül egy optimálisnak tekinthető, generikus listákból álló regionListArray tömb adatszerkezet. A parszolás történhet egyszerű szövegkezeléssel vagy JSON feldolgozással is. Erre épülnek a konstruktorral és vezérlővel összehangoltan működő getter metódusok: getHTML(), getRegionList(), getRegionData(), getPopulation(). A JSON adatforrás feldolgozását most nem részletezzük, de hasonlóról blogoltunk már: Időjárás Budapesten.

A grafikus felhasználói felületet adja a JFrame utód View osztály. Három GUI komponensből áll: pnWorldMap – háttérkép JPanel, lbYear – kiválasztott/aktuális év JLabel, slYear – kiválasztható/görgethető aktuális év JSlider. Izgalmas megoldani egymásra/egymáson elhelyezni a komponenseket. Egy JLayeredPane komponens  DEFAULT_LAYER rétegére kerül a térképet tartalmazó háttérkép, majd a  PALETTE_LAYER rétegére kerül dinamikusan a hat  RegionLabel osztályú/típusú objektum. A csúszka komponens slYearStateChanged() eseménykezelő metódusa vezérlőként megszólítja a modell réteget és a visszakapott adatokkal frissíti a nézet réteget (a címsorban lévő összesítéssel együtt, ezres szeparátorokkal).

Ötlet továbbfejlesztésre

Hat különböző weboldal forráskódjából kell összegyűjteni a megjelenítendő adatokat. Ez 2020-ban régiónként 71 számot jelent és hat régió van. Érdemes lehet olyan adattárolást megvalósítani, amely csökkenti a szerverhez fordulások számát, illetve a letöltendő adatok mennyiségét. Hiszen a múltbeli évekhez kötődő historikus adatok nem változnak. Ha ezekre valamilyen formában a program emlékszik, akkor elegendő az utolsó tárolt évből kiindulva az aktuális évig évenként, régiónként lekérni mindössze 6, 12, 18… számot, a program utolsó futtatásának évéből kiindulva. Ez lényegesen kevesebb lenne, mint a jelenlegi 6*71 lekért szám. A koncepció kulcsszava: inkrementális adatfrissítés. Ha megvalósítjuk az ötletet, akkor figyelni kell arra, hogy az aktuális/utolsó évben az adatok akár másodpercenként is változhatnak.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A feladat a Java SE szoftverfejlesztő tanfolyam tematikájához kötődik (ha a swing GUI-ra koncentrálunk és az adatok helyi fájlrendszerből elérhetők), és a Java EE szoftverfejlesztő tanfolyam tematikájához kapcsolódik (ha az adatokat közvetlenül a webről olvassuk).

JFreeChart grafikon készítése

grafikon

grafikonXML formátumban megkapott adatokat grafikonon jelenítünk meg. 5 összetartozó adat/tulajdonság sorozatát dolgozzuk fel: JOB_TITLE, EMPLOYEE_COUNT, MIN_SALARY, AVG_SALARY, MAX_SALARY. Az adatforrásban egyszerű életpálya modell szerint munkakörönként meghatározott az adható minimális és maximális fizetés (ez a 3 adat közvetlenül rendelkezésre áll). Minden alkalmazottra teljesül, hogy a fizetése beletartozik ebbe a zárt intervallumba. Az adatforrás feldolgozása során COUNT és AVG aggregáló függvényekkel előállítjuk – munkakörönként csoportosítva – az alkalmazottak létszámát és átlagfizetését (ez a további 2 adat). Az Oracle HR sémából lekérdezve 19 munkakört kapunk, így az XML fába is ennyi <JOB_STAT> csomópont kerül. A megfelelő pillanatban rendelkezésre álló 5 összetartozó adat exportálható XML formátumba az alábbiak szerint:

Az elkészült grafikon így jelenik meg:

JFreeChart-grafikon

A JFreeChart típusú grafikont az alábbi forráskóddal készítettük el:

A grafikon rendelkezik vizuális komponens mögötti adatmodellel, hiszen MVC szerkezetű komponens. Ez egy CategoryDataset típusú objektum. Ennek factory metódusa három paramétert vár: a jelmagyarázatot (rowKeys – legends), az Y tengelyen megjelenő feliratokat (columnKeys – jobTitleCountEmployees) és az adatokat (data – datas). Az első 3 elemű String[]: "Maximum fizetés", "Átlagfizetés", "Minimum fizetés". A második 19 elemű szöveges tömb: "Accountant (5 fő)", "Accounting Manager (1 fő)", …, "Stock Manager (5 fő)". A harmadik 3*19-es méretű kétdimenziós double típusú tömb, a megjelenítendő értékekkel: {{9000, 7920, 4200}, {16000, 12000, 8200}, , {8500, 7280, 5500}}.

A szükséges adatok megadását követően meg kell adni a grafikon megjelenítését meghatározó adatokat. Ezt egy CategoryPlot típusú objektum teszi lehetővé, amely konstruktora négy paramétert vár. Az első az adatforrás ( cd), a második az Y tengely felirata ( "Munkakör és létszám"), a harmadik az X tengely – alapértelmezetten felül megjelenő – felirata ( "Fizetés"), a negyedik a diagramtípushoz tartozó megjelenítő funkcióra utaló interfész képességeivel rendelkező névtelen objektum. Ez a 3D oszlopdiagram fekvő és egymást részben átfedő/eltakaró oszlopokkal jelenik meg.

Végül az elkészült ChartPanel típusú objektumra helyezett JFreeChart típusú diagramot hozzá kell adni a JFrame típusú GUI tartalompaneljének egy BorderLayout elrendezésmenedzserű paneljéhez.

Az elkészült grafikon többféle szakterületen is hasznos lehet. Értelmezése során összefüggéseket fogalmazhatunk meg és következtethetünk is.

A bejegyzéshez tartozó forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A feladat adatfeldolgozó része a Java EE szoftverfejlesztő tanfolyam 9-12. óra: XML feldolgozás, a grafikont megjelenítő része a Java SE szoftverfejlesztő tanfolyam 29-36. óra: Grafikus felhasználói felület alkalmához kapcsolódik.

Kígyókocka grafikus felületen

Kígyókocka

KígyókockaA JavaFX grafikus felhasználói felületének és eseménykezelésének megvalósítása némileg eltér más Java GUI implementációk működésétől, például swing vagy Java3D. Főként animációk során hasznos használni. Megközelítése természetesen objektumorientált: a térbeli objektumok koordinátái, viselkedésük, transzformációkkal valósul meg, és azok is objektumok. A korábban elkészített konzolos kígyókocka programot valósítjuk meg most JavaFX GUI-val.

Ez egy két részből álló blog bejegyzés 2. része. A blog bejegyzés 1. része itt található.

A program működése

Kígyókocka JavaFX grafikus felületen

A program megvalósítása

A start() JavaFX életciklust indító eljárás felépíti a createGridUI() függvényt meghívva a felhasználói felületet (színpad/jelenet JavaFX-ben), beállítva a méreteket, címsort, és meghívja az eseménykezelésért felelős handleRotateButtons() eljárást.

A createGridUI() függvény a grafikus felhasználói felület elemeit paraméterezi (szerepe szerint Factory metódus). Öt elemből álló rács ( GridPane osztályú grid nevű objektum) készül el, amelyre nyilakat tartalmazó nyomógombok (pl.: Button típusú btLeft objektum) kerülnek fel a négy égtájnak megfelelően, valamint rajta középen helyezkedik el a kígyókocka 3D megjelenítését megvalósító objektum. A nyilak entitásai az Unikód karaktertáblából származnak. A kígyókocka objektumot a meghívott createSnakeCube() függvény hozza létre. A Node osztályú snakeCube nevű objektum geometriai transzformációs objektumot is hozzá kell rendelni: ez most a négyirányú forgatást megvalósítani képes névtelen Rotate osztályú objektum lesz. A forgatást 5 paraméterrel célszerű beállítani (van rá megfelelő túlterhelt konstruktor), ezek rendre: szög, X, Y, Z tengely origója és a forgatás tengelye. Az objektumok tulajdonosi hierarchiája swing-es szemmel nézve szokatlannak tűnik, de szemléletben legalább azonos a Java3D és a JavaFX megvalósítás.

A createSnakeCube() függvény előállítja a színpadra/jelenetbe kikerülő kígyókockát Node osztályú objektumként. A konstans CUBE tömb egységvektor rendszerben tartalmazza a kígyót alkotó kockák középpontjait. Az első ciklus mindezt nagyítást alkalmazva skálázza. A második ciklus koordináta és pont transzformációk alkalmazásával ( moveToMidPoint: eltolás középre, rotateAroundCenter: forgatás a középpont körül) a kiinduló állapotnak megfelelő méretben és pozícióban elhelyezi a kígyó útvonalát mutató hengerobjektumokat. A konstrukciós és transzformációs műveletek esetén alkalmazkodni kell ahhoz, hogy a JavaFX koordinátarendszerben az X jobbra, az Y lefelé, a Z pedig befelé (a nézőponttól távolodva a térben) növekszik. A matematikai hátteret részletesen most nem magyarázzuk el.

A handleRotateButtons() eljárás a forgatás 4 nyíl eseménykezelésének hozzárendelést végzi el. A nyomógomb objektumok setOnAction() hozzárendelő metódusának paramétere EventHandler funkcionális interfésszel és lambda művelettel működik. A forgatás irányát hozzárendeljük a megfelelő nyomógombhoz. Ez még csak végrendelkezés a jövőre: csak definiáljuk, hogy minek kell majd történnie, ha bekövetkezik az esemény (valamelyik nyílra/nyomógombra kattint a felhasználó).

A rotateSnake() eljárás minden nyíl feliratú nyomógombra kattintva reagál a bekövetkezett eseményre. A rotateAxis objektum a forgatás tengelye, a paraméterként átvett direction enum-tól függ, szinkronban azzal a nyomógombbal, amelyikre kattintott a felhasználó.

Ötletek a továbbfejlesztésre

  • Lehetne többféle irány is, például a négy sarokba átlós vagy mélységi irányú elforgatással.
  • Beépülhetne többféle transzformáció is, például skálázás (kicsinyítés, nagyítás), eltolás (közelítés, távolítás).
  • A kígyó útvonalát mutató hengerobjektumok kirajzolásának sorrendjén lehetne változtatni, mert a megjelenítés nem tökéletes. Jelenleg néhány helyzetben lehetetlennek, Escher lehetetlen konstrukcióihoz hasonlónak tűnhet a kígyókocka. Ha a tér mélységéből a nézőpont felé közeledve rajzolnánk ki a hengerobjektumokat, akkor a 3D látvány nem sérülne.

Tanfolyamainkon JavaFX grafikus felülettel hangsúlyosan nem foglalkozunk, de egy-egy kész forráskódot közösen megbeszélünk, és össze is hasonlítjuk a swing-es változattal. Fejlesztünk játékprogramot, de inkább konzolosan, vagy swing-es ablakban, vagy webes alkalmazásként.

A grafikus felületek felépítésének megismerése fontos lépcső az objektumorientált programozás elmélyítéséhez, gyakorlásához. A grafikus felületekhez egy másik lényeges szemléletváltás is kapcsolódik, hiszen a korábbi algoritmusvezérelt megközelítést felváltja az eseményvezérelt (eseménykezelés).

Tudatosan hangsúlyozott MVC-s projektben megoldva a feladatot, a modell rétegben tárolhatnánk többféle kígyókocka megjelenítéséhez és animációjához szükséges adatszerkezetet és transzformációs objektumokat/metódusokat is és a nézet/vezérlő rétegekben biztosíthatnánk ezek közül a kijelölést/kiválasztást menüvel, ikonokkal, eszköztárral, gyorsbillentyűkkel.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

Tanfolyamaink orientáló moduljának 9-12. óra: Mesterséges intelligencia alkalmához kapcsolódóan a kígyókocka véletlenszerű előállítása helyett stratégiával rendelkező visszalépéses algoritmust specifikálhatunk és implementálhatunk.

Ez egy két részből álló blog bejegyzés 2. része. A blog bejegyzés 1. része itt található.