Zoznam obrázkov. 3

Požiadavky. 4

Cieľ kurzu. 4

Hlavná trieda. 5

Trieda ObrázkovéTlačidlo. 5

Trieda TlačidloHrúbkyČiary. 7

Trieda FarebnéTlačidlo. 8

Trieda Nástroj 10

Metóda vytvorPonuku. 10

Metóda označPoložkyPonuky. 11

Metóda VytvoriťPozadie. 12

Metóda prekresliSénu. 14

Metóda čítajPozadie. 14

Metóda uložPozadie. 15

Metóda vymažPozadie. 16

Metóda uložPredvolenéHodnotyNástroja. 16

Metódy zmeňFarbu a zmeňHrúbkuČiary. 17

Metódy zvoľCeruzku a zvoľGumu. 18

Metóda zmenaVeľkostiOkna. 18

Metóda voľbaPoložkyPonuky. 19

Metóda voľbaTlačidla. 19

Metóda klik. 20

Metóda stlačenieTlačidlaMyši 21

Metóda ťahanieMyšou. 21

Metóda uvoľnenieTlačidlaMyši 21

Metóda kresliTvar. 22

Trieda Tvar. 22

Trieda Kružnica. 24

Trieda Štvorec. 26

Trieda Elipsa. 27

Trieda Obdĺžnik. 28

Poznámka. 30

Otázky: 30

Príloha. 30

 


Zoznam obrázkov

Obrázok č. 1: Ukážka prázdnej triedy EasEdit. 5

Obrázok č. 2: Trieda ObrázkovéTlačidlo. 6

Obrázok č. 3: Ukážka grafickej utility s prvými tlačidlami nástrojov. 7

Obrázok č. 4: Trieda TlačidloHrúbkyČiary. 7

Obrázok č. 5 : Ukážka metódy vytvorTlačidlá v triede EasEdit. 9

Obrázok č. 6: Trieda Nástroj 10

Obrázok č. 7: Metóda označPoložkyPonuky. 12

Obrázok č. 8: Metóda vytvoriťPozadie. 13

Obrázok č. 9: Vytvorené pozadie – Mandelbrotova množina. 13

Obrázok č. 10: Metóda prekresliScénu a metóda čítajPozadie. 15

Obrázok č. 11: Metóda uložPozadie. 16

Obrázok č. 12: Metódy vymažPozadieuložPredvolenéHodnotyNástroja. 17

Obrázok č. 13: Metódy zmeňFarbu a zmeňHrúbkuČiary. 17

Obrázok č. 14: Ukážka niektorých metód zvoľ 18

Obrázok č. 15: Metóda voľbaPoložkyPonuky. 19

Obrázok č. 16: Metóda voľbaTlačidla. 20

Obrázok č. 17: Metóda klik a metóda pohybMyši 20

Obrázok č. 18: Metódy ťahanieMyšou a uvoľnenieTlačidlaMyši 22

Obrázok č. 19: Ukážka časti triedy Tvar. 24

Obrázok č. 20: Trieda Tvar. 25

Obrázok č. 21: Metóda kresli triedy Štvorec. 27

Obrázok č. 22: Metóda ťahanieMyšou triedy Elipsa. 28

Obrázok č. 23: Vybrané metódy triedy Obdĺžnik. 29

 


 


 

 

 

 

 

 

 

Sprievodca programovaním jednoduchej grafickej aplikácie EasEdit

Požiadavky

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        eraser.png

pencil         pencil.png

select-no          select-no.png

select-yes          select-yes.png

Cieľ kurzu

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.

Hlavná trieda

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)).

Trieda ObrázkovéTlačidlo

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

Trieda TlačidloHrúbkyČiary

Vytvoríme triedu, ktorej úlohou bude kresliť tlačidlá hrúbky čiary. Importujeme do nej knižnice GRobot Farebnosť. Trieda je odvodená od triedy ObrázkovéTlačidlo. Konštruktor bude prijímať dva argumenty: typu GRobot 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 . A doplníme príkazy skočNa(-10, 0)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

Trieda FarebnéTlačidlo

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 GRobotFarebnosť. 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 EasEditvý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


 

Trieda Nástroj

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.

Metóda vytvorPonuku

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 štetceNá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.

Metóda 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ú 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

Metóda VytvoriťPozadie

Ú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

Metóda prekresliScénu

Ú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.

Metóda čítajPozadie

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

Metóda uložPozadie

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

Metóda vymaž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 uložPredvolenéHodnotyNástroja

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žPozadieuložPredvolenéHodnotyNástroja

Metódy zmeňFarbu a zmeňHrúbkuČiary

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ódy zvoľCeruzku a zvoľGumu

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ľ

Metóda zmenaVeľkostiOkna

Táto metóda zabezpečuje opätovné rozmiestnenie tlačidiel v prípade zmeny veľkosti okna používateľom.

Metóda voľbaPoložkyPonuky

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

Metóda voľbaTlačidla

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 klik

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

Metóda stlačenieTlačidlaMyš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.

Metóda ťahanieMyšou

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.

Metóda uvoľnenieTlačidlaMyši

Ú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 kresliTvar

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.

Trieda Tvar

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 farbaOznačenia z triedy GRobot.Farba definujeme ako chránené.

Konštruktoru pridáme parameter GRobot r. Pomocou neho zavoláme metódy farba() hrúbkaČiary() a definujeme ich ako atribúty farbahrú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

Trieda Kružnica

Do triedy sú importujeme dve knižnice GRobotjava.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

Trieda Štvorec

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

Trieda Elipsa

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 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

Trieda Obdĺžnik

V triede sú importované knižnice GRobotjava.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

Poznámka

@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čidloTlač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.

 

 

Otázky a úlohy:

      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?

 

 

 

Použitá a odporúčaná literatúra

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.

ZÁMOŽÍK, Jozef a kol.: Základy počítačovej grafiky. Bratislava : Slovenská technická univerzita, 1999. 265 s. ISBN 80­‑227­‑1257­‑4.

Mandelbrotova množina. Dostupné na internete: «http://chaos.fraktaly.sweb.cz/strs/4/mset.htm». Naposledy pristúpené: 18. 4. 2017.

 

Príloha

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.