Sprievodca programovaním jednoduchej grafickej aplikácie EasEdit
Programový rámec GRobot dostupný na stránke:
Programový rámec (angl. framework), v dokumentácií momentálne označovaný ako skupina tried robota, má uľahčiť vstup do problematiky programovania. Programovanie je široká oblasť. Vstup do tejto problematiky s použitím „čistého“ jazyka Java považujeme za náročný, preto vznikol tento programový rámec. Kompletná dokumentácia, k programovému rámcu je k dispozícii na webovej adrese: http://cec.truni.sk/horvath/GRobot/.
Konštrukcia grafického robota je vo svete s dvomi plátnami, na ktoré je možné kresliť. Ústrednou triedou robota je trieda GRobot, ktorá zabezpečuje celú funkcionalitu robota. Okrem toho je vo svete robota použiteľných mnoho ďalších tried, ktoré podporujú fungovanie robotov, sveta, oboch plátien a ďalších prvkov. (Horváth, 2014)
BlueJ: verzia programu aspoň BlueJ 3.1.7 a vyššia.
Java: verzia Java SE Development Kit 8 Update 121 a vyššia
Tieto súčasti môžete nájsť aj na stránke: http://pdf.truni.sk/horvath/softver?bluej-java.
Ikony:
Ikony, potrebné na vytvorenie tlačidiel, je možné vyrobiť v jednoduchom grafickom programe alebo ich prevziať v súbore vo formáte RAR priloženom na konci dokumentu. Tiež je možnosť ich nahradiť svojimi vlastnými.
My používame takto vyzerajúce tlačidlá nástrojov:
eraser.png
pencil.png
select-no.png
select-yes.png
Našou úlohou bude vytvoriť jednoduchú grafickú utilitu
v programovacom jazyku Java s použitím programového rámca GRobot,
ktorý bude fungovať ako rastrový grafický editor 2D grafiky. Tento editor
nazveme EasEdit
.
Bude obsahovať základné funkcie takejto grafickej utility ako sú kreslenie
perom s možnosťou zvolenia hrúbky čiary, výberom farby čiary, gumovanie,
kreslenie a úprava kruhu, elipsy, štvorca, obdĺžnika.
Utilita bude pracovať v dvoch režimoch – rastrovom a vektorovom. Nástroj kreslenia perom a gumovania spolupracujú s rastrovým režimom, kreslenie a úprava ostatných tvarov s vektorovým režimom. Rastrový režim budeme chápať ako pozadie, na ktoré môžeme vložiť ľubovoľný počet vymenovaných vektorových tvarov. Rastrové pozadie môžeme ukladať a neskôr znovu otvoriť a ďalej s ním pracovať.
Súborový formát pozadia je predvolene PNG, čiže Portable Network Graphics (prenositeľná sieťová grafika). Zatiaľ vektorové útvary vytvorené na rastrovom podklade nebudeme ukladať. Dôvodom je aj to, že v čase vývoja tejto grafickej utility na to framework nebol pripravený. Na tvorbu programu použijeme nástroj BlueJ.
Vytvoríme si nový projekt v BlueJ s názvom EasEdit
a hlavnú
triedu, ktorej zadáme rovnaký názov ako projektu. BlueJ nám automaticky
vygeneruje text triedy. Ten si však upravíme tak, aby nám zbytočne nezväčšoval
náš program. Výsledný zdrojový kód triedy bude po týchto úpravách vyzerať ako
obrázku č. 1.
Obrázok č. 1: Ukážka prázdnej triedy EasEdit
Keďže naša grafická utilita má byť tvorená pomocou
programového rámca GRobot, hneď na začiatku zdrojového kódu importujeme
programový rámec do tejto triedy pomocou príkazu import knižnica.GRobot
;
Aby sme mohli pohodlne používať vlastnosti triedy GRobot, je
vhodné odvodiť hlavnú triedu od triedy GRobot príkazom extends GRobot
.
V konštruktore zabezpečíme nekreslenie robota. Bude to mať zmysel pri tvorení tlačidiel, pretože sa budú kresliť až na ich mieste. Keby tam tento príkaz nedáme, kreslili by sa hneď pri spustení utility a až potom by sa presunuli na svoje miesto.
TIP!
Ak uvažujeme, že túto utilitu budeme v budúcnosti ďalej rozvíjať, bolo by vhodné zadefinovať rozmer plátna do tela konštruktora. Teraz je plátno nastavené na predvolené rozmery. Chceme aby tieto hodnoty ostali rovnaké aj do budúcna, v prípade zmeny predvolených rozmerov, mali by sme definovať rozmer plátna. Predvolená hodnota je 800 × 600.
Zavoláme teda nadradený konštruktor, v ktorom uvedieme
iba tento rozmer. Robot tak bude vedieť, že veľkosť nášho plátna je takáto aj
keby predvolená hodnota bola iná. Má to aj výhodu pri ukladaní pozadia. To bude
rovnako nastavené na túto hodnotu. Nebude preto možné, že by sa pozadie uložilo
v iných rozmeroch ako v tých, ktoré uvádzam. Definujeme
v konštruktore aj rozmery pozadia ako obrázok. Na začiatku ešte musíme
zadefinovať nový, súkromný, konečný atribút Obrázok pozadie
.
Programový rámec nedokáže pokryť celý jazyk Java. Jedným
takýmto príkazom je aj nastavenie minimálnej veľkosti okna utility. Použime na
to príkaz, ktorý nastaví minimálnu veľkosť okna na konštantnú hodnotu. Môžeme
tieto rozmery určiť na 400 × 300. Zabezpečíme to pomocou svet.setMinimumSize(new
java.awt.Dimension(400, 300))
.
Na začiatok by sme si v grafickej utilite mali vytvoriť
tlačidlá, ktorými budeme program ovládať. Tieto tlačidlá by mali byť čo najviac
„po ruke“, tak aby sa nám s utilitou dobre pracovalo. Vytvoríme triedu
s názvom ObrázkovéTlačidlo
.
Importujeme do nej programový rámec GRobot
tak ako v predchádzajúcej triede. Trieda
dedí vlastnosti z triedy GRobot.Tlačidlo
.
V tele konštruktora definujeme veľkosť tlačidla na 20 × 20
pixelov, ktorú zdedíme z nadradenej triedy. Vytvoríme súkromný statický
atribút celočíselného typu a nazveme ho spoločnýPosun
. Jeho hodnotu nastavíme na 0.
V tele konštruktora mu priradíme hodnotu 25, tak aby sa táto hodnota stále
pripočítavala. Tento statický atribút zabezpečí spoločný posun všetkých
tlačidiel o 25 bodov od tlačidiel navzájom.
Napíšeme príkaz pomocou, ktorého definujeme verejný statický
zoznam, ktorý bude obsahovať vytvorené tlačidlá. Použijeme pri tom triedu GRobot.Zoznam
. Zoznam
pomenujeme ako všetkyTlačidlá
.
Na koniec konštruktora zadáme príkaz, ktorým sa pridá každé nové tlačidlo do
vytvoreného zoznamu.
Vzhľadom na to, že robot sa pri spustení utility nachádza
v strede plátna, potrebujeme vytvoriť metódu, ktorou zabezpečíme
umiestnenie tlačidiel v hornej časti. Metóda musí byť verejná
a pretože nevracia žiadnu hodnotu bude typu void
. Pomenujeme ju umiestniTlačidlo
.
Použijeme v nej príkaz skočNa()
, v ktorom nastavíme posun + 17 + posunTlačidla
od ľavého
horného okraju sveta. Potrebujeme ešte definovať atribút posunTlačidla
ako
súkromný a celočíselný, ktorého hodnota sa bude rovnať hodnote spoločnýPosun
. Od
horného okraja sveta nastavíme hodnotu -17.
Na záver definujeme metódu, ktorá zavolá predchádzajúcu metódu a po vytvorení tlačidiel ich umiestni tlačidlá zo zoznamu do hornej časti sveta.
Teraz by sme mali mať pred sebou triedu, ktorá vyzerá rovnako ako obrázok č. 2.
Obrázok č. 2: Trieda ObrázkovéTlačidlo
Ak vaša trieda vyzerá rovnako, môžete ju preložiť a zatvoriť.
Vráťme sa do triedy EasEdit
, kde budeme pokračovať v tvorení
tlačidiel. Naprogramujeme v nej metódu, ktorá nebude vracať hodnotu, čiže
bude beztypová a nazveme ju vytvorTlačidlá
. Definujeme súkromný atribút tlačidloNástrojaCeruzka
s použitím predchádzajúcej triedy.
V tele metódy zabezpečíme, aby sa robot vrátil na svoju
predvolenú pozíciu s predvoleným smerom. Hrúbku čiary mu nastavíme na 0,5.
Pomocou obrázka pencil.png vytvoríme tlačidlo nástroja ceruzka. Takto
postupujeme aj pri tvorbe tlačidloNástrojaGuma.
Pri tvorbe ostatných nástrojov(elipsa, štvorec, kruh, obdĺžnik) použijeme
príkaz kresliDoObrázka()
.
Kruh a štvorec so zadaným rozmerom 8. Elipsa a obdĺžnik
s rozmermi 8 × 4.
V konštruktore zavoláme metódu vytvorTlačidlá
a metódu
z triedy ObrázkovéTlačidlo
umiestniTlačidlá
.
Keď preložíme triedu a spustíme utilitu, mali by sme vidieť tlačidlá
v hornej časti sveta, podobne ako na obrázku č. 3.
Obrázok č. 3: Ukážka grafickej utility s prvými tlačidlami nástrojov
Vytvoríme triedu, ktorej úlohou bude kresliť tlačidlá hrúbky
čiary. Importujeme do nej knižnice GRobot
a Farebnosť
. Trieda je odvodená od triedy ObrázkovéTlačidlo
.
Konštruktor bude prijímať dva argumenty: r
typu GRobot
a hČ
typu double
. Pomocou metódy kresliDoObrázka
zavoláme
metódu obrázok()
z triedy GRobot
.
Ďalej voláme metódu farba z knižnice Farebnosť
, tak aby bola
farba čierna. Hrúbka čiary sa bude odvíjať od hodnoty parametra hČ
. A doplníme
príkazy skočNa(-10, 0)
a choďNa(10, 0)
,
tie zabezpečia aby sa tlačidlá zobrazili tam, kde to potrebujeme
a v takom tvare. Skúste tieto príkazy zmeniť alebo ich tam nezadať
a presvedčte sa ako program po týchto úpravách vyzerá.
Najskôr však definujte v triede EasEdit
atribúty
k tlačidlám hrúbky čiary a triedu preložte. Hrúbky pera nastavíme na
0,5; 1,0; 2,5; 5,0; 7,5; 10,0.
Zdrojový kód triedy TlačidloHrúbkyČiary
vidíme na obrázku č. 4.
Obrázok č. 4: Trieda TlačidloHrúbkyČiary
Pridajme ešte tlačidlá na zvolenie farby. Na to potrebujeme
vytvoriť znova novú triedu, ktorá bude odvodená od triedy ObrázkovéTlačidlo
. Do
triedy importujeme dve knižnice GRobot
a Farebnosť
. Konštruktor tejto triedy má dva
parametre: GRobot r, GRobot.Farba
f
. Pomocou nich budeme volať jednotlivé metódy z triedy
GRobot.
Pomocou metódy kresliDoObrázka
zavoláme metódu obrázok()
z triedy GRobot
. A budeme
volať všetky ostatné metódy ako sú farba
, tú definujeme v triede EasEdit
a výplň
. Farbu na okraji
tlačidla nastavíme na čiernu z knižnice Farebnosť
. A poslednú zavoláme metódu na
vytvorenie štvorca s rozmerom 9,5
. Tento štvorec vytvárame preto, aby boli
tlačidlá vizuálne oddelené od sveta. Ak by sme ho nevytvorili, biela farba by splynula
s farbou plátna sveta, keďže aj to má rovnakú farbu. Aj v prípade
zmeny farby plátna je dôležité takéto vizuálne odlíšenie.
Teraz v triede EasEdit
pridáme všetky potrebné atribúty,
podobne ako pri triede ObrázkovéTlačidlo
.
Zadáme nasledujúce farby: červená, zelená, modrá, tyrkysová, purpurová, žltá,
čierna, biela.
Ak ste všetko správne spravili, mala by Vaša hlavná trieda vyzerať podobne ako na obrázku č.5.
Obrázok č. 5 : Ukážka metódy vytvorTlačidlá v triede
EasEdit
V našej grafickej utilite používame niekoľko nástrojov.
Je jednoduchšie vytvoriť si spoločnú triedu typu enum
s názvom Nástroj
. Do nej vložíme sériu
konštánt, ktoré používame.
Potrebujeme:
–
predvolený nástroj: ŽIADNY,
–
rastrové nástroje: CERUZKA, GUMA,
–
vektorové nástroje: KRUŽNICA, ELIPSA, ŠTVOREC, OBDĹŽNIK,
–
ďalšie
nástroje: ÚPRAVY.
To je všetko, čo do tejto triedy dáme.
Obrázok č. 6: Trieda Nástroj
Na začiatku triedy EasEdit
definujeme súkromný atribút nástroj
a priradíme
mu predvolený nástroj.
Teraz môžeme pridať aj tlačidlo na úpravu. Vzhľad tlačidla vytvoríme pomocou pečiatky robota. Definujeme mu potrebné atribúty, tak ako pri ostatných tlačidlách.
Vráťme sa späť do triedy EasEdit
, kde vytvoríme ponuku, ktorá sa bude
zobrazovať nad tlačidlami. Definujeme teda novú metódu s názvom vytvorPonuku
. Žiadnu
hodnotu nám nebude vracať späť, preto bude typu void
.
Do tela metódy budeme pridávať teraz jednotlivé položky
s ich mnemonickými klávesovými skratkami (Alt + …) a klávesovými
kombinačnými skratkami s klávesom Ctrl. Vždy najskôr definujeme mnemonickú
skratku a až potom skratku s klávesom Ctrl. Viac o skratkách
nájdete aj v dokumentácií programovacieho rámca v triede GRobot.PoložkaPonuky
.
Hlavným položkám ponuky zadefinujeme iba mnemonickú skratku.
Pre každú položku vytvoríme súkromný atribút, tak ako pri tlačidlách. Spravíme tri hlavné položky ponuky a to Ponuka, ktorej názov sa pridelí automaticky, Farby a štetce a Nástroje. Ponuka bude obsahovať nasledujúce možnosti:
– Čítať pozadie (Alt + N, Ctrl + I)
– Uložiť pozadie (Alt + U, Ctrl + D)
– Vymazať pozadie (Alt + M, Ctrl + R)
Farby a štetce (Alt + F) ponúknu tieto možnosti:
– Červená farba (Alt + E)
– Zelená farba (Alt + Z)
– Modrá farba (Alt + M)
– Tyrkysová farba (Alt + Y)
– Purpurová farba (Alt + U)
– Žltá farba (Alt + A)
– Čierna farba (Alt + I)
– Biela farba (Alt + L)
– Hrúbka pera 0,5 (Alt + 0, Ctrl + 1)
– Hrúbka pera 1,0 (Alt + 1, Ctrl + 2)
– Hrúbka pera 2,5 (Alt + 2, Ctrl + 3)
– Hrúbka pera 5,0 (Alt + 5, Ctrl + 4)
– Hrúbka pera 7,5 (Alt + H, Ctrl + 5)
– Hrúbka pera 10,0 (Alt + P, Ctrl + 6)
Hrúbku pera oddelíme od možností farieb oddeľovačom ponuky.
Možnosti Nástrojov (Alt + N):
– Ceruzka (Alt + C, Ctrl + K)
– Guma (Alt + G, Ctrl + E)
Ponuku predelíme a pokračujeme:
– Kružnica (Alt + K, Ctrl + J)
– Elipsa (Alt + E, Ctrl + B)
– Štvorec (Alt + V, Ctrl + L)
– Obdĺžnik (Alt + O, Ctrl + G)
Poslednýkrát oddelíme možnosti a pridáme voľby Úpravy tvaru (Alt + U, Ctrl + U) a Vytvoriť pozadie (Alt + T, Ctrl + T).
K týmto možnostiam ponuky vytvoríme aj súkromné
atribúty na začiatku tela triedy. Ako posledné v tejto metóde zavoláme
ďalšiu metódu, ktorú ideme vytvárať označPoložkyPonuky
.
Úlohou tejto metódy bude aktualizovať označenia nami zvolených
možností v ponuke ikonami obrázkov, ktoré sme uviedli na začiatku
v časti ikony, a tak odlíšiť zvolené možnosti od nezvolených. Všetky
metódy boli doteraz typu void
a ani táto nebude výnimkou.
Na začiatku definujeme premennú Farbu f
na
zavolanie metódy GRobota
farba()
a premennú hČ
typu double
na zavolanie metódy GRobota hrúbkaČiary()
. Potom
priradíme každej položke z ponuky Farby a štetce
a z ponuky Nástroje ikonu
pokiaľ je položka aktívna a ikonu neaktívnej položky. Použijeme na to
obrázky select-yes.png
v prípade aktívnosti a select-no.png
v prípade neaktívnej položky. Na položku
Vytvor pozadie
nedefinujeme žiadnu ikonu aktívnosti a neaktívnosti, pretože to nemá
význam. Rovnako nedefinuje ani na ostatné položky súvisiace s pozadím.
Telo tejto metódy vidíme na obrázku č. 7.
Obrázok č. 7: Metóda označPoložkyPonuky
Úlohou tejto metódy je vytvoriť na plátne pozdanie pomocou generovania fraktálu. V našom prípade ide o Mandelbrotovu množinu. Do programu sme to zahrnuli ako príklad, toho ako sa dajú takéto fraktály programovo generovať. Existuje ich viacero typov, aj možností ich tvorby. Podrobnosti o Mandelbrotovej množine nájdete v publikácií Jozef Zámožík a kol.: Základy počítačovej grafiky alebo na stránke http://chaos.fraktaly.sweb.cz/strs/4/mset.htm. Autor porovnáva aj spôsoby tvorby Mandelbrotovej množiny medzi niektorými jazykmi. Tvorba tejto triedy závisí len od vás a je určená na samostatné štúdium. Uvediem ešte možnosť ako sa dá vygenerovať táto množina pomocou programovacieho rámca GRobot (pozri obrázok č. 8).
Obrázok č. 8: Metóda vytvoriťPozadie
Výsledkom zdrojového kódu metódy vytvoriťPozadie
je
vytvorenie pozadia s Mandelbrotovou množinou zobrazenej na obrázku č. 9,
tak ako ju vygenerovala grafická utilita EasEdit
.
Obrázok č. 9: Vytvorené pozadie – Mandelbrotova množina
Úlohou tejto metódy je (ako názov naznačuje) prekresliť scénu. Presnejšie: metóda nastaví vhodné parametre grafického robota a na rastrové pozadie postupne nakreslí všetky vektorové tvary, ktoré používateľ doteraz na scénu vložil. Tvary sú nakreslené v tom poradí, v akom ich používateľ vkladal, pretože aplikácia zatiaľ neumožňuje upravovať poradie kreslenia tvarov tak, ako sme na to zvyknutí v iných vektorových grafických editoroch. (Túto funkciu sme v tejto fáze vývoja aplikácie nepovažovali za dôležitú.)
Metóda je použitá (volaná) v reakcii aktivita hlavného
robota, ktorá je spúšťaná v pravidelnom časovom intervale, avšak spustenie
metódy je podmienené hodnotou atribútu prekresli, ktorý slúži ako príznak
potreby prekreslenia. Jeho hodnota je priebežne zmenená na true
vždy, keď sa niečo
na scéne zmení. Naopak v tele metódy prekresliScénu
je hodnota tohto príznaku
zresetovaná na false
.
Vytvoríme si atribút menoSúboru
typu String
. Hodnota tohto atribútu je rovná názvu
súboru, ktorý otvoríme pomocou príkazu na otvorenie dialógu dialógOtvoriť
z triedy Súbor
.
Po spustení metódy sa otvorí používateľský dialóg otvorenia súboru. Ak
používateľ dialóg potvrdí, tak metóda vráti reťazec s úplnou cestou
a názvom súboru zvoleného v dialógu používateľom. Ak používateľ
dialóg zruší, tak návratová hodnota metódy bude null
. Nadpis hlavičky dialógu môže byť
Zvoľte súbor, preddefinovaný názov súboru nastavíme na pozadie.png
a typ
súboru môžeme nastaviť na "Obrázky
vo formátoch GIF, PNG a JPEG (*.gif, *.png, *.jpeg…)"
.
Vytvoríme podmienku, v ktorej definujeme, čo program
spraví, ak sa názovSúboru
nerovná hodnote null
.
Musíme zavolať metódu uvoľni. „Slúži na odstránenie konkrétneho robota (alebo
inštancie odvodeného typu) z vnútorného zoznamu robotov. Prijíma jeden
argument typu GRobot (to znamená, že môže ísť aj o ľubovoľnú inštanciu
odvodeného údajového typu). Objekt bude potom vymazaný z vnútorného
zoznamu robotov. Keď aplikácia zabezpečí vynulovanie všetkých premenných, v ktorých
je stanovená inštancia uložená, objekt by mal byť bude uvoľnený z pamäte
počítača zberačom odpadkov Javy. Uvoľneného robota už nie je možné do sveta
vrátiť! V prípade, že je uvoľnený hlavný robot, nastúpi na jeho miesto
najbližší jestvujúci robot. Problém by mohol nastať, ak by nebol k dispozícii
žiadny ďalší robot, ktorý by ho mohol nahradiť.“ (Horváth, 2014) Zavoláme metódu
kresli, ktorá nakreslí pozadie zo zvoleného súboru. Na začiatku triedy si
definujeme ešte jeden súkromný atribút typu boolean
, ktorému nastavíme hodnotu false
. Po zavolaní
metódy kresli
nastavíme tomuto atribútu hodnotu true
. Tým by sa mal celý Svet
prekresliť.
Obrázok č. 10: Metóda prekresliScénu a metóda čítajPozadie
Podobne ako v predchádzajúcej metóde na začiatku
vytvoríme dialóg s názvom súboru typu String
. A nastavíme mu tento text "Zvoľte súbor"
,
"pozadie.png"
,
"Obrázky vo formáte
PNG (*.png)"
. Prvé spojenie sa zobrazí v hlavičke
dialógu, druhé je preddefinované meno súboru a posledné je typ súboru,
v ktorom si želáme obrázok uložiť.
Pridáme podmienku, ktorá zabezpečí, aby názov súboru nemohol byť prázdny. Ďalšou podmienkou bude podmienka týkajúca sa mena súboru, ten musí končiť príponou .png, ak tak nie je, program ju k názvu pridá. Do nej vnoríme podmienku, ktorá skontroluje prítomnosť zadaného názvu v priečinku so súbormi, ktoré používa program. Ak nájde zhodu vypíše správu o nemožnosti prepísanie takéhoto súboru, pretože je súčasťou programu. Pridáme ešte podmienku, ktorá dokončí kontrolu prítomnosti súboru so zdaným menom s ostatnými súbormi v priečinku. Pokiaľ nájde zhodu vypíše otázku, či si používateľ želá tento súbor prepísať. Inak utilita pozadie uloží a vypíše správu, že sa súbor uložil, v ktorej zobrazí aj názov súboru.
Obrázok č. 11: Metóda uložPozadie
Táto metóda sa skladá iba z podmienky, ktorá po kladnej odpovedi používateľa na otázku „Skutočne chcete vymazať pozadie?“, vymaže pozadie a hodnotu prekresli nastaví na true.
Metóda pracuje s viacnásobným vetvením. Jej úlohou je uložiť predvolenú hodnotu nástroja. Ak si zvolíme nástroj guma a máme vybranú istú hrúbku čiary, hrúbka čiary bude rovnaká ako hrúbka gumy. Hrúbka kreslenie sa rovná veľkosti hrúbky čiary a farba kreslenia sa rovná farbe. S tým budú súvisieť aj atribúty na začiatku triedy. Metóda zálohuje hodnoty aktuálneho nástroja predtým, než nastane prepnutie do iného nástroja.
V definícií atribútov triedy vytvoríme nový zoznam
tvarov, ktorý bude súkromný a konečný. Pre kreslený a upravovaný tvar
nastavíme hodnotu null
.
Predvolenú farbu kreslenia nastavíme na čiernu a hrúbku kreslenia na 0,5.
Hrúbka gumy bude nastavená na 10,0.
Obrázok č. 12: Metódy vymažPozadie
a uložPredvolenéHodnotyNástroja
Metóda zmeňFarbu
používa parameter farba
.
Zabezpečuje zmenu farby upravovaného tvaru. To znamená, že ak klikneme na určitý
tvar, môžeme meniť jeho farbu.
Metóda zmeňHrúbkuČiary
používa
parameter hrúbkaČiary
typu double
.
Ak je tvar upravovaný, používateľ má možnosť nastaviť ľubovoľnú hrúbku čiary.
Obrázok č. 13: Metódy zmeňFarbu a zmeňHrúbkuČiary
Metóda zvoľCeruzku
uloží aktuálne hodnoty nástroja, zvolí farbu a hrúbku kreslenia
a zabezpečuje prekreslenie plátna pri používaní nastroja.
Metóda zvoľGumu
uloží aktuálne hodnoty nástroja, zvolí hrúbku gumovania
a prekresľuje plátno pri použití nástroja.
Zvolenie nástroja kružnica
a nastavenie hrúbky okraja
kružnice, jeho farby a prekreslenie scény pri práci s týmto nástrojom
zabezpečuje metóda zvoľKružnicu
.
Rovnaké činnosti vykonávajú aj metódy zvoľElipsu
, zvoľŠtvorec
, zvoľObdĺžnik
, zvoľÚpravy
.
Obrázok č. 14: Ukážka niektorých metód zvoľ
Táto metóda zabezpečuje opätovné rozmiestnenie tlačidiel v prípade zmeny veľkosti okna používateľom.
Metóda je reakciou na voľbu používateľa niektorej z položiek ponuky, má za úlohu zavolať metódu prislúchajúcu k zvolenej položke ponuky po jej zvolení. Ak používateľ zvolí položku, táto reakcia, okrem toho, že zavolá potrebnú metódu, aktualizuje ikony všetkých položiek ako zvolenú pokiaľ používateľ nezvolí inú položku tej ponuky.
Obrázok č. 15: Metóda voľbaPoložkyPonuky
Ak používateľ programu zvolí nejaké tlačidlo, ktoré je na plátne, tak táto metóda zavolá danú metódu na obsluhu tohto tlačidla. Zároveň označí položku ponuky, ktorá patrí funkcii tohto tlačidla.
Obrázok č. 16: Metóda voľbaTlačidla
Metóda zabezpečuje označenie tvaru v prípade, že klikneme myšou na nejaký tvar a máme zvolený nástroj úpravy.
Obrázok č. 17: Metóda klik a metóda pohybMyši
Táto metóda obsluhuje udalosť pri zvolení nástroja a začiatok kreslenia s nástrojom. Po zvolení nástroja zavolá triedu zvoleného nástroja.
Zabezpečuje obsluhu udalosti ťahania myšou pri kreslení nástrojmi a pri úpravách so všetkými nástrojmi. V rámci tejto metódy sa prekresľuje aj svet, tak aby bolo vidieť každú zmenu, ktorú používateľ na plátne spraví. Keď používateľ upravuje nejaký tvar alebo ho kreslí, tak sa plátno vždy prekreslí. Rovnako je to aj pri práci s nástrojom ceruzka, ktorý je predvoleným nástrojom programu a nástroji guma.
Úlohou metódy je po nakreslení tvaru, nastaviť hodnotu null
pre atribút
kreslený a hodnotu true
pre prekresli. Metóda dokončuje proces kreslenia. V prípade, že je práve
kreslený nový tvar pridá do zoznamu všetkých vytvorených tvarov novovzniknutý
tvar a hodnotu atribútu kreslený
nastaví na null
– vkladanie tvaru je dokončené.
Obrázok č. 18: Metódy ťahanieMyšou a uvoľnenieTlačidlaMyši
Metóda vytvára kurzor myši pohybujúcej sa po plátne. Pri
zvolení nástroja guma
bude kurzor mať tvar zodpovedajúci tvaru tlačidla nástroja guma
. Pri zvolení
nástroja pera a zvolení jeho farby a hrúbky bude mať aj kurzor myši
farbu a hrúbku zodpovedajúcej zvoleným hodnotám a bude mať tvar ikony
tlačidla nástroja ceruzka
.
Táto trieda je abstraktná preto pri jej tvorbe vyberieme
v BlueJ túto možnosť. Do triedy importujeme dve knižnice, ktoré budeme používať.
Sú to knižnica.GRobot
a statická knižnica java.lang.Math.*
.
Definujeme verejný, konštantný, statický atribút typu double KLIK
, ktorému
nastavíme hodnotu na 10,0
.
Konštanty ZMENA_VEĽKOSTI, ZMENA_ŠÍRKY, ZMENA_VÝŠKY, ROTÁCIA, PRESUN
pridáme do verejného vymenovaného typu s názvom Režim
.
Ďalej vytvoríme chránený atribút typu boolean
s hodnotou false
a s menom označený
.
Zo zoznamu konštánt vyberieme ZMENA_VEĽKOSTI
a priradíme ju k chránenému
atribútu režim. Hrúbku čiary nastavíme ako tiež chránený atribút typu double
. Dva atribúty farba
a farbaOznačenia
z triedy GRobot.Farba
definujeme ako chránené.
Konštruktoru pridáme parameter GRobot r
. Pomocou neho zavoláme metódy farba()
a hrúbkaČiary()
a definujeme
ich ako atribúty farba
a hrúbkaČiary
.
farbaOznačenia
bude
volať metódu z triedy GRobot.Farba
s názvom ~farba.getRGB()
.
Metóda typu void označ
s parametrom typu boolean označ
.
V tejto metódy zmeníme stav premennej označený
na označ.
Verejná metóda označený
s návratovou hodnotou boolean
prečíta hodnotu
premennej označený
.
zapniRežimZmenyVeľkosti
je ďalšia metóda, ktorá nevracia žiadnu hodnotu a je verejná. Nastaví
režim na zmenu veľkosti.
Podobne aj metóda zapniRežimZmenyŠírky
prepne režim na zmenu
šírky. Tak je to aj pri ostatných metódach ako nám už aj ich samostatný názov
hovorí: zapniRežimZmenyVýšky,
zapniRežimRotácie, zapniRežimPresunu
.
Verejná metóda režim
je getter, ktorý číta režim.
Metóda nastavHrúbkuČiary
je verejná a nemá návratovú hodnotu. Metóda používa parameter GRobot r
. Nastavuje
zvolenú hrúbku čiary.
Verejnou metódou nastavFarbu
s parametrom GRobot r
nastavíme farbu
a nastavíme farbuOznačenia
pomocou
zavolania new
GRobot.Farba(~farba.getRGB())
.
Metóda začniŤahanie
s návratovou hodnotou typu boolean
je verejná a vracia robota na metódu kliknuté(r)
.
Metóda ťahanieMyšou
aj s predchádzajúcimi metódami sú iba definíciami predvoleného správania
sa programu. Je to spôsobené dedičnosťou z triedy EasEdit
, kde sú metódy
vytvorené. Ich účelom je obslúžiť reakciu kliknutia a ťahania myšou
a sú volané v triede EasEdit
.
V metóde kresli
s parametrom GRobot r
sa nastaví predvolená hrúbka
čiary a jej predvolená farba.
Verejná statická metóda bodÚsečky
typu double
s parametrami: xc, yc, xb, yb, xa, ya
a všetky
sú typu double
.
Táto metóda vypočíta aká je vzdialenosť kolmice na úsečku od určitého bodu.
Funkcia hypot
je „zjednodušená pytagorova veta“, ktorá slúži na výpočet vzdialenosti.
Na výpočet najbližšieho bodu na úsečke nám slúži statická
metóda najbližšíBodNaÚsečke
.
Má parametre typu double:
xc, yc, xb, yb, xa, ya
.
rotujBod
je metóda, ktorú zaraďujeme do katedórie matematických transformácií. Jej
úlohou je vypočítať novú súradnicu, ktorá vznikne po rotácii okolo určitého
bodu. Používa pri tom pôvodné súradnice a sínus aj kosínus uhlov,
podľa toho o aký uhol je tvar rotovaný. Transformáciou dosiahneme, že bod
rotácie je nami určený a nie je to bod stredu súradnicovej sústavy[0, 0].
Obrázok č. 19: Ukážka časti triedy Tvar
Do triedy sú importujeme dve knižnice GRobot
a java.lang.Math.*
. Trieda
je odvodená od triedy Tvar
.
V konštruktore triedy sú definované tri súkromné atribúty x, y, r
typu double
.
Úlohou tejto triedy je kreslenie kružnice na plátno so
zvolenou hrúbkou čiary a farbou. Ak je tvar označený tak sa zväčší hrúbka
čiary. Pri ťahaní myšou sa aplikácia prepne buď do režimu ZMENY_VEĽKOSTI
alebo do
režimu PRESUNU
.
Ak označíme a klikneme do jej stredu zapneme tak režim
presunu, pokiaľ ale klikneme na okraj kružnice spustíme režim zmenyVeľkosti
. Kliknutie
do stredu alebo na okraj kružnice ale neznamená, že sa musíme presne trafiť na
jeden určitý bod na plátne, určite by sa nám to nedarilo na prvý pokus, preto
sa za kliknutie do stredu alebo na okraj kružnice počíta kliknutie aj do okolia
týchto bodov. Veľkosť tohto okolia závisí od nastavenie hodnoty KLIK
.
Obrázok č. 20: Trieda Tvar
V triede sú importujeme rovnaké knižnice ako
v predošlej triede Kružnica
.
V konštruktore sú definované súkromné atribúty typu double: x, y, r, u, x0, y0, x1, y1,
x2, y2, x3, y3, u0
. Aj táto trieda je odvodená od triedy Tvar
, takže je predkom
triedy a dedí jej vlastnosti.
Úlohou triedy je nakresliť štvorec na plátno pomocou robota,
rozlišovať polohu myši pri kliknutí, vypočítať súradnice rohových bodov, po
dvojitom kliknutí prepnúť do režimu ROTÁCIA
, pri jednom kliknutí metóda kliknuté
zistí, či je
klik v strede tvaru alebo sa bod kliknutia nachádza na nejakom bode
úsečky, podľa toho sa zmení režim. Ak klikneme do stredu a ťaháme istým
smerom zapne sa režim PRESUN
.
Pokiaľ klikneme na bod na úsečke a ťaháme myšou istým smerom zapne sa
režim ZMENA_VEĽKOSTI
.
Pri každej zmene tvaru počíta nové súradnice jednotlivých bodov.
O kliknutí na určitý bod platí to isté, čo aj v predošlej triede
a teda nemyslí sa len jeden bod ale aj jeho blízke okolie.
Obrázok č. 21: Metóda kresli triedy Štvorec
Rovnako s importovaním knižníc je to aj v tejto triede.
Trieda je odvodená od triedy Tvar
. V úvode konštruktoru sú definované súkromné
atribúty typu double: x,
y, a, b, u, x0, y0, x1, y1, x2, y2, x3, y3, u0, myšX, myšY
.
Trieda nakreslí elipsu na plátno, ktorá ma rozmery a × b
, kde a
je šírka a b
je výška. Keďže
predvolená orientácia robota je 90°, rozmery budú obrátené. Na presun elipsy
musí byť elipsa označená a presúvame ju ťahaním stredového bodu. Rotáciu
elipsy začneme kliknutím na okraj označenej elipsy a ťahaním myšou do
zvoleného smeru. Jedným klikom na okraj elipsy prepíname medzi režimom rotácie
zmeny veľkosti. Pomocou pytagorovej vety utilita vypočíta bod kliknutia a podľa
toho mení rozmery buď výšky alebo šírky. K rozmerom a, b
sa pripočítava
hodnota KLIK
,
ktorá má funkciu pri kliknutí na rohové body.
Obrázok č. 22: Metóda ťahanieMyšou triedy Elipsa
V triede sú importované knižnice GRobot
a java.lang.Math.*
. Táto
verejná trieda je dovodené od triedy Tvar
. Na začiatku tela konštruktora definujeme
hneď niekoľko súkromných atribútov typu double
, s ktorými budeme pracovať
v tejto triede. Sú to: x, y, a, b, u, x0, y0, x1, y1, x2, y2, x3, y3, u0, myšX, myšY,
vzdialenosť1, vzdialenosť2, vzdialenosť3, vzdialenosť4
.
Medzi funkcie triedy patrí vytvorenie obdĺžnika na plátne, zmenu jeho veľkosti, šírky alebo výšky, rotácia a taktiež aj jeho presun po plátne.
Keď označíme obdĺžnik na plátne jedným kliknutím, môžeme tento tvar posúvať v smere ťahania myši za stredový bod. Ak chceme meniť výšku obdĺžnika alebo jeho šírku, musíme ťahať obdĺžnik za bod na strane, ktorej rozmer sa nemení. Teda, ak chceme meniť rozmer strán a, tak musíme ťahať za jeden z bodov na strane b do smeru, ktorým chceme rozmer zväčšiť alebo zmenšiť. Rovnako postupujeme aj pri zmene rozmeru strany b.
Ak chceme meniť rozmery oboch strán súčasne, ťaháme za jeden z rohových bodov obdĺžnika smerom podľa našej potreby.
Podobne je to aj pri rotácií obdĺžnika avšak s tým rozdielom, že na označený tvar musíme kliknúť ešte raz, aby sme zmenili režim zmeny veľkosti na režim rotácie (otáčania) tvaru. Potom už len ťaháme v smere, ktorým potrebujeme objekt rotovať.
Trieda na základe vzdialeností od rohových bodov a stredového bodu určí, ktorý režim má zapnúť.
Obrázok č. 23: Vybrané metódy triedy Obdĺžnik
@SuppressWarnings
– Táto anotácia informuje kompilátor, aby potlačil všetky varovania určitého typu,
ktoré by inak generoval. Platí to i pre všetky programové elementy
obsiahnuté v takto anotovanom elemente. Na začiatku tried ObrázkovéTlačidlo, FarebnéTlačidlo
a TlačidloHrúbkyČiary
umiestnime túto anotácia, aby kompilátor mal informáciu o tom, že
nepoužívame ani nedefinujeme serial ID
. Neprítomnosť tejto anotácie, nijak neovplyvňuje činnosť
utility, iba dáva informáciu kompilátoru.
–
Aké nástroje by ste do EasEdit
pridali?
– Dokázali by ste do grafickej utility pridať nástroj na vystrihovanie pomocou programovacieho rámca GRobot?
– Myslíte si, že generovanie pozadia je v grafickej utilite výhodné ? Ako by ste naprogramovali podobné generovanie fraktálov?
– Výplň tvarov je častou funkciou grafických editorov. Navrhnite spôsob vypĺňania tvarov pomocou programovacieho rámca GRobot. Je možné vypĺňať tvary pomocou generovania fraktálov?
HORVÁTH, Roman: Dokumentácia
skupiny tried grafického robota pre Javu. Trnava : Pedagogická fakulta
Trnavskej univerzity v Trnave, 2014. Dostupné na internete: «http://cec.truni.sk/horvath/GRobot/».
ISBN 978‑80‑8082‑796‑0. Naposledy pristúpené:
18. 4. 2017.
ŠPIČKA, Ivo – FRISCHER, Róbert: Počítačová
geometrie a grafika. Ostrava : Technická univerzita Ostrava,
2010. 114 s. ISBN 978‑80‑248‑2590‑8.
Mandelbrotova množina.
Dostupné na internete: «http://chaos.fraktaly.sweb.cz/strs/4/mset.htm».
Naposledy pristúpené: 18. 4. 2017.
Súbor s obrázkami tlačidiel:
Súbor s triedami grafickej utility EasEdit
:
Pripájame tento súbor iba ako pomôcku pre študentov, ktorí sa budú potrebovať presvedčiť o správnosti svojich krokov. Súbor nie je určený lenivým študentom. Odporúčame samostatné naprogramovanie grafickej utility.