JPAZ2 je framework pre podporu výučby princípov programovania a základných koncepcií objektovo-orientovaného programovania v Jave pre začiatočníkov. Framework je postavený na využití korytnačej grafiky a prieskumníka objektov. Prieskumník objektov umožňuje zobraziť a meniť hodnoty vlastností objektov a tiež spúšťať metódy objektov.
Ďalším významným cieľom frameworku je byť nástrojom, ktorý umožní záujemcom o programovanie tvoriť vlastné kreatívne miniaplikácie a programy (napr. 2D hry) bez nutnosti "zápasiť" s technickými detailami Javy. Tieto technické detaily sú v JPAZ2 ukryté do starostlivo navrhnutého systému tried. Prah na programovanie jednoduchých interaktívnych a vizuálnych aplikácii v Jave sa použitím JPAZ2 posúva výrazne nižšie - nie je treba riešiť vlákna a synchronizáciu vlákien, animovanie objektov, použitie komplexných tried Java API pre prácu so zvukom a grafikou, ...
SnowflakesCatcher2
obsahuje podporné triedy, ktoré zatiaľ nie sú súčasťou JPAZu.
ObjectInspector
- základná trieda schopná "skúmať" iné objekty v run-time (počas behu programu) - zobrazovať ich vlastnosti a spúšťať definované metódy
Turtle
- základná trieda reprezentujúca "korytnačky" v korytnačej 2D grafike a zároveň grafický objekt v ploche (Pane
)
Pane
) - umožňuje kresliť obrázky zo súboru do plochy
ImageShape.Builder
) - aj s možnosťou definovania rýchlosti animácie
Pane
)
Pane
- základná trieda reprezentujúca kresliacu plochu (metafora: papier so zadanými rozmermi)
Pane
-s)
onTick
)
ImageShape
- reprezentuje tvar korytnačky (grafického objektu), ktorý je určený nejakým obrázkom
ImageTurtleShape
ImageShape.Builder
- reprezentuje objekt, pomocou ktorého je možné bližšie špecifikovať tvar korytnačky z grafického súboru
AudioClip
- reprezentuje zvukový súbor (nahrávku) a poskytuje jednotné rozhranie pre jeho prehrávanie nezávisle od formátu zvukového súboru
AudioClip
v Jave (v iných balíkoch)
Clip
) tu nie je obmedzenie na veľkosť zvukového súboru a počet súčasne prehrávaných zvukov
playAsActionSound
(umožňuje súčasne viac krát prehrávať ten istý zvuk - napr. viac "výbuchov" v hre naraz)
JPAZPanel
- základná trieda, ktorá prepája kresliace plochy (Pane
-s) a Swing aplikácie.
Pane
)
align
) plochy (Pane
) a panelu (JPAZPanel
) - rozmery plochy sa prispôsobujú rozmerom panelu a naopak
Pane
) - okamžite alebo s vizuálnym efektom prechodu (TransitionEffect
, podobne ako efekty prechodov snímok v PowerPoint-e)
JPAZWindow
- ako JPAZPanel
, ale kresliaca plocha sa zobrazuje v okne
JPAZWindow
je preferované pred rozširovaním triedy WinPane
(v kóde konštruktora triedy rozšírujúcej WinPane
nie je garantované, že onXYZ
metódy budú volané až po skončení tohto konštruktora).
onXYZ
všetkých tried JPAZu boli vykonávané v EDT vlákne Swing-u. Vďaka tomu nie je potrebná žiadna synchronizácia (pokiaľ nevytvárate vlastné vlákna). Pokiaľ nemáte s vláknami a ich synchronizáciou dostatočné skúsenosti, odporúčame vlastné vlákna nevytvárať.
thread-safe
(výnimkou je napríklad aj ImageShape.Builder
).
main
je vykonávaný v inom vlákne, než všetky onXYZ
metódy. Odporúčame preto v tejto metóde zrealizovať len vytvorenie objektov aplikácie. Pozor tiež na verejné statické referenčné premenné inicializované v metóde main
(môžu byť ešte neinicializované, t.j. null
, keďže ich inicializácia neprebehla).
JPAZUtilities.getJPAZLock()
- pozor, z kódu držiaceho tento zámok nezískavajte iné zámky (obzvlášť sa nesynchronizujte s EDT vláknom Swing-u, napr. cez SwingUtilities.invokeAndWait
) - môže to mať za následok deadlock.
V projekte chcem umožniť používateľovi pri ukladaní stavu aplikácie (napr. hry) zvoliť si názov súboru. Ako sa dá naprogramovať vlastný "Uložiť ako" dialóg?
showOpenDialog
resp. showSaveDialog
(okrem iného rodičovský komponent určuje, kde sa dialógové okno zobrazí, resp. voči čomu sa vycentruje). Tieto metódy však akceptujú aj parameter null
(dialógové okno bude v strede obrazovky). Kvôli synchronizácii s EDT Swingu by vytváranie dialógového okna malo byť realizované len v rámci vykonávania onMouseXYZ, resp. onKeyXYZ metód.
V projekte chcem po kliknutí zobraziť nejaké jednoduché okno s hláškou alebo požiadať používateľa, aby nejako zadal nejaké údaje. Dá sa to?
null
a tieto metódy je treba volať len z onMouseXYZ
, resp. onKeyXYZ
metód. Okrem týchto metód je s EDT Swingu synchronizovaná aj metóda onTick
objektov triedy TickTimer
(ak v rámci parametrov konštruktora nebolo explicitne nastavené, že vytváraný objekt triedy TickTimer
nemá byť synchronizovaný s EDT Swingu).
onXYZ
by mali zbehnúť čo najrýchlejšie (žiadne dlhotrvajúce výpočty alebo JPAZUtilities.delay
), v prípade otvárania modálnych dialógových okien s čakaním za používateľským vstupom nie je problém.