<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MichalJanicek</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MichalJanicek"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/MichalJanicek"/>
	<updated>2026-04-16T15:55:25Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Okn%C3%A1_a_toolbary_programu_DynaSim&amp;diff=4388</id>
		<title>Okná a toolbary programu DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Okn%C3%A1_a_toolbary_programu_DynaSim&amp;diff=4388"/>
		<updated>2010-05-18T21:38:12Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|4|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Okná a toolbary programu DynaSim=&lt;br /&gt;
==Paleta==&lt;br /&gt;
Paleta slúži ako knižnica komponentov, ktoré sa z nej dajú preniesť na editačnú plochu DynaSimu. Je aj súčasťou NetBeans IDE, kde napríklad Matisse GUI Builder ukladá AWT a Swing komponenty na paletu, a užívateľ ich potom môže pomocou drag&amp;amp;drop premiestniť na NetBeans editor. Aby sme mohli paletu v našom module používať, je potrebné pridať závislosť na Common Palette. Obsah palety je spravovaný PaletteController-om. PaletteController je prístupný DynaSimTopComponentu cez Lookup. Opäť si treba uvedomiť, že sa jedná o 2 okná, kde editačná plocha a paleta majú svoj vlastný TopComponent. PaletteController sa vytvára pomocou triedy PaletteFactory. Ako paleta môže vypadať je znázornené na nasledujúcom obrázku.&lt;br /&gt;
[[Súbor:Dynasim11.jpg|center|framed|Obr.11 Paleta komponentov v programe DynaSim]]&lt;br /&gt;
Pre tvorbu palety je možné zvoliť jeden z dvoch prístupov. Prvý spôsob je vytvoriť pre každý komponent .xml súbor, v ktorom je zapísané meno a popis komponentu. Takto vytvorené .xml súbory je potom potrebné zaregistrovať v layer.xml súbore DynaSim modulu. Druhý spôsob, ktorý som si ja pre tvorbu palety zvolil, je vytvoriť hierarchiu uzlov a z nej následne vygenerovať paletu. Je potrebné si uvedomiť, že takto vytvorená hierarchia uzlov sa skladá z troch vrstiev. Prvá vrstva predstavuje root uzol, ktorý predáme metóde createPallete() na vytvorenie jej komponentov. Druhá vrstva pozostáva z detských uzlov root uzla a definuje kategórie palety. Posledná vrstva definuje jednotlivé komponenty v kategóriách. Triedy pre tieto komponenty v programe DynaSim nesú meno Shape (tvar), preto aj na obr.12 sú označené ako Shape.&lt;br /&gt;
[[Súbor:Dynasim12.jpg|center|framed|Obr.12 Hierarchia uzlov palety]]&lt;br /&gt;
Všetky triedy pre vytvorenie palety a jej hierarchie uzlov sa nachádzajú v balíčku sk.tnuni.dynasim.palette. Trieda Category slúži len ako kontajner, ktorý v sebe drží dáta. Pri kategóriách nám postačuje, že poznáme ich meno, preto táto trieda obsahuje len getter a setter na nastavenie mena danej kategórie. Trieda CategoryChildren je už zaujímavejšia. Jej deklarácia je nasledovná:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class CategoryChildren extends Children.Keys&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Trieda Children vytvára a manažuje detské uzly a správa sa ako ich kontajner. Tu je táto trieda použitá ako manažér kategórií, ktoré sa zobrazujú na palete. Kategórie palety slúžia na rozdelenie jednotlivých komponentov do skupín (kategórií). Akým spôsobom budú komponenty rozdelené, už zostáva na užívateľovi. Children.Keys obsahuje metódu na tvorbu uzlov createNodes(). Na triedu CategoryChildren sa môžeme pozerať ako na root uzol, lebo v sebe jedna jej inštancia bude obsahovať všetky existujúce kategórie.&lt;br /&gt;
&lt;br /&gt;
Trieda CategoryNode je potomkom triedy AbstractNode a jej konštruktor dostane ako parameter inštanciu triedy Category, ktorá je následne predaná triede ShapeChildren, čím sa dostávame do ďalšej vrstvy hierarchie.&lt;br /&gt;
&lt;br /&gt;
Trieda Shape je trieda, ktorá je ekvivalent triedy Category, ale na rozdiel od Category v sebe drží dáta pre jednotlivé komponenty a to je number – poradové číslo, v súčasnej verzii nepoužívané, category – meno kategórie do ktorej tento komponent patrí, title - meno komponentu získané z XML súboru, image – cesta k súboru s ikonou, ktorá sa zobrazí na palete vedľa mena komponentu, name – meno XML súboru bez prípony, description – tooltip pre daný komponent.&lt;br /&gt;
&lt;br /&gt;
Trieda ShapeChildren je ekvivalnetom CategoryChildren, na rozdiel od CategoryChildren v sebe drží všetky uzly typu Shape danej kategórie.&lt;br /&gt;
Nakoniec trieda ShapeNode je zodpovedná za zobrazovanie jednotlivých komponentov v palete. Keďže samotné uzly komponentov už nemajú ďalšie detské uzly, supertriede predáme prázdny kontajner detských uzlov Children.LEAF. Cez metódy setDisplayName a setIconWithExtention a ďalšie podobné metódy nastavíme komponentu ako sa má v palete zobrazovať, t.j aké má mať na palete komponent meno, akú bude mať ikonu, tooltip atď. Tieto parametre sú uložené v triede Shape. Tie sa do nej dostanú za pomoci triedy BrowseFolders.&lt;br /&gt;
&lt;br /&gt;
BrowseFolders je jednoduchá trieda, ktorá prechádza priečinkami na zvolenej ceste. V rámci projektu DynaSim sa nachádza priečinok s názvom library. Ak sa pozrieme na obr.12, ''library'' sa nachádza na úrovni root. Library má svoje podpriečinky, tých môže byť ľubovoľné množstvo a môžu mať ľubovoľné pomenovanie. Tieto podpriečinky predstavujú jednotlivé kategórie a platí rovnica: meno podpriečinku = meno kategórie. Nakoniec sa prehľadá obsah týchto podpriečinkov. Ak obsahujú SVG súbory, začne sa hľadať či existuje XML súbor s rovnakým názvom. Ak áno, začne sa s ich parsovaním a z ich root elementov sa získa hodnota atribútu ''name''. Tým sa získa meno komponentu. Ďalej sa hľadá, či existuje PNG alebo GIF súbor s rovnakým menom ako parsovaný XML súbor. V prípade že existuje, použije sa ako ikona komponentu v palete. Uloží sa aj meno súboru bez prípon a z XML súboru sa získa popis pre tooltip. Trieda BrowsFolders toto všetko v konštruktore vykoná pri jej vytvorení na zadanej ceste. Tá musí byť presne určená a ukazovať na miesto s adresárom library. Na nájdenie tohto priečinku sa použije FolderSearcher, vysvetlený v kap. 3.1. Tieto získané hodnoty sa zapíšu do dvojrozmerného poľa typu String menom itemList a cez ten sa potom pristupuje k jednotlivým položkám pri nastavovaní členských premenných inštancie Shape. Prvý rozmer poľa ''itemList'' určuje poradové číslo SVG súboru z ktorého je daný komponent. Druhý rozmer má uložené hodnoty v takomto poradí: 0 – poradové čislo, 1 – názov kategórie, 2 – názov SVG súboru bez prípony, 3 – cesta k ikone komponentu, 4 – meno komponentu z XML, 5 – tooltip z XML súboru. BrowseFolders obsahuje aj statickú premennú ''folderList''. Je to jednorozmerné pole Stringov a obsahuje zoznam adresárov v ''library''.&lt;br /&gt;
&lt;br /&gt;
Doteraz bola vysvetlená len hierarchia uzlov palety a spôsob akým získavajú potrebné dáta. Teraz treba vysvetliť, ako sa vytvorí paleta samotná za pomoci týchto uzlov. Na tvorbu palety sa používa trieda PaletteController. Na tieto účely som si vytvoril triedu PaletteSupport, ktorá má na starosti manažovanie všetkých vlastností palety ako sú tvorba inštancie PaletteController, akcie paletz, či drag&amp;amp;drop. Trieda obsahuje metódu na vytvorenie palety createPallete. Jej funckia je nasledovná.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public static PaletteController createPalette() {&lt;br /&gt;
     AbstractNode paletteRoot = new AbstractNode(new CategoryChildren());&lt;br /&gt;
     paletteRoot.setName(&amp;quot;Palette Root&amp;quot;);&lt;br /&gt;
     return PaletteFactory.createPalette( paletteRoot, new MyActions(), null, new MyDnDHandler() );&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ako možno z kódu vidieť, najskôr sa vytvorí AbstractNode menom paletteRoot z nášho CategoryChildren, čo je trieda ktorá v sebe drží všetky kategórie palety. Tá si následne vytvorí jednotlivé CategoryNode a tie následne volajú ShapeChildren. Inými slovami vytvorením  paletteRoot sa nám automaticky vytvorí celá hierarchia uzlov potrebná na tvorbu palety. Funkcia potom vráti PaletteController, ktorý sa vytvorí cez PaletteFactory. Aby sme však pochopili, aká paleta sa vytvorí treba preskúmať premenné createPalette.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public static PaletteController createPalette(Node node, PaletteActions pa, PaletteFilter pf, DragAndDropHandler dadh) throws IOException&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Node predstavuje root uzol, pa sú akcie palety. Pre súčasné potreby palety nie sú potrebné žiadne špeciálne akcie a tak vygenerované metódy v triede MyActions() vracajú null. Filter pf má hodnotu null, pretože nechceme použiť žiadne filtrovanie komponentov palety. Nakoniec sa vytvorí nový DragAndDropHandler, ktorého detská trieda je zahniezdená priamo v PaletteSupport triede. Tá bude bližsie rozobraná v nasledujúcej podkapitole.&lt;br /&gt;
&lt;br /&gt;
Aby sme vytvorili paletu musíme vytvoriť inštanciu triedy PaletteController v DynaSimTopComponent cez PaletteSupport.createPalette(). To však nestačí na zobrazenie, pretože sa nachádzame v inom TopComponente. Paleta má vlastný TopComponent a aby medzi nimi vznikla určitá forma komunikácie a dokázali si medzi sebou predávať hodnoty, ju nutné vložiť kontrolér palety do Lookupu. Pridanie PaletteController s menom controler do Lookupu Topcomponentu je nasledovné:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 associateLookup(new AbstractLookup(content));&lt;br /&gt;
 content.add(controller);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
InstanceContent content sa používa na zobrazovanie Properties okna a samotný kontrolér palety sa do neho pridáva ako položka. Podobne ako content aj controler sa prenáša medzi triedami ako premenná v ich konštruktore, z DynaSimTopComponent-u do DynaSimScene, z tej ďalej do Component_Widget. Tu sa musí v metóde notifyStateChanged opäť controller pridať do content, pretože po vytvorení nového Properties okna sa paleta zruší. Jej pridaním do content sa opäť vytvorí.&lt;br /&gt;
===Implementácia Drag&amp;amp;Drop funkcionality===&lt;br /&gt;
Drag&amp;amp;Drop z palety zabezpečuje trieda MyDnDHandler, ktorá je zahniezdená v PaletteSupport aj jej inštancia je vytvorená v konštruktore PaletteController-a. Táto trieda je detskou triedou triedy DragAndDropHandler. Preťažená je len 1 funkcia a to customize. Tá má na práci prenos dát určitého typu medzi paletou a TopComponentom, ktorý Drop z palety akceptuje. Keďže po dropnutí komponentu z palety na plochu editora chceme, aby sa na danom mieste vytvoril nový grafický komponent typu Component_Widget. Na jeho tvorbu ale potrebujeme najskôr inštanciu typu MyNode a z tej už dokážeme vytvoriť ďalej celú grafickú aj dátovú časť komponentu. Konštruktor pre MyNode má 4 premenné a na ich prenos z palety do inštancie DynaSimScene sa potrebujeme zamerať. Štvrtá premenná je lokácia bodu na ktorý sme položili komponent z palety na plochu editora takže nám stačí prenos troch premnných a to je: meno komponentu, kategória do ktorej patrí a meno SVG súboru bez prípony pre vykreslenie komponentu. Akým spôsobom sa teda tieto 3 hodnoty premenných prenesú z palety do DynaSimScene? Najskôr sa v metóde customize nájde uzol palety z lookup-u. Z neho cez rôzne metódy ako getDisplayName a pod. uložíme do poľa typu String meno, kategótiu a meno súboru. Potom do exTransferable typu ExTransferable, čo je premenná metódy customize uložíme pomocou metódy put toto pole Stringov. Tým sme si zabezpečili prenos týchto hodnôt z palety na iné miesto. Problém je, že miesto, na ktoré chceme tieto hodnoty preniesť musí byť na ne pripravené.&lt;br /&gt;
&lt;br /&gt;
Miesto kam chceme tieto hodnoty preniesť a na ktorom chceme vytvoriť komponenty je inštancia typu DynaSimScene. Ako už bolo viac krát spomínané, DynaSimScene je tiež widget a tým pádom mu je možné pridať rôzne akcie ako iným widgetom. Preto môžeme do jeho konštruktora napísať:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt; &lt;br /&gt;
getActions().addAction(ActionFactory.createAcceptAction(new AcceptProvider())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tento riadok kódu nám zabezpečí, že DynaSimScene bude akceptovať veci dropnuté na jeho plochu, ale AcceptProvider má 2 metódy, ktoré sa automaticky vygenerujú a ich kód treba doplniť. Metóda isAcceptable vždy vracia ConnectorState.ACCEPT. To nám zabezpečí, že akýkoľvek komponent z palety dropnutý na editačnú plochu je akceptovaný editorom. Druhá metóda je oveľa dôležitejšia a jej deklarácia vypadá nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public void accept(Widget widget, Point point, Transferable transferable)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Z premennej point získame bod na ktorý chceme premiestniť komponent a v transferable je uložené pole Stringov, ktoré sme poslali z MyDnDHandler cez exTransferable premennú. K poľu Stringov sa dostaneme z transferable nasledovným spôsobom: String name[] = getNameFromTransferable(transferable);&lt;br /&gt;
&lt;br /&gt;
Tým pádom máme k dispozícii všetky premenné na vytvorenie inštancie typu MyNode. V tejto metóde accept sa vykonajú všetky úkony na tvorbu komponentu na DynaSimScene. Vytvorí sa nový widget cez addNode a cez addPin sa mu pridajú vo for-slučke všetky piny. Nakoniec kontrolér palety cez metódu clearSelection() odznačí označenú položku na palete.&lt;br /&gt;
==Tvorba vlastných okien – náhľad na schému==&lt;br /&gt;
PropertySheet a paleta sú okná, ktoré sú prebraté z NetBeans IDE a vývojár ich môže zavolať a použiť vo vlastnom programe. Platforma Netbeans nám však dáva možnosť vytvoriť si aj svoje vlastné okná úplne od základu.&lt;br /&gt;
&lt;br /&gt;
Na DynaSimScene je možné vytvoriť satelitný pohľad na túto scénu pomocou metódy createSatelliteView(). Problém však je, že ak takýmto spôsobom vytvoríme náhľad, stane sa neoddeliteľnou súčasťou  scény. To znamená, že nám na jednej zo strán scény bude zaberať určité miesto a užívateľ ho nebude môcť vypnúť. Treba však myslieť na to, že niektorí užívatelia nebudú v určitých situáciách potrebovať tento náhľad a uvítali by zväčšenie pracovnej plochy odstránením náhľadu zo scény. Jedným z riešení je vytvorenie samostatného okna v rámci aplikácie, podobné ako je práve Property okno alebo okno palety, kde by bol umiestený náhľad na scénu. Spôsobov ako takéto okno vytvoriť je viacero. Je možné priamo v module DynaSim vytvoriť nový Window Component a podstupovať podobne ako pri tvorbe DynaSimTopComponent (kap.2.1.1). Lepším riešením je však tvorba nového modulu, ktorý bude v sebe obsahovať TopComponent starajúci sa o zobrazovanie satelitného pohľadu scény. Tým, že vytvoríme nový modul, sa podstatne zvýši znovupoužiteľnosť tejto časti programu. Modul môžeme volať aj v iných aplikáciách postavených na platforme NetBeans cez závislosti modulov.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme teda nový modul v rámci našej aplikácie DynaSim Suite. V ľavej časti NetBeans IDE v okne Projects rozbalíme našu aplikáciu. Tu pravým tlačítkom myši klikneme na pložku Modules a vyberieme položku Add New... Otvorí sa wizard pre tvorbu modulu. V Project Name zadáme meno pre náš modul, v Project Location jeho umiestnenie na disku. Klikneme na next. Do Code Name Base zadáme meno hlavného balíčku (package), napr. sk.tnuni.satellite. Je dobré nechať si vygenrovať aj layer.xml. Po stlačení tlačidla Finish sa vytvorí nový modul. V balíčku, ktorý sme zadali sa vytvorí konfiguračný súbor Bundle.properties. Do tohto balíčku si teraz pridáme nový TopComponent. Pravým tlačidlom myši klikneme na balíček a vyberieme položku New... V nej si nájdeme Window Componet, ak sa tu však nenachádza treba ho nájsť v Other → Module Development → Window Componet. Po jeho vábere by sa malo zobraziť okno ako je na obr.13.&lt;br /&gt;
[[Súbor:Dynasim13.jpg|center|framed|Obr.13 Tvorba nového TopComponentu]]&lt;br /&gt;
Vo Windosws Position si vyberieme v ktorej časti aplikácie sa má naše okno zobrazovať. Pre satelitný pohľad som si zvolil ľavú časť aplikácie, t.j. tá, kde sa napríklad v NetBeans IDE nachádza okno Projects. Ak chceme aby sa okno zobrazilo so spustením aplikácie, treba zašktrtnúť Open on Application Start. Po stlačení next prejdeme do ďalšej časti wizarda. Tu stačí zvoliť Class Name Prefix. To je predpona, ktorú budú mať všetky súbory TopComponentu. Ak teda zvolíme ako predponu SatelliteView, wizard vygeneruje niekoľko súborov s menom začínajúcim sa touto predponou,  napríklad SatelliteViewTopComponent.java a ďalšie.&lt;br /&gt;
&lt;br /&gt;
Máme vytvorený modul, ktorý sa stará o zobrazovanie okna na pozícii explorer. Teraz treba oknu dodať funkcionalitu. Požadujeme, aby naše okno zobrazovalo satelitný pohľad na scénu DynaSimTopComponent. Na to stačí do triedy SatelliteViewTopComponent doplniť jednu metódu ako je znázornená na nasledujúcich riadokoch:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public void installSatteliteView(Scene scene) {&lt;br /&gt;
     if(this.scene==scene) return;&lt;br /&gt;
     JComponent satview = scene.createSatelliteView();&lt;br /&gt;
         &lt;br /&gt;
     this.remove(satView);&lt;br /&gt;
     this.satView = null;&lt;br /&gt;
     add(satview, BorderLayout.CENTER);&lt;br /&gt;
     this.satView = satview;&lt;br /&gt;
     this.scene = scene;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ako vidno z kódu, jedná sa o veľmi jednoduchú metódu. Metóda je v tomto príklade zjednodušená na účely opisu jej princípu. Najskôr sa overí, či scéna ktorá volá túto metódu je tá istá, čo scéna zapísaná v tejto triede. Ak áno nič sa nestane, lebo satelitný pohľad už je funkčný. Ak je však volaná inou scénou (inou inštanciou Scene), vytvorí sa nový satelitný pohľad a odstráni sa starý, ktorý bol doteraz aktívny. Potom sa TopComponentu pridá novovytvorený satelitný pohľad. Aby táto metóda robila to, čo od nej očakávame, musí byť volaná z našej triedy DynaSimTopComponent. Ten je však umiestnený v inom module, preto musíme všetky packages v module pre satelitný pohľad spraviť public a následne modul pridať ako závislosť modulu DynaSim. Ako toho docieliť je popísane v kap. 1.5.&lt;br /&gt;
&lt;br /&gt;
Teraz už len stačí vyriešiť metódy v rámci modulu DynaSim. V DynaSimScene treba vytvoriť metódu, ktorá bude volať installSatelliteView z druhého modulu. Najskôr si vytvoríme v tejto metóde inštanciu SatelliteViewTopComponent cez metódu findInstance(). Potom z tejto inštancie zavoláme našu metódu na vytvorenie satelitného pohľadu. Metóda triedy DynaSimScene vypadá nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public void installSatView(){&lt;br /&gt;
     SatelliteViewTopComponent tc = SatelliteViewTopComponent.findInstance();&lt;br /&gt;
     tc.installSatteliteView(this);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Túto metódu ešte treba volať v TopComponente DynaSimu v jeho metóde componentActivated(), aby sa zavolala vždy keď sa aktivuje editačné okno DynaSimu.&lt;br /&gt;
==Pridávanie tlačidiel do toolbaru==&lt;br /&gt;
Aplikačné okno NetBeans platformy obsahuje oblasť pre toolbary. Do nej je možné pridávať vlastné toolbary a vlastné tlačidlá. Nasledujúci postup sa bude vzťahovať na tvorbu tlačidla v menu a toolbare, ktoré po jeho stlačení vytvorí nový projekt programu DynaSim. V podstate sa vytvorí nová inštancia DynaSimTopComponent s tým, že už existujúce inštancie DynaSimTopComponentov sa zachovajú. To znamená, že ak už má užívateľ spustený nejaký projekt na ktorom pracuje, stlačením tlačidla pre nový projekt sa vytvorí nová záložka na mieste pre projekty. Užívateľ kliknutím na záložky potom bude môcť prepínať medzi rozpracovanými projektmi.&lt;br /&gt;
Pridanie položky do menu a príslušného tlačidla na toolbar sa dá vykonať veľmi jednoducho, opäť pomocou wizarda prístupného v NetBeans IDE. V projects okne si nájdeme modul, ktorému chceme pridať tlačidlo. V našom prípade je to modul DynaSim. Klikneme naň pravým tlačidlom myši a vyberieme v New položku Action. Ak sa tam táto položka nenachádza nájdeme ju v Other → Module Development → Action. Otvorí sa okno wizarda. V prvom kroku si musíme vybrať, či má byť daná akcia tlačidla prístupná vždy, alebo len za určitých podmienok. Vyberieme si položku Always Enabled, lebo chceme, aby sme mohli nový projekt vytvárať kedykoľvek. Pokračujeme tlačítkom Next.&lt;br /&gt;
[[Súbor:Dynasim14.jpg|center|framed|Obr.14 Wizard pre tvorbu novej akcie]] &lt;br /&gt;
Ďalší krok vo wizardovi (obr.14) je určenie, či chceme pre našu akciu vytvoriť položku v hlavnom menu bare, tlačidlo na toolbare, alebo obidvoje. Prvá položka Category reprezentuje sémantické zgrupovanie akcií. Je možné si vybrať niektorú z už existujúcich alebo si vytvoriť vlastnú kategóriu. V položke Menu si vyberieme v ktorej kategórii v hlavnom menu sa má naša akcia zobraziť. Poradie voči ostatným akciám v danej kategórii sa určuje cez Position. HERE identifikuje lokáciu, kde sa naša akcia medzi ostatnými položkami zobrazí. Podobne je to aj s toolbar tlačítkom. Nakoniec si môžeme zvoliť klávesovú skratku, ktorou našu akciu zavoláme. Opäť klikneme na Next a v poslednej časti wizarda si vyberieme meno pre triedu v ktorej sa akcia tlačidla vykoná. V položke Display Name si určíme meno nášho tlačidla a nakoniec v Icon položke vyberieme ikonu pre naše tlačidlo. Ikony môžu byt formátu PNG alebo GIF. Každá akcia by mala mať k dispozícii 2 ikony. Jedna o rozmeroch 16x16 a ďalšia 24x24 pixelov. Menšia ikona by mala mať normálny názov, napríklad ''new.png''. Táto sa použije na vytvorenie menu položky v prípade, že sme ju v predošlej časti wizarda nechali vytvoriť. Väčšia ikona by sa mala volať rovnako ako menšia, ale na koniec mena jej treba pridať číslicu 24, teda ''new24.png''. Táto ikona sa použije na tvorbu toolbar tlačidla. Stlačením Finish sa nám vygeneruje nová trieda vo zvolenom balíčku. Do nej už stačí doplniť kód, ktorý sa má vykonať. V metóde actionPerformed vytvoríme nový DynaSimTopComponent a zavoláme jeho metódu open (). Týmto postupom sme vytvorili nové tlačítko v toolbare a príslušnú menu položku. Po kliknutí na ne sa vytvorí nový projekt programu DynaSim. Obdobným spôsobom fungujú aj ďalšie akcie ktoré sú volané z menu resp. z toolbar tlačidiel.&lt;br /&gt;
==Úprava toolbaru a menu baru pomocou layer.xml==&lt;br /&gt;
V predošlej kapitole bolo vysvetlené ako si vytvoriť vlastné položky v menu a nové tlačidlá v toolbaroch. Tým nie je problém vytvoriť si nové tlačidlá pre nový projekt, save, load a ďalšie akcie. Problém však je, že aplikácie postavené na platforme NetBeans dedia určité defaultné tlačítka, ktoré sú neaktívne. Vývojár ich môže samozrejme využiť, ale jednoduchše je vytvoriť si tlačítka vlastné. Preto chceme tieto neaktívne tlačítka odstrániť. To sa dá vykonať jednoducho editáciou konfiguračného súboru modulov layer.xml. V module DynaSim sa tento súbor nachádza v balíčku sk.tnuni.dynasim. Layer.xml je centrálny konfiguračný súbor, ktorý definuje prakticky všetko, čo modul pridáva do NetBeans platformy.&lt;br /&gt;
V Menu v položke File sa defaultne nachádza Save, Save As, Save All. Tieto sú pre nás neaktívne a chceme odstrániť ich akcie a aj ich položky v menu. Na to je nutné editovať layer.xml súbor. Na odstránenie akcií si nájdeme element folder, ktorý má atribút s menom Actions. V ňom je zobrazená hierarchia akcií pre jednotlivé kategórie. Položky, čo chceme odstrániť sa nachádzajú v kategórii File. Do nej treba doplniť 3 detské elementy s atribútom name ako to vidno na príklade.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;folder name=&amp;quot;Actions&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;folder name=&amp;quot;File&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAllAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAsAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/folder&amp;gt;&lt;br /&gt;
 &amp;lt;/folder&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tým sme odstránili akcie samotné. Teraz treba odstrániť ich menu položky podobným spôsobom.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;folder name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;folder name=&amp;quot;File&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAllAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAsAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/folder&amp;gt;&lt;br /&gt;
 &amp;lt;/folder&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nakoniec sa odstráni aj toolbar tlačítko pre SaveAll.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;folder name=&amp;quot;Toolbars&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;folder name=&amp;quot;File&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAllAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/folder&amp;gt;&lt;br /&gt;
 &amp;lt;/folder&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
K akciám sa v layer.xml pristupuje cez atribút name. Jeho hodnota musí byť zložená z balíčku v ktorom sa akcia nachádza. Miesto bodiek sa použijú pomlčky. Ďalej následuje meno akcie a za ním prípona shadow. Ak chceme akciu skryť použije sa shadow_hidden. Napríklad org-openide-actions-SaveAllAction.shadow_hidden znamená, že chceme akciu SaveAllAction z org.openide.actions skryť. Je možné skryť len tlačítko na toolbare s tým, že príslušné tlačítko v menu zostane viditeľné a naopak.&lt;br /&gt;
&lt;br /&gt;
Layer.xml však neslúži len na zobrazovanie a skrývanie menu a toolbar položiek. Predstavme si situáciu, kde máme už vytvorený toolbar, ale zistíme, že sa nám nepáči rozloženie jednotlivých tlačítiek. Jeden zo spôsobov je zmazať všetky triedy pre akcie tlačítiek a odstrániť ich z layer.xml a properties.bundle. Následne cez wizarda vytvoriť tlačítka nanovo a v Position im nastaviť novú pozíciu voči ostatným tlačítkam. Toto je však veľmi napraktický a časovo náročný spôsob, obzvlášť ak chceme meniť polohu väčšieho množstva tlačítiek. Našťastie tu je však oveľa jednoduchšie riešenie. Každé tlačítko má v layer.xml detský element ''attr'' s atribútom ''name'', ktorý má hodnotu ''position''. Druhý atribút je ''intvalue''. Jeho hodnota je nejaký integer. V závislosti na hodnote tohto čísla sa určí pozícia daného tlačítka voči ostatným tlačítkam. Čím je číslo menšie, tým sa tlačítko na toolbare umiestni viac vľavo, v prípade menu zase viac navrch. Tlačítko pre toolbar nejakej akcie má vlastnú int hodnotu a položka menu môže mať inú hodnotu. To znamená, že poloha tlačítka na toolbare a poloha položky v menu bare sú od seba nezávislé.&lt;br /&gt;
&lt;br /&gt;
Príklad použitia pozičného atribútu v layer.xml:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;file name=&amp;quot;sk-tnuni-dynasim-ZoomDefaultAction.shadow&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;attr name=&amp;quot;position&amp;quot; intvalue=&amp;quot;255&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/file&amp;gt;&lt;br /&gt;
 &amp;lt;file name=&amp;quot;sk-tnuni-dynasim-InitGridsAction.shadow&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;attr name=&amp;quot;position&amp;quot; intvalue=&amp;quot;260&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/file&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Príklad je vyňatý z elementu pre Menu bar v jeho View menu. Tu môžeme vidieť, že akcia ZoomDefaultAction má menšiu hodnotu pozície ako InitGridsAction. To znamená, že sa v menu ZoomDefaultAction zobrazí nad InitGridsAction. Prepísaním týchto hodnôt v layer.xml súbore môžeme upraviť pozície jednotlivých položiek menu, či tlačidiel na toolbare voči sebe. Po vytvorení vlastnej akcie sa obvykle v layer.xml element attr na zmenu pozície nevytvorí. Vývojár ho musí doplniť sám a odporúča sa to, lebo ak tak neučiní, pri kompilácii dostane varovné hlásenia o chýbajúcich pozíciách pre jednotlivé položky menu a toolbaru.&lt;br /&gt;
&lt;br /&gt;
Na prvý pohľad sa môže layer.xml javiť veľmi zložito a mätúco, ale v skutočnosti je to silný nástroj NetBeans platformy, vďaka ktorému môžeme manažovať menu bar a tool bar samotnej platformy.&lt;br /&gt;
==Akcie pre uloženie a nahratie simulačných schém==&lt;br /&gt;
Kým akcie na vytvorenie nového pracovného okna DynaSimu, zoomovanie alebo vytvorenie mriežky na scéne sú relatívne jednoduché a zo zdrojového kódu ľahko pochopiteľné, akcie pre uloženie a nahratie schémy nie sú úplne triviálnou záležitosťou. To hlavne z dôvodu, že potrebujeme zistiť polohu a hodnoty všetkých widgetov na scéne, tie následne zapísať do nejakého súboru na disku. Pri nahrávaní scény budeme tento súbor parsovať a zo získaných hodnôt vybudujeme novú scénu, ktorá musí byť identická s tou, ktorá bola do súboru uložená.&lt;br /&gt;
&lt;br /&gt;
Schéma zo scény sa ukladá do XML súboru, aby však nedochádzalo k nechcenej zámene s XML súbormi pre simulačné komponenty, prípona save súborov je zmenená na .dsp (DynaSim Project). Štruktúrovanie samotného dokumentu je však zhodné s XML špecifikáciou. Na ukladanie a nahrávanie schémy je v programe niekoľko tried a metód v už existujúcich triedach. Triedy pre akcie samotné sú SaveAsXMLAction a LoadFromXMLAction. Tieto boli vytvorené cez wizarda na tvorbu akcií a ich metóda ActionPerformed iba nájde aktívny DynaSimTopComponent. Z neho sa podľa zvolenej akcie zavolá príslušná metóda na  uloženie scény saveAsXML alebo nahratie scény loadFromXML. DynaSimTopComponent tieto metódy priamo neobsluhuje, iba ich predá ďalej tým, že zavolá metódy DynaSimScene. Opäť sa podľa príslušnej akcie zavolá buď metóda saveWidgetsToXML alebo loadWidgetsFromXML. To sú metódy z triedy DynaSimScene. Teraz sa bližšie pozrieme na saveWidgetsToXML. Táto metóda najskôr vytvorí JFileChooser, čo je swing komponent, prevažne určený na ukladanie a nahrávanie súborov. Jeho dialógové okno sa nastaví ako .SAVE_DIALOG a vykonajú sa ďalšie potrebné natavenia ako napríklad povolenie pracovať len so súbormi (nie s priečinkami) a ktorý typ súborov má vytvárať a akceptovať. Potom sa zo súboru, ktorý užívateľ cez tento JFileChooser vytvorí inštancia triedy WidgetsXML, čo je posledná trieda potrebná pre implementáciu save a load funkcionality do programu. &lt;br /&gt;
&lt;br /&gt;
Aby sme mohli pokračovať vo vysvetlovaní metódy saveWidgetsToXML, je potrebné si najskôr objasniť čo vlastne trieda WidgetsXML robí. Konštruktor má takýto tvar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public WidgetsXML(File file) {&lt;br /&gt;
     this.file = file;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Jediný parameter ktorý mu predávame je súbor file. Ten sa potom uloží medzi členské premenné. Skutočnú funkcionalitu inštancii tejto triedy dodávajú jej metódy. Ich krátke zhrnutie je nasledovné:&lt;br /&gt;
&lt;br /&gt;
'''public void prepareToSave()''' – Metóda do nášho súboru zapíše hlavičku XML a základnú prázdnu hierarchiu XML elementov pomocou PrintWriteru. Výsledný súbor sa uloží do členskej premennej Document document.&lt;br /&gt;
&lt;br /&gt;
'''public void prepareToLoad()''' – Načíta sa obsah súboru do Document document. Táto metóda sa volá pri loadovaní.&lt;br /&gt;
&lt;br /&gt;
'''public void addMyNode(MyNode node)''' – V elemente my-nodes sa vytvorí nový detský element MyNode. Vytvoria sa v ňom atribúty pre meno, kategóriu, bod, kde widget na scéne leží, jednotlivé hodnoty z property okna a ďalšie potrebné údaje o našom Component_widgete. Potom sa z našej premennej node do nich zapíšu hodnoty.&lt;br /&gt;
&lt;br /&gt;
'''public ArrayList&amp;lt;MyNode&amp;gt; getMyNodes()''' – Táto metóda sa volá počas loadovania a v Document document sa postupne parsuje obsah elementu my-nodes z XML súboru. Zo získaných údajov sa vytvorí nová inštancia MyNode a potom sa do nej zapíšu hodnoty vnútorných premnných. Nakoniec sa pridá do ArrayListu.&lt;br /&gt;
&lt;br /&gt;
'''public void setCounter(IdGenerator generator)''' – Metóda, ktorá uloží do elementu counter detský element s atribútom posledného vygenerovaného id čísla pre jednotlivé piny. Piny musia mať unikátne číslo, preto si musíme pamätať po loade, aké je posledné číslo pinu.&lt;br /&gt;
&lt;br /&gt;
'''public void getCounter(IdGenerator generator)''' – Metóda na zistenie vygenerovaného čísla posledného pinu. &lt;br /&gt;
public boolean save() – Táto metóda sa volá ako posledná pred uložením. Z Document document sa vytvorí nový XML súbor.&lt;br /&gt;
&lt;br /&gt;
Ďalšie metódy sú addMyPin, getMyPins, addMyEdge a getMyEdges. Tieto metódy sú ekvivalentom addMyNodes a getMyNodes pre piny a spojovacie čiary a fungujú na rovnakom princípe.&lt;br /&gt;
&lt;br /&gt;
Po ozrejmení si metód vo WidgetsXML sa môžeme vrátiť do metódy saveWidgetsToXML v triede DynaSimScene. Čo teda potrebujeme pre uloženie scény spraviť? Potrebujeme nájsť všetky Component_Widgety, všetky ich Pin_Widgety a všetky spojovacie čiary typu MyConnectionWidget. K ním treba nájsť ich dátové časti MyNode, MyPin, MyEdge. Tie cez príslušné metódy addMyNode, addMyPin, addMyEdge triedy WidgetsXML zapíšeme do XML. Najskôr si nájdeme zoznam všetkých Component_Widgetov. Ako už bolo na začiatku tejto práce spomenuté, widgety sa ukladajú na vrstvu ''mainLayer'' a spojovacie čiary na vrstvu ''connectionLayer''. Takže ak chceme získať zoznam všetkých Component_Widgetov na scéne stačí jeden riadok kódu:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 List&amp;lt;Widget&amp;gt; list = mainLayer.getChildren();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Potom už stačí len vo for-cykle prechádzať zoznam, z jednotlivých widgetov získať ich dátovú časť MyNode a pridať tento uzol cez wxml.addMyNode inštancii triedy WidgetsXML. Treba si uvedomiť, že väčšina Component_Widgetov má obvykle aj niekoľko pinov, čiže v ďalšom forcykle nájdeme všetky ich Pin_Widgety a ich dátovú časť MyPin zapíšeme do wxml cez metódu addMyPin.&lt;br /&gt;
Podobný postup volíme aj pri hľadaní spojovacích čiar. Spojovacie čiary sú detskými widgetami vrstvy connectionLayer a ich zoznam dostaneme cez connectionLayer.getChildren(). Cez addMyEdge sa v slučke pridajú MyEdge do wxml. Nakoniec sa zavolá z WidgetsXML metóda save(), ktorá vygeneruje zo získaných údajov náš XML súbor.&lt;br /&gt;
&lt;br /&gt;
Pri nahrávaní schémy z tohto súboru sa volá metóda loadWidgetsFromXML(). Tu sa tiež podobným spôsobom vytvorí JFileChooser, tento krát ale s OPEN_DIALOG. Po výbere load súboru užívateľom sa opäť vytvorí z tohto súboru inštancia triedy WidgetsXML menom wxml a zavolá sa jej metóda prepareToLoad. Z wxml získame ArrayList pre MyNode a postupne ich vo for-cykle vytvárame po jednom. Z nich sa vytvoria nové Component_Widget. Opäť nemôžeme zabudnúť ani na piny jednotlivých Component_Widgetov a treba do tohto for-cyklu dať ďalší, ktorý ich bude pridávať ako detské widgety Component_Widgetu. Pridávanie spojovacích čiar je tiež podobné, ale tu treba myslieť na to, ktorý pin s ktorým treba prepojiť. Každý MyPin má svoje unikátne číslo, uložené v premennej id. Každý MyEdge má 2 hodnoty - source a target. V nich je zapísaná hodnota id zdrojového a cieľového pinu. Tu teda vo for-cykle prechádzame MyEdge po jednej a každá MyEdge musí porovnávať tieto hodnoty source a target s id všetkých pinov na scéne. Ak sa nájdu zhodné id pinov s týmito hodnotami, vytvorí sa medzi nimi spojenie cez metódu addEdge.&lt;br /&gt;
&lt;br /&gt;
Po vytvorení všetkých Component_Widgetov a ich prepojení spojovacími čiarami podľa  XML súboru sa loading ukončí a scéna by mala zodpovedať scéne v dobe jej uloženia do súboru.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Vizu%C3%A1lna_%C4%8Das%C5%A5_programu_DynaSim&amp;diff=4387</id>
		<title>Vizuálna časť programu DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Vizu%C3%A1lna_%C4%8Das%C5%A5_programu_DynaSim&amp;diff=4387"/>
		<updated>2010-05-18T21:35:13Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|2|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Vizuálna časť programu DynaSim=&lt;br /&gt;
Vzhľadom na design aplikácie DynaSim, je vhodné začať najskôr s tvorbou vizuálnej časti, a až potom pokračovať v tvorbe funkčnej časti, pretože  funkčná časť je priamo závislá od časti grafickej. Pred tým však treba vytvoriť novú aplikáciu na platforme NetBeans a vytvoriť v nej modul, ktorý bude predstavovať jadro tejto aplikácie.&lt;br /&gt;
&lt;br /&gt;
==Okno editora programu DynaSim==&lt;br /&gt;
Ak už máme vytvorenú aplikáciu platformy NetBeans a v nej jeden prázdny modul (viz. kap 1.4), môžeme si všimnúť, že aplikácia a modul obsahujú len konfiguračné súbory. Po skompilovaní takéhoto projektu je však možné ho spustiť aj napriek tomu, že sme do neho nedodali žiaden kód. Spustí sa len základný framework aplikácie (obr.5).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim05.jpg|center|framed|Obr.5 Prázdny projekt]]&lt;br /&gt;
&lt;br /&gt;
Ako vidno z obrázku, toolbar je neaktívny a väčšina položiek v menu je taktiež neaktívna. Aby sme teda frameworku mohli dodať funkcionalitu, musíme vytvoriť nové okná a akcie pre jednotlivé menu položky. Môžeme začať s tvorbou okna editora. Do okna editora sa budú pridávať jednotlivé simulačné komponenty z palety a tie sa následne prepoja spojovacími čiarami. To znamená, že sa bude jednať o grafické rozhranie, v ktorom užívateľ tvorí vlastné simulačné schémy.&lt;br /&gt;
&lt;br /&gt;
===TopComponent===&lt;br /&gt;
Na tvorbu nových okien v rámci aplikácií postavených na platforme NetBeans sa používa TopComponent. Ten je poskytovaný cez modul Window System API. Na vytvorenie nového okna v aplikácii klikneme pravým tlačítkom na modul, ktorý bude manažovať toto okno a vyberieme položku New → Other a následne označíme Window Componenet z kategórie Module Developement. Po kliknutí na tlačítko Next sa nám zobrazí nové okno. V ňom v drop-down menu s názvom Window Position vyberieme jednu z preddefinovaných pozícií okna. Kedže chceme vytvoriť okno editora, je vhodné zvoliť si pozíciu editor. Tým sa celá nevyužitá šedá plocha v strede našej aplikácie (obr.5) pridelí TopComponentu. Ďalej je možné vo wizardovi nastaviť, či sa má okno spúšťať so spustením aplikácie. V ďalšom kroku je treba doplniť predponu pre názov triedy a môžeme dodať ikonu pre toto okno. Po stlačení tlačidla finish wizard vytvorí mimo hlavnej triedy aj niekoľko jej prislúchajúcich súborov. Je vhodné všimnúť si, že nám wizard automaticky vytvoril aj závislosti na potrebné moduly, konkrétne na Settings API, Swing Layout Extensions integration, UI utilities API, Utilities API a Window System API.&lt;br /&gt;
Teraz je nutné ísť do našeho novovytvoreného java súboru s koncovkou TopComponent a predponou, ktorú sme zvolili vo wizardovi (napr. DynaSimTopComponent). V source časti tohto súboru sa nám vygeneroval kód a môžeme si všimnúť aj niekoľko preťažených metód, ktoré predstavujú abstraktné metódy rodičovskej triedy. Zatiaľ však nie je nutné ich meniť. &lt;br /&gt;
V design časti nastavíme TopComponentu BorderLayout a a pridáme jScrollPane. Tým máme zaručené, že celá plocha editora bude scrollovateľná.&lt;br /&gt;
&lt;br /&gt;
===GraphPinScene===&lt;br /&gt;
Na simulačné schémy, ktoré budeme tvoriť v okne editora sa treba pozerať ako na grafovo orientovaný model. Simulačné komponenty predstavujú uzly a spojovacie čiary medzi nimi hrany. Visual Library API je vhodná práve na takéto účely. &lt;br /&gt;
Visual Library API nám ponúka dva druhy koreňových elementov – scén vhodných na tieto účely a to GraphScene a GraphPinScene. Scéna samotná je widget a ako bolo načrtnuté v kapitole 1.6, widgety majú stromovú štruktúru. Scéna je na úplnom vrchu hierarchie tejto stromovej štruktúry a stará sa o zobrazovanie ostatných widgetov na editačnej ploche.&lt;br /&gt;
GraphScene je scéna ktorá sa skladá len z uzlov a hrán, kým GraphPinScene obsahuje komponenty skladajúce sa z uzlov, hrán a pinov, čiže vstupov/výstupov jednotlivých uzlov. Jeden uzol môže mať ľubovoľný počet pinov. GraphPinScene je vhodnejšia pre účely DynaSimu, lebo jeho simulačné komponenty sa tiež skladajú z uzlov, hrán a terminálov.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim06-1.jpg|center|framed|Obr.6 Porovanie GraphScene a GraphPinScene]]&lt;br /&gt;
&lt;br /&gt;
GraphPinScene&amp;lt;N, E, P&amp;gt; je abstraktná trieda, preto z nej treba vytvoriť novú triedu dedením. Takto vytvorená trieda v programe Dynasim má názov DynaSimScene, jej delarácia je nasledovná:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class DynaSimScene extends GraphPinScene&amp;lt;MyNode,MyEdge,MyPin&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Po jej vytvorení sa automaticky vygeneruje časť kódu pre jej abstraktné metódy, to znamená, že sa v detskej triede preťažia. Ich parametre sú priamo závislé od dátového typu zadaného v šablóne pre GraphPinScene. MyNode, MyEdge a MyPin predstavujú dátové uzly jednotlivých widgetov. Tie budú rozobrané v kapitole 3. Od vývojára sa očakáva, že doplní kód týchto metód podľa špecifických potrieb jeho programu. Tieto metódy sú volané inými metódami danej triedy a neodporúča sa volať tieto preťažené metódy priamo. &lt;br /&gt;
Inštancia tejto triedy sa skladá z vrstiev LayerWidget, ktoré slúžia na zobrazovanie widgetov na scéne. DynaSimScene má 3 takéto vrstvy a to:&lt;br /&gt;
&lt;br /&gt;
'''mainLayer''' – slúži na zobrazovanie simulačných komponentov&lt;br /&gt;
&lt;br /&gt;
'''connectionLayer''' – slúži na zobrazovanie spojovacích čiar&lt;br /&gt;
&lt;br /&gt;
'''interractionLayer''' – slúži na zobrazovanie select obdĺžnika pri multiselecte&lt;br /&gt;
&lt;br /&gt;
Pri vytváraní takýchto vrstiev a postupuje nasledovne:&lt;br /&gt;
&lt;br /&gt;
1. Vytvorí sa inštancia triedy LayerWidget&lt;br /&gt;
&lt;br /&gt;
2. Vytvorená inštancia sa scéne pridá ako detský widget&lt;br /&gt;
&lt;br /&gt;
Príklad vytvorenia novej vrstvy v konštruktore triedy DynaSimScene:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 LayerWidget mainLayer = new LayerWidget(this);&lt;br /&gt;
 this.addChild(mainLayer);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Teraz sa bližšie pozrieme na preťažené metódy, ktoré sa automaticky vygenerovali:&lt;br /&gt;
&lt;br /&gt;
'''protected Widget attachNodeWidget(MyNode node)''' – táto metóda je volaná metódou addNode. Tá sa v tomto programe volá po dropnutí vybraného komponentu z palety na editačnú plochu. Metóda je zodpovedná za tvorbu widgetu pre simulačný komponent a jeho pridanie na scénu. Konkrétne v programe DynaSim sa pod widgetom rozumie inštancia typu Component_Widget, ktorý sa vytvorí na základe údajov z parametra node a následne sa prilepí na mainLayer.&lt;br /&gt;
&lt;br /&gt;
'''protected Widget attachEdgeWidget(MyEdge edge)''' – táto metóda je volaná metódou addEdge. Metóda je zodpovedná za tvorbu widgetu pre spojovaciu čiaru a jeho pridanie na scénu. V programe DynaSim sa pod týmto widgetom rozumie inštancia typu MyConnectionWidget, ktorý sa vytvorí na základe údajov z parametra edge a následne sa prilepí na connectionLayer. Ďalej sa nastaví router, ktorý riadi cestu spojovacej čiary.&lt;br /&gt;
&lt;br /&gt;
'''protected Widget attachPinWidget(MyNode node, MyPin pin)''' – táto metóda je volaná metódou addPin. Metóda je zodpovedná za tvorbu widgetu pre terminál simulačného komponentu a jeho pridanie na scénu. V programe DynaSim sa pod widgetom rozumie inštancia typu Pin_Widget, ktorý sa vytvorí na základe údajov z parametra funkcie a následne sa prilepí na SVG_Widget, ktorý je súčasťou Component_Widget-u. Pin_Widgetu sa tu pridá aj akcia na tvorbu spojovacích čiar.&lt;br /&gt;
&lt;br /&gt;
'''protected void attachEdgeSourceAnchor(MyEdge edge, MyPin oldSourcePin, MyPin sourcePin)''' – táto metóda je volaná metódou setEdgeSource. Metóda má vo vizuálnej reprezentácii na starosti pripojenie nového zdrojového pinu ku hrane. Pomocou parametra edge sa nájde inštancia našej spojovacej čiary a pomocou parametra sourcePin sa nájde widget, ktorému tento pin patrí. Pre tento widget sa vytvorí kotva dátového typu Anchor. Nakoniec sa spojovacej čiare cez jej metódu setSourceAnchor kotva pridá. Tým sa upevní kotva spojovacej čiary v zdrojovom termináli.&lt;br /&gt;
&lt;br /&gt;
'''protected void attachEdgeTargetAnchor(MyEdge edge, MyPin oldTargetPin, MyPin targetPin)''' – táto metóda je volaná metódou setEdgeTarget. Metóda má vo vizuálnej reprezentácii na starosti pripojenie nového cieľového pinu ku hrane a funguje obdobne ako predchádzajúca metóda.&lt;br /&gt;
&lt;br /&gt;
Trieda DynaSimScene obsahuje aj ďalšie metódy, tie sú však využívané zväčša menu a toolbar tlačítkami a je im venovaný priestor v príslušnej kapitole.&lt;br /&gt;
&lt;br /&gt;
==SVG – Škálovateľná vektorová grafika==&lt;br /&gt;
Jedná sa o špecifikáciu založenú na XML súborovom formáte, ktorá slúži na popis dvojrozmernej vektorovej grafiky. SVG je otvorený štandard, ktorý vytvorilo konzorcium World Wide Web.&lt;br /&gt;
Myšlienka programu DynaSim je založená na popise komponentov XML a SVG súbormi, kde XML v sebe drží dátovú časť a obsahuje inicializačné hodnoty a popisy komponentu a SVG obsahuje popis grafickej reprezentácie daného komponentu. Zápis SVG dokumentu môže vyzerať napríklad takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE svg PUBLIC &amp;quot;-//W3C//DTD SVG 1.1//EN&amp;quot; &lt;br /&gt;
   &amp;quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;160&amp;quot; height=&amp;quot;160&amp;quot; viewBox=&amp;quot;0 0 160 160&amp;quot; version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
      xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;rect x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;100&amp;quot;&lt;br /&gt;
         fill=&amp;quot;none&amp;quot; stroke=&amp;quot;blue&amp;quot; stroke-width=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;circle cx=&amp;quot;100&amp;quot; cy=&amp;quot;100&amp;quot; r=&amp;quot;50&amp;quot;&lt;br /&gt;
         fill=&amp;quot;none&amp;quot; stroke=&amp;quot;lightseagreen&amp;quot; stroke-width=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;text x=&amp;quot;15&amp;quot; y=&amp;quot;40&amp;quot;&lt;br /&gt;
         font-family=&amp;quot;Verdana&amp;quot; font-size=&amp;quot;30&amp;quot; fill=&amp;quot;red&amp;quot; &amp;gt;&lt;br /&gt;
     Hello&lt;br /&gt;
   &amp;lt;/text&amp;gt;&lt;br /&gt;
 &amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ako sa takáto časť kódu zobrazí v prehliadači Mozilla Firefox môžeme vidieť na obr.7. SVG dokáže natívne zobrazovať väčšina internetových prehliadačov. Ako možno vidieť z príkladu, jednotlivé geometrické tvary sa zadávajú cez xml tagy a ich poloha, rozmery a farby sú určené cez ich atribúty. Je dôležité v koreňovom svg tagu nastaviť veľkosť zobrazovanej plochy cez width a height.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim07.jpg|center|framed|Obr.7 Príklad SVG obrázku]]&lt;br /&gt;
&lt;br /&gt;
Ďalšie podrobnejšie informácie o SVG je možno získať na adrese http://www.w3.org/TR/SVG/ .&lt;br /&gt;
&lt;br /&gt;
==Grafická časť simulačných komponentov==&lt;br /&gt;
Simulačné komponenty sú zložené z widgetov, ktoré tvoria grafickú reprezentáciu komponentu a z nodes – dátových uzlov, ktoré v sebe uchovávajú informácie o vnútornom stave komponentu. Ako už bolo načrtnuté, widgety majú stromovú štruktúru, kde rodičovský widget môže mať niekoľko detských widgetov a tieto detské widgety opäť môžu mať svoje vlastné detské widgety atď. V prípade grafickej časti komponentu je koreňovým widgetom Component_Widget a jeho štrukúru možno vidieť na obr.8.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim08.jpg|center|framed|Obr.8 Architektúra grafickej časti komponentu]]&lt;br /&gt;
&lt;br /&gt;
Component_Widget má 2 detské widgety a to SVG_Widget, zodpovedný za zobrazovanie grafiky načítanej z SVG súboru a LabelWidget, ktorý slúži na zobrazovanie mena komponentu. SVG_Widget môže mať ľubovoľný počet detských widgetov typu Pin_Widget, ktoré označujú miesta pre vstupy a výstupy z komponentu.&lt;br /&gt;
&lt;br /&gt;
===SVG_Widget===&lt;br /&gt;
SVG_Widget je detskou triedou triedy Widget a je zodpovedný za parsovanie SVG súboru a vykreslenie objektu z načítaných údajov na scénu. Deklarácia konštruktora je nasledovná:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public SVG_Widget (DynaSimScene scene, String svgfile, MyNode node)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Scene je scéna na ktorú sa daný widget prilepí, svgfile je cesta k SVG súboru z ktorého si widget načíta potrebné grafické údaje a node je dátový uzol, v ktorom sú uložené vnútorné stavy simulačného komponentu a jeho popis. V konštruktore sa volá metóda na parsovanie SVG súboru readSVG() a vytvorí sa popup menu pre tento komponent typu JPopupMenu. Následne sa do neho postupne pridajú jednotlivé položky typu JMenuItem. Na záver sa widgetu pridajú preddefinované akcie cez metódu getActions().addAction(WidgetAction action). Tieto akcie dodávajú widgetu funkcionalitu a majú vplyv aj na rodičovské widgety. V konštruktore je zadefinovaná akcia pre označenie widgetu, hover akcia, ktorá má hodnotu true ak sa kurzor myši nachádza nad týmto widgetom, akcia pre implementáciu popup menu a delete akcia, ktorá obsluhuje mazanie widgetov.&lt;br /&gt;
Niektoré významné metódy tejto triedy:&lt;br /&gt;
&lt;br /&gt;
'''private void readSVG (String svgFile)''' – táto metóda je určená na parsovanie SVG súboru, ku ktorému je zadaná cesta v jej parametri. Súbor sa parsuje pomocou SAXBuilder-u a získané hodnoty sa ukladajú medzi členské premenné inštancie.&lt;br /&gt;
&lt;br /&gt;
'''protected Rectangle calculateClientArea ()''' – je to abstraktná metóda triedy Widget. Vracia obdĺžnik do ktorého sa widget vykresľuje.&lt;br /&gt;
&lt;br /&gt;
'''public void paintWidget ()''' – je to abstraktná metóda triedy Widget a je zodpovedná za vykresľovanie widgetu. Metóda sa volá automaticky vždy, keď sa má widget prekresliť. Na vykresľovanie samotné sa používa AWT a údaje získné z parsovania SVG súboru metódou readSVG.&lt;br /&gt;
&lt;br /&gt;
===Pin_Widget===&lt;br /&gt;
Pin_Widget je detskou triedou triedy Widget a slúži na grafické zobrazenie terminálu simulačného komponentu. Konštruktor vypadá následovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public Pin_Widget (Scene scene, MyPin pin)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Scene je scéna na ktorú sa daný widget prilepí, pin je dátový uzol, v ktorom sú uložené informácie o pine ako meno a poradové číslo. Metóda paintWidget() vykresľuje červený kríž. Ten označuje miesto terminálu. Informácie o počte a polohe jednotlivých terminálov sú obsiahnuté v príslušnom XML súbore.&lt;br /&gt;
&lt;br /&gt;
===Component_Widget===&lt;br /&gt;
Component_Widget je detskou triedou triedy Widget a zapúzdruje v sebe SVG_Widget a LabelWidget. Táto trieda má na starosti centrovanie svojich detských widgetov voči sebe. Konštruktor vypadá následovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public Component_Widget (DynaSimScene scene, String svgfile, MyNode node, InstanceContent content, PaletteController controller)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Scene je scéna na ktorú sa daný widget prilepí, svgfile je cesta k SVG súboru a node je dátový uzol, v ktorom sú uložené vnútorné stavy simulačného komponentu a jeho popis. Tieto 3 parametre sa použíjú na vytvorenie inštancie SWG_Widget priamo v tomto konštruktore. Následne sa vytvorí inštancia LabelWidgetu s parametrom scene. LabelWidget je súčasťou Visual Library API a slúži na reprezentáciu textu na scéne. Tu slúži vlastne ako podpis komponentu a na scéne sa zobrazuje priemo pod grafickou časťou komponetu. V konštruktore sa ešte nastaví pomocou metódy setLayout centrovanie detských widgetov Component_Widget-u.&lt;br /&gt;
&lt;br /&gt;
Zaujímavé metódy tejto triedy:&lt;br /&gt;
&lt;br /&gt;
'''public final void setLabel(String label)''' – cez túto metódu sa mení meno komponentu. Je dôležité, aby sa nemenil len podpis samotný v LabelWidgete, ale treba zmenit meno komponentu aj v jeho dátovom uzle „node“.&lt;br /&gt;
&lt;br /&gt;
'''public void notifyStateChanged(ObjectState previousState, ObjectState newState)''' – je to abstraktná metóda triedy Widget. Volá sa vždy, keď sa zmení stav widgetu. To môže znamenať, že bol widget napr. označený, alebo je nad ním kurzor myši, resp. má tento widget na sebe focus. V tomto prípade, ak je widget označený, zmení sa jeho farba a ďalej sa cez PropertyNode vytvorí property sheet. Akým spôsobom, to je rozobrané v príslušnej kapitole. Component_Widget sa na scénu typu DynaSimScene pridáva cez metódu attachNodeWidget(MyNode node). Tá je volaná po dropnutí vybraného komponentu z palety na editačnú plochu. Ako vypadá inštancia Component_Widget-u na editačnej ploche je vidno na obr.9.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim09.jpg|center|framed|Obr.9 Príklad pre Component_Widget]]&lt;br /&gt;
&lt;br /&gt;
==Spojovacie čiary==&lt;br /&gt;
V grafovo orientovanom modeli sa uzly prepájajú pomocou hrán. To znamená, že jednotlivé komponenty musia byť prepojiteľné medzi sebou spojovacími čiarami. Treba brať na zreteľ, že sa komponenty neprepájajú priamo medzi sebou, ale každý komponent má svoje terminály. Tie môžu zastávať úlohu vstupu alebo výstupu pre tieto komponenty a práve pomocou nich sa prepájajú medzi sebou. Tiež treba brať do úvahy, že komponent môže mať viacero vstupov a tie môžu požadovať rôzne dátové typy aj v rámci jediného komponentu. Tak isto aj viacero výstupov z čoho každý môže predstavovať iný dátový typ.&lt;br /&gt;
===MyConnectionWidget===&lt;br /&gt;
Inštancie triedy ConnectionWidget majú za úlohu vykresľovať spojovacie čiary na scéne medzi dvoma bodmi. Tieto body sú určené inštanciami triedy Anchor – kotvami, ktoré sa dajú upevniť len v pinoch komponentu. ConnectionWidget je detskou triedou triedy Widget. Cesta spojenia je špecifikovaná kontrolnými bodmi, ktoré sa môžu pridať na čiaru automaticky podľa typu použitého routera, alebo ich môže užívateľ pridávať sám dvojklikom na spojovaciu čiaru. Vzhľadom na to, že chceme  spojovacím čiaram pridať aj ďalšie vlastnosti ako popup menu, musíme triedu ConnectionWidget rozšíriť na MyConnectionWidget. Konštruktor triedy:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public MyConnectionWidget(Scene scene, MyEdge edge)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
scene - scéna na ktorú sa daný widget prilepí.&lt;br /&gt;
&lt;br /&gt;
edge – inštancia triedy, ktorá v sebe uchováva dáta tejto spojovacej čiary, ako meno, zdrojový a cieľový pin.&lt;br /&gt;
&lt;br /&gt;
V konštruktore sa vytvorí popup menu rovnakým spôsobom ako v SVG_Widgete. Ďalej sa nastavia tvary kontrolných bodov a kotiev cez metódy ''setControlPointShape'' a ''setTargetAnchorShape''. Nakoniec cez metódy getActions().addAction pridáme tejto spojovacej čiare akcie, ktoré s ňou môžeme vykonávať a to sú akcia na mazanie, hover akcia, možnosť označenia, možnosť rekonekcie, vytvorenie popup menu, možnosť pridávania a odoberania kontrolných bodov dvojklikom na čiaru a nakoniec akciu na pohyb kontrolnými bodmi myšou.&lt;br /&gt;
Spojovacie čiary sa na scénu typu DynaSimScene pripájajú na vrstvu connectionLayer cez metódu addEdge. Samotná spojovacia čiara sa však vytvára v metóde attachEdgeWidget, ktorá je volaná metódou addEdge.&lt;br /&gt;
&lt;br /&gt;
===MyConnectionProvider===&lt;br /&gt;
Na to, kde sa môže spojovacia čiara ukotviť existujú určité pravidlá. Na ich určenie sa používa interface ConnectProvider. Preto si treba vytvoriť novú triedu:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class MyConnectionProvider implements ConnectProvider&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
V triede DynaSimScene sa vytvorí nová akcia pre widgety a má následovný tvar: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 private WidgetAction connectAction = ActionFactory.createConnectAction (interractionLayer, new MyConnectionProvider(this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Táto akcia sa cez getActions().addAction pridá každému widgetu typu Pin_Widget. Tým máme zaručené, že sa môžu medzi sebou prepájať komponenty medzi sebou len cez piny. Potom môžeme po kliknutí na zdrojový pin myšou ťahať spojenie k cieľovému pinu a pustiť tlačítko myši. Tým sa vytvorí spojenie medzi pinmi.&lt;br /&gt;
&lt;br /&gt;
Niektoré metódy zdedené cez implementáciu, ktoré určujú pravidlá pre prepojenie:&lt;br /&gt;
&lt;br /&gt;
'''public boolean isSourceWidget(Widget sourceWidget)''' – Metóda, ktorá zisťuje, či daný widget môže byť zdrojom pre ukotvenie spojovacej čiary. Ak je widget inštanciou triedy Pin_Widget, vyhovuje podmienke.&lt;br /&gt;
&lt;br /&gt;
'''public ConnectorState isTargetWidget (Widget sourceWidget, Widget targetWidget)''' – Metóda, ktorá zisťuje či daný widget môže byť zdrojom pre ukotvenie spojovacej čiary. Ak je widget inštanciou triedy Pin_Widget, vráti sa hodnota ConnectorState.ACCEPT, tým pádom je možné vytvoriť prepojenie medzi zdrojovým a cieľovým widgetom.&lt;br /&gt;
&lt;br /&gt;
'''public void createConnection(Widget sourceWidget, Widget targetWidget)''' – Metóda na vytvorenie spojenia medzi dvoma terminálmi typu Pin_Widget. Podmienkou pre prepojenie dvoch terminálov je to, že jeden terminál je vstup a druhy výstup. Táto informácia je uložená v inštancii triedy MyPin, ktorá sa použila na tvorbu pinu. Ak je táto podmienka splnená vytvorí sa spojenie medzi zdrojom a cieľom.&lt;br /&gt;
&lt;br /&gt;
===MyReconnectProvider===&lt;br /&gt;
Užívateľovi sa môže stať, že prepojí medzi sebou nesprávne piny. Aby napravil chybu, musel by zmazať celé spojenie a vytvoriť ho znovu. Avšak vďaka akcii na opätovné prepojenie mu stačí chytiť koncový bod spojovacej čiary, zdrojový alebo cieľový a spojiť ho s iným terminálom, čím môže opraviť svoju chybu, bez nutnosti mazania spojenia a tvorby nového. Na to slúži interface ConnectionProvider, ktorý je implementovaný nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class MyReconnectProvider implements ReconnectProvider&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Cez getActions().addAction sa cez ActionFactory vytvorí nová reconnect akcia s použitím tohto provideru. Takto vytvorená akcia je volaná v konštruktore triedy MyConnectionWidget. To znamená, že každá spojovacia čiara sa dá znovu prepojiť podľa stanovených podmienok provideru.&lt;br /&gt;
&lt;br /&gt;
Niektoré zdedené triedy z implementácie:&lt;br /&gt;
&lt;br /&gt;
'''public boolean isSourceReconnectable(ConnectionWidget connectionWidget)''' – Metóda, ktorá zisťuje, či je zdrojový widget prepojiteľný. Metóda vráti true hodnotu ak je zdrojový widget typu Pin_Widget.&lt;br /&gt;
&lt;br /&gt;
'''public boolean isTargetReconnectable(ConnectionWidget connectionWidget)''' – Metóda, ktorá zisťuje, či je cieľový widget prepojiteľný. Metóda vráti true hodnotu ak je cieľový widget typu Pin_Widget.&lt;br /&gt;
&lt;br /&gt;
'''public void reconnectingStarted (ConnectionWidget connectionWidget, boolean reconnectingSource)''' – V tejto metóde sa riešia akcie, ktoré sa majú vykonať, ak sa začne s novým prepájaním. V tomto prípade chceme aby sa na mieste kde bola pôvodne spojovacia čiara spojená s Pin_Widgetom znova objavil červený kríž, reprezentujúci terminál, keďže už viac nie je čiara s týmto terminálom spojená.&lt;br /&gt;
public void reconnectingFinished (ConnectionWidget connectionWidget, boolean reconnectingSource) – Metóda, ktorá sa vykoná po dokončení opätovného prepojenia rozpojeného konca spojovacej čiary s náhradným terminálom. Chceme, aby červený kríž reprezentujúci tento terminál zmizol.&lt;br /&gt;
&lt;br /&gt;
'''public ConnectorState isReplacementWidget (ConnectionWidget connectionWidget, Widget replacementWidget, boolean reconnectingSource)''' – Metóda, ktorá zisťuje či daný widget môže byť náhradným pinom. Ak je typu Pin_Widget, nemá hodnotu null a je vstup ak bol aj predošlý pin vstup, resp výstup ak bol rpedošlý pin vystup, metóda vráti hodnotu ConnectorState.ACCEPT. Potom sa môže zavolať nasledujúca metóda.&lt;br /&gt;
&lt;br /&gt;
'''public void reconnect (ConnectionWidget connectionWidget, Widget replacementWidget, boolean reconnectingSource)''' – V tejto metóde sa zmení zdrojový, respektíve cieľový pin, za ten, ktorý sme prepájali.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=D%C3%A1tov%C3%A1_%C4%8Das%C5%A5_simula%C4%8Dn%C3%BDch_komponentov&amp;diff=4386</id>
		<title>Dátová časť simulačných komponentov</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=D%C3%A1tov%C3%A1_%C4%8Das%C5%A5_simula%C4%8Dn%C3%BDch_komponentov&amp;diff=4386"/>
		<updated>2010-05-18T21:26:34Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|3|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Dátová časť simulačných komponentov=&lt;br /&gt;
Widgety v sebe uchovávajú len grafickú časť komponentu. Druhý problém je, že na scéne môže byť len jeden widget z každého druhu, čiže by na scéne mohol byť len jeden Integer, len jeden Slider atď. Aby sme tento problém odstránili, je potrebné každý widget zviazať s inštanciou triedy, ktorá v sebe uchováva dáta. Dáta jednotlivých komponentov môžu predstavovať napríklad meno, kategóriu, cestu k SVG a XML súboru, vnútorné stavy a ďalšie potrebné údaje.&lt;br /&gt;
&lt;br /&gt;
==MyNode==&lt;br /&gt;
Táto trieda predstavuje v DynaSimScene uzol samotný a SVG_Widget je len jeho grafickou reprezentáciou. Trieda samotná je na vrchole hierarchie, dedí len z triedy Object. Konštruktor je nasledovný:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public MyNode(String title, String category, String name, Point location)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Parameter title je názov komponentu, ten sa získava z XML dokumentu, category je meno kategórie do ktorej komponent patrí. XML dokument sa parsuje v konštruktore MyNode, ale aby sme získali jeho meno, potrebujeme XML parsovať ešte predtým. To sa vykonáva v triede BrowseFolders pri tvorbe palety. Meno kategórie je vlastne meno adresára v ktorom je uložený SVG a XML súbor daného komponentu. Name je názov SVG/XML súboru bez prípony a location je miesto, na ktoré sa widget prilepí na scénu.&lt;br /&gt;
V konštruktore sa inicializujú niektoré premenné z parametrov a zavolá sa metóda readXML(), pomocou ktorej sa rozparsuje XML súbor, ktorého cesta sa poskladá z mena kategórie a mena súboru, ktoré sme získali z parametrov. &lt;br /&gt;
Miesto kde sa nachádza knižnica samotná sa získa z metódy getLibraryFolder() inštancie triedy FolderSearcher. FolderSearcher je trieda, ktorá slúži na hľadanie cesty ku knižnici s XML súbormi pre DynaSim. Táto knižnica má názov ''“library“'' a nachádza sa v projekte DynaSimu. FolderSearcher teda začne hľadať v projekte a postupuje hlbšie v adresároch kým nenájde adresár s názvom ''“library“''. Absolútnu cestu k tomuto adresáru si uloží medzi členské premenné a dostať sa k tejto ceste je možné cez metódu getLibraryFolder(). Tvar v akom cestu k adresáru vráti je závislý od operačného systému.&lt;br /&gt;
&lt;br /&gt;
===Štruktúra XML súboru simulačného komponentu===&lt;br /&gt;
Zápis XML súboru komponentu môže vypadať nasledovne:&lt;br /&gt;
 [[Súbor:DynasimXML.jpg]]&lt;br /&gt;
Dáta získané z parsovania takéhoto XML súboru v triede MyNode nám po označení komponentu na scéne vygenerujú PropertySheet, ako môžeme vidieť na obr.10. Ako vidno z časti kódu, root element má názov component a má len jeden atribút s názvom name. Podľa tohto atribútu sa vygeneruje meno pre daný komponent s priradeným poradovým číslom. XML súbor nie je kontrolovaný podľa DTD súboru. Priame detské elementy root elementu sú input, output, properties, desctiptionm, jython. XML môže mať ľubovoľný počet elementov s menom input a output. Input predstavuje vstupný pin, output výstupný. Ich atribúty x a y určujú polohu pinu v rámci komponentu. Je vhodné zvoliť ich tak, aby neboli mimo hraníc komponentu, ktoré sú určené v root elemente SVG súboru. Element name je meno terminálu, môže byť ľubovoľné a type určuje, aký dátový typ daný terminál v sebe drží.&lt;br /&gt;
&lt;br /&gt;
Element properties by mal byť v XML súbore len jeden, ten však môže obsahovať ľubovoľný počet elementov s menom property. Property predstavuje jednu vnútornú premennú, tá je definovaná piatimi elementmi ako vidieť v ukážkovom kóde. Detský element type určuje akého dátového typu je daná premenná. V súčasnosti sú implementované tieto typy: BOOL – ktorý predstavuje boolean hodnotu, INT – hodnotu typu int, FLOAT – float, STRING – String.&lt;br /&gt;
&lt;br /&gt;
Element Description má 3 detské elementy, slúži na opis komponentu. Na obr.10 môžeme vidieť, ako sa textové hodnoty týchto elementov prejavia na Property Sheete. &lt;br /&gt;
&lt;br /&gt;
===MyEdge a MyPin===&lt;br /&gt;
MyEdge a MyPin predstavujú dátovú vrstvu pre spojovaciu čiaru a pin. Každému pinu sa pridelí po jeho vytvorení cez generátor unikátne číslo a to sa zapíše do členskej premennej MyPin s názvom id ako String. Každý MyPin má getter a setter pre premennú typu Point. Hodnota tohto bodu sa získava z XML súboru a používa sa na prilepenie pinu na zvolené miesto v rámci komponentu. MyPin obsahuje premennú typu boolean s názvom isInput. Tá určuje či je pin vstup alebo výstup. Táto informácia sa taktiež získa z XML súboru a ak je element typu input, isInput má hodnotu true, ak je element typu output, isInput má hodnotu false. V premennej connectedPin drží inštanciu pinu s ktorým je tento pin prepojený spojovacou čiarou. Nakoniec má ešte premennú terminalValue typu Value, čo je univerzálny dátový typ, ktorý je nutné používať keďže sa dopredu nedá určiť, s akým dátovým typom bude tento terminál narábať. O aký konkrétny dátový typ sa jedná sa určí v konštruktore na základe mena a typu hodnoty priradenej tomuto pinu. Tie sú opäť získané z XML dokumentu. V ňom sa jedná o atribúty type a name ktoré patria elementu input resp. output, podľa typu terminálu. MyPin obsahuje aj metódu disconnected(). Tá sa zavolá keď sa pin odpojí od spojovacej čiary a tým sa jeho hodnota vynuluje.&lt;br /&gt;
&lt;br /&gt;
MyEdge je tvorená len gettermi a settermi. Má 2 premenné typu String s menom source a target. Tie predstavujú id pinov, ktoré sú spojené touto čiarou.&lt;br /&gt;
&lt;br /&gt;
==Tvorba Properties okna pomocou MyPropertyNode==&lt;br /&gt;
Na editačnú plochu simulátora si užívateľ pridáva simulačné komponenty z palety. Po kliknutí myšou na niektorý z takto pridaných komponentov vyžadujeme, aby sa vygenerovalo okno s hodnotami komponentu, ktoré môže užívateľ upravovať. MyPropertyNode má na starosti vytvorenie Properties okna z údajov obsiahnutých inštanciou MyNode. Príklad takéhoto okna je možno vidieť na nasledovnom obrázku:&lt;br /&gt;
[[Súbor:Dynasim10.jpg|center|framed|Obr.10 Príklad Properies okna]]&lt;br /&gt;
Aby sa takéto okno po označení nejakého komponentu vygenerovalo, musí byť splnených niekoľko nutných podmienok. V prvom rade sa musí vyriešiť medzimodulová komunikácia. Kým sa modul DynaSim stará o editačnú plochu, ktorá je v okne ''editor'', nachádzajúca sa v centrálnej časti programového interface, okno Properties sa nachádza v okne properties, ktoré sa štandardne nachádza v pravej dolnej časti programu a je riadené modulom Nodes API. Ten treba pridať ako závislosť na modul DynaSim. Tým sa však ešte komunikácia medzi modulmi nevyriešila, lebo okno properties stále nebude vedieť, či je vôbec niečo v okne editora označené. Na to existuje trieda Lookup. Za normálnych okolností môže mať jeden TopComponent len jeden Lookup, avšak DynaSimTopComponent potrebuje dva, jeden pre Property okno a druhý nesôkôr pre paletu. To sa dá obísť cez vytvorenie InstanceContent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 private InstanceContent content = new InstanceContent();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
V konštruktore DynaSimTopComponentu potom vytvoríme abstraktný lookup a pridáme ho Topcomponentu nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 associateLookup(new AbstractLookup(content));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
InstanceContent content sa potom prenáša medzi triedami ako premenná v ich konštruktore, z DynaSimTopComponent-u do DynaSimScene, z tej ďalej do Component_Widget – po pridaní simulačného komponentu na plochu editora.&lt;br /&gt;
Component_Widget má zdedenú metódu z triedy Widget s názvom notifyStateChanged, ktorá sleduje zmenu stavu widgetu. Nasledovná časť kódu je z tejto metódy a rieši, čo sa stane po kliknutí na komponent na editačnej ploche.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 if(newState.isSelected()){&lt;br /&gt;
             propNode = new MyPropertyNode(this.getNode());&lt;br /&gt;
             content.set(Collections.singleton(propNode), null);&lt;br /&gt;
             content.add(controller);&lt;br /&gt;
 } else {&lt;br /&gt;
             if(propNode!=null)&lt;br /&gt;
                 try {&lt;br /&gt;
                 propNode.destroy();&lt;br /&gt;
             } catch (IOException ex) {&lt;br /&gt;
                 Exceptions.printStackTrace(ex);&lt;br /&gt;
             }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ak je komponent označený vytvorí sa nová inštancia MyPropertyNode, kde sa za parameter dosadí MyNode inštancia zviazaná s týmto komponentom. V ďalšom riadku sa novovytvorená inštancia uloží do content. A tým sme vlastne dosiahli, že sa nám po kliknutí na simulačný komponent vytvorí propertySheet. Problém je, že sa nám potom stratí paleta, preto treba znova pridať cez content.add kontrolér palety. Slučka else rieši, čo sa stane, keď sa objekt odznačí, napr. Kliknutím na editačnú plochu. Metóda propNode.destroy() zruší túto MyPropertyNode a tým sa Properties okno vynuluje.&lt;br /&gt;
Aby toto všetko mohlo fungovať aj trieda MyPropertyNode musí spĺňať jednu podmienku a to, že musí byť rozšírením AbstractNode triedy. Jej deklarácia je nasledovná:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class MyPropertyNode extends AbstractNode implements PropertyChangeListener&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Konštruktor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public MyPropertyNode(MyNode node) {&lt;br /&gt;
         super(Children.LEAF);&lt;br /&gt;
         this.node = node;    &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
AbstractNode má v konštruktore parameter pre inštanciu triedy Children, pretože sa obvykle používa pri stromových štruktúrach uzlov. V našom prípade však máme len samostatné uzly typu MyNode a nemajú ďalšie detské uzly, preto sa použije LEAF ako koncový uzol. MyPropertyNode má metódu createSheet(), ktorú zdedila z AbstractNode. Táto metóda slúži na vytvorenie Property okna typu Sheet a jeho naplnenie položkami a ich príslušnými hodnotami. Na začiatku sa vytvorí nová inštancia triedy Sheet. Vytvorením inštancie Sheet.Set sa vytvorí nový blok v Properties okne a cez set príkazy mu je možné prideliť meno a popis. Jednotlivé hodnoty položiek, ktoré sa majú v takomto bloku zobrazovať sa nachádzajú v inštancii triedy MyNode. Ako tieto hodnoty zobraziť v Properties okne sa dá jednoducho ukázať na nasledovnom príklade:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Property categoryProp = new PropertySupport.Reflection (node, String.class, &amp;quot;getCategory&amp;quot;, null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Konštruktor triedy Reflection je nasledovný:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Reflection (Object o, Class type, String method1, String method2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Object o predstavuje triedu z ktorej chceme danú hodnotu získať resp. nastaviť cez Properties okno. Class type je typ premennej s ktorou chceme pracovať, to môže byť int.class, String.class a pod. String method1 predstavuje názov getteru pre túto premennú a method2 názov setteru v s Stringu. Ak má method2 hodnotu null nie je možné meniť jeho hodnotu pomocou Properties okna. Z toho vyplýva, že v predošlom príklade chceme z inštancie node typu MyNode získať premennú dátového typu String. Názov getteru je getCathegory() a nie je možné meniť túto hodnotu cez setter v Properties okne.&lt;br /&gt;
&lt;br /&gt;
Gettery a settery sa logicky musia nachádzať v triede MyNode. Každá premenná ktorú chceme zobraziť v Properties okne musí mať minimálne svoj getter a v prípade, že ju chceme v okne aj editovať musí mať aj setter. Štandardne má každý komponent 5 základných hodnôt, ktoré ho opisujú a to je Name, Category, Type, Function, Description (obr.10). Name je jediná meniteľná položka, ostatné sú nemenné Category je meno adresára v ktorom je uložený XML súbor a ostatné položky sa získajú parsovaním tohto XML dokumentu. &lt;br /&gt;
&lt;br /&gt;
Mimo týchto základných položiek môže mať komponent aj ďalšie. Tie opisujú hodnoty jeho vnútorných stavov. Každý komponent by mal mať ľubovoľné množstvo vnútorných hodnôt, ľubovoľného dátového typu. Tu však nastáva vážny problém! Každá z týchto  hodnôt musí mať svoj vlastný getter a setter, a keďže Java nedokáže za chodu programu do triedy dopisovať metódy musia sa do triedy napísať pred kompilácoiu. Inými slovami, ak očakávame, že žiadny komponent nebude mať viac ako 6 vnútorných hodnôt musíme vytvoriť 6 getterov a 6 setterov pre int, 6 getterov a 6 setterov pre float atď. Takže treba vytvoriť v triede MyNode gettery a settery pre všetky dátové typy s ktorými chceme v programe DynaSim pracovať. Počet týchto getterov a setterov obmedzuje možný počet hodnôt, ktoré možno zobraziť a upraviť v Properties okne. Ak budeme mať 3 gettery a settery pre každý dátový typ, Properties okno nebude schopné zobraziť viac ako 3 prvé položky. Ak teda uvažujeme, že chceme mať komponenty so 100 vnútornými hodnotami, potrebujeme vytvoriť 100 getterov a 100 setterov pre každý dátový typ!!! Z toho dôvodu je súčasná verzia programu obmedzená na 6 vnútorných hodnôt pre dátové typy int, float, boolean a String.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Interakt%C3%ADvny_simul%C3%A1tor_DynaSim&amp;diff=4385</id>
		<title>Interaktívny simulátor DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Interakt%C3%ADvny_simul%C3%A1tor_DynaSim&amp;diff=4385"/>
		<updated>2010-05-18T21:19:46Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|1|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|Práca sa zaoberá budovaním frameworku interaktívneho simulačného programu na platforme NetBeans. V práci je rozobratý spôsob tvorby vizuálneho rozhrania za použitia Visual Library API, ďalej spôsob tvorby jednotlivých simulačných komponentov a ich dátovej štruktúry za pomoci Nodes API, tvorba užívateľského rozhrania a nakoniec implementácia simulačného algoritmu. Jednotlivé simulačné komponenty sa môžu do programu pridávať dodatočne a sú založené na popise XML a SVG súborov.&lt;br /&gt;
|This graduation thesis deals with building of framework for interactive simulation program based on NetBeans platform. This thesis deals with approach to making visual interface using Visual Library API, approach to making individual simulation components and their data structure using Nodes API, making of user interface and finally implementation of simulation algorithm. Individual simulation components can be added to the program additionally and are based on XML and SVG definition.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Úvod'''&lt;br /&gt;
&lt;br /&gt;
V súčasnej dobe existuje množstvo komerčne dostupných produktov zameraných na simulácie a riadenie technologických procesov, ako sú napr. LabView, Simulink ako súčasť Matlab-u a pod. Mnohé z týchto produktov majú za sebou dlhú dobu vývoja a sú úspešne nasadzované v systémoch riadenia technologických procesov. Pre bežných užívateľov, alebo z hľadiska procesu výučby, majú tieto komerčné produkty určité nedostatky vyplývajúce z ich podstaty. Sú to uzatvorené systémy, do ktorých užívateľ nemá prístup, môže sa pohybovať iba v rozmedzí určitých „mantinelov“, ktoré mu vymedzili vývojári produktu. Užívateľ nemá možnosť verifikovať, či upravovať implementovaný simulačný algoritmus v simulačných komponentoch, takisto ako nemá možnosť tvorby vlastných komponentov. Neumožňujú prácu na viacerých platformách, ak existuje distribúcia pre inú platformu, treba si na ňu zvlášť zakúpiť licenciu. V neposlednej rade je nepriaznivým faktorom takýchto komerčných produktov aj prehnane vysoká cena.&lt;br /&gt;
&lt;br /&gt;
Pre to sa zrodila myšlienka vytvoriť simulátor, ktorý by tieto nevýhody odstránil. DynaSim je interaktívny simulátor postavený na platforme NetBeans, vytvorený v programovacom jazyku Java. Tým spája výhody objektového programovania, multiplatformovosti s možnosťou využitia prepracovaných knižníc prakticky zo všetkých oblastí informačných technológií. DynaSim dáva možnosť užívateľovi interaktívne zasahovať do simulačného procesu vďaka integrácii interaktívnych simulačných komponentov. Vďaka využitiu rôznych NetBeans modulov má užívateľ možnosť nastaviť si vlastné užívateľské rozhranie podľa potreby. Veľkou výhodou je aj možnosť pridávania vlastných simulačných komponentov, ktoré sa skladajú z grafickej časti popísanej SVG súborom, dátovej časti popísanej jednoduchým XML súborom a Java .class súborom, ktorý opisuje simulačný algoritmus komponentu. Oproti komerčným produktom má samozrejme najväčšiu výhodu v tom, že je zadarmo a je open-source. Užívateľ môže kedykoľvek nahliadnuť do zdrojového kódu, robiť v programe úpravy podľa vlastnej potreby. Tak isto jednoduché je nahliadnuť do zdrojového kódu jednotlivých simulačných komponentov.&lt;br /&gt;
V práci je rozobratý postup tvorby rich-client aplikácie postavenej na platforme Netbeans, využitie rôznych štandardných knižníc tejto platformy na vybudovanie základného frameworku pre simulátor, ako aj implementácia základných simulačných komponentov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Platforma NetBeans=&lt;br /&gt;
Platforma NetBeans je framework pre Swing aplikácie. NetBeans bol pôvodne vyvíjaný ako študentský projekt na Karlovej Univerzite v Prahe. Projekt kúpila v roku 1999 spoločnosť Sun a v roku 2000 z neho spravila open-source projekt.  Platforma poskytuje pre aplikácie na nej vyvíjané ukladanie stavu, prepájanie akcií s menu položkami, toolbary, klávesové skratky, či správu okien a mnohé ďalšie veci, ktoré predtým musel každý vývojár písať samostatne. &lt;br /&gt;
NetBeans platforma poskytuje spoľahlivú a flexibilnú aplikačnú architektúru. Aplikácie postavené na tejto platforme nemusia nutne vypadať ako NetBeans IDE, ktoré je tiež postavené na nej. Využitím NetBeans platformy je možné ušetriť mnohé mesiace vývoja.&lt;br /&gt;
Za posledných niekoľko rokov sa zvýšila popularita ''rich-client'' desktopových platforiem. Tento trend viedli práve NetBeans platforma a Eclipse RCP. Kým Eclipse RCP je založená na  SWT a JFace, čo sú nové neštandardné štýly a koncepty, platformna NetBeans je kompletne závislá od štandardných Java API s použitím AWT a Swing, čím plne integruje pôvodný koncept Java SE.&lt;br /&gt;
&lt;br /&gt;
==Charakteristiky Rich Client Platformy==&lt;br /&gt;
Rich-client platforma je aplikačné prostredie – základ desktopových aplikácií. Väčšina desktopových aplikácií má podobné vlastnosti ako sú rôzne menu, toolbary, status bary, zobrazovanie dát, ukladanie a nahrávanie užívateľsky špecifických dát a pod. Na tieto a ďalšie typické vlastnosti klientských aplikácií rich-client platforma poskytuje framework, s ktorým sa tieto vlastnosti dajú jednoducho spojiť dokopy. Framework takéhoto druhu sa zameriava na konfigurovateľnosť a rozšíriteľnosť aplikácie. &lt;br /&gt;
Najdôležitejším aspektom rich-client platformy je jej architektúra. Aplikácie založené na rich-client platforme sú písané vo forme modulov, v ktorých sú logicky koherentné časti aplikácie izolované.&lt;br /&gt;
Okrem Modularity ponúkanej rich-client architektúrou, ktorá poskytuje vysokú mieru robustnosti a hodnoty pre koncového užívateľa, poskytuje aj ďalšie výhody a to:&lt;br /&gt;
*Zníženie vývojového času&lt;br /&gt;
*Konzistentnosť užívateľského rozhrania&lt;br /&gt;
*Možnosť updatovania&lt;br /&gt;
*Platformovú nezávislosť&lt;br /&gt;
*Znovupoužiteľnosť a spoľahlivosť&lt;br /&gt;
&lt;br /&gt;
'''Zníženie vývojového času''' – Rich-client platforma poskytuje viacero API pre vývoj desktopových aplikácií. Vďaka znovupoužiteľnosti mnohých preddefinovaných komponentov sú vývojári schopní koncentrovať sa na funkčnú logiku aplikácie.&lt;br /&gt;
&lt;br /&gt;
'''Konzistentnosť užívateľského rozhrania''' – Rich-client platforma poskytuje framework pre zobrazenie užívateľského rozhrania a obzvlášť sa stará o konzistentnosť, prístupnosť a použiteľnosť.&lt;br /&gt;
&lt;br /&gt;
'''Možnosť updatovania''' – Za použitia rich-client platformy je možné rýchlo a efektívne distribuovať nové alebo updatované moduly koncovým užívateľom. Updaty môžu byť distribuované a inštalované formou modulov, to znamená, že nové nekonfliktné prvky aplikácie môžu byť vyvíjané nezávisle druhým vývojárskym týmom.&lt;br /&gt;
&lt;br /&gt;
'''Platformová nezávislosť''' - Rich-client platformy sú založené na medzinárodných štandardoch a znovupoužiteľných komponentoch. To znamená, že Java aplikácie na nich postavené sú automaticky spustiteľné na rôznych operačných systémoch ako sú Windows, či Linux, ak majú k dispozícii Java Runtime Environment. &lt;br /&gt;
&lt;br /&gt;
'''Znovupoužiteľnosť a spoľahlivosť''' – Rich-client platformy poskytujú širokú škálu modulov a funkcií, ktoré môžu byť využité vo vytváranej aplikácii. Ak modul úplne nezodpovedá požiadavkám aplikácie, je možné ho použiť ako počiatočný bod a následne ho rozšíriť alebo zmeniť podľa potreby. Keďže väčšina platforiem dáva k dispozícii aj svoje zdrojové kódy, niekedy môže byť výhodnejšie zmeniť alebo rozšíriť platformu samotnú. Tieto faktory implikujú veľkú mieru spoľahlivosti a voľnosti.&lt;br /&gt;
&lt;br /&gt;
==Charakteristiky Platformy NetBeans==&lt;br /&gt;
Platforma NetBeans ponúka okrem bežných výhod rich-client platformy viacero frameworkov a niekoľko ďalších špecifík, ktoré môžu byť užitočné pre niektoré aplikácie. Za zmienku stojí napríklad:&lt;br /&gt;
*Framework pre užívateľské rozhranie&lt;br /&gt;
*Data editor&lt;br /&gt;
*Customization display&lt;br /&gt;
*Wizard framework&lt;br /&gt;
*Data systémy&lt;br /&gt;
*Medzinárodnosť&lt;br /&gt;
*Help system&lt;br /&gt;
&lt;br /&gt;
'''Framework pre užívateľské rozhranie''' – Okná, menu, toolbary a daľšie komponenty sú poskytované platformou. To znamená, že sa vývojár môže sústrediť na špecifické úlohy, čo zmenší dĺžku kódu a zníži náchylnosť na chybu. Celý užívateľský interface v platforme NetBeans je založený na AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
'''Data Editor''' – je editor z NetBeans IDE a môžu ho používať aj iné aplikácie. Nástroje a funkčnosť editora môžu byť rýchlo a ľahko rozšírená a adaptovaná na požiadavky aplikácie.&lt;br /&gt;
&lt;br /&gt;
'''Customization display''' – Displej s užívateľsky a aplikačne špecifickými nastaveniami je potrebný v každej aplikácii.&lt;br /&gt;
&lt;br /&gt;
'''Wizard Framework''' – Platforma NetBeans ponúka jednoduché nástroje na tvorbu rozšíriteľých a user-friendly asistentov, ktorí budú užívateľa sprevádzať cez komplexné kroky v aplikácii.&lt;br /&gt;
&lt;br /&gt;
'''Data Systémy''' – U platformy NetBeans, dáta môžu byť lokálne alebo prístupné cez FTP, CVS, databázu, alebo XML súbor. Dátový prístup z jedného modulu je transparentný pre všetky ostatné moduly vďaka použitiu abstrakcie. Samotný dátový prístup je riešený pomocou NetBeans API.&lt;br /&gt;
&lt;br /&gt;
'''Medzinárodnosť''' – Platforma NetBeans poskytuje triedy a metódy na preklad JavaHelp a ďalších zdrojov do cudzích jazykov.&lt;br /&gt;
&lt;br /&gt;
'''Help System''' – Pomocou štandardného JavaHelp systému, NetBeans platforma ponúka centrálny systém pre integráciu a zobrazovanie nápovedy pre koncového užívateľa. Samostatné moduly môžu pridať ich vlastné nápovedy do help systému aplikácie.&lt;br /&gt;
&lt;br /&gt;
==Architektúra Platformy NetBeans==&lt;br /&gt;
Základným stavebným blokom platformy NetBeans je modul. Modul je kolekcia funkčne súvisiacich tried, spoločne s popisom rozhraní ktoré modul poskytuje a popisom ďalších modulov, ktoré potrebuje na to aby fungoval. Celá platforma NetBeans, rovnako ako aj aplikácie na nej postavené sú rozdelené do modulov. Tie sú nahraté jadrom Platformy NetBeans, ktoré sa nazýva NetBeans runtime container. NetBeans runtime container loaduje aplikačné moduly dynamicky a automaticky a následne je aj zodpovedný za beh aplikácie. V tomto prípade je NetBeans IDE dobrým príkladom modulárnej rich-client aplikácie. Funkčnosť a charakteristiky IDE ako napríklad podpora jazyku Java alebo editor zdrojového kódu , sú tvorené formou modulov postavených na Platforme Netbeans. To so sebou prináša možnosť rozšíriť aplikáciu o ďalšie moduly a možnosť adaptácie na špecifické požiadavky užívateľa tým, že sa nepoužívané moduly deaktivujú alebo odinštalujú.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim01.jpg|center|framed|Obr.1 Konceptuálna štruktúra NetBeans IDE]]&lt;br /&gt;
&lt;br /&gt;
Aby aplikácia dosiahla takýto stupeň modularity, Platforma Netbeans na jednej strane dovoľuje modulom dedičnosť inými modulmi a na strane druhej im dovoľuje komunikovať medzi sebou bez vzájomnej závislosti na sebe. Inými slovami Platforma NetBeans podporuje loose coupling (voľné prepojenie) modulov v rámci aplikácie.&lt;br /&gt;
Na optimalizáciu zapúzdrenia kódu do modulov. Čo je v modulárnom systéme nevyhnutné, Platforma NetBeans poskytuje svoj vlastný classloader systém. Každý modul je nahratý jeho classloaderom a tým sa sprístupní separátna nezávislá časť kódu. Na využitie funkčnosti ostatných modulov, modul môže deklarovať závislosti (dependency) na iných moduloch. &lt;br /&gt;
Samotná platforma NetBeans je sformovaná zo skupiny jadrových modulov (Obr.2), ktoré sú potrebné na spustenie aplikácie a na definovanie jej užívateľského rozhrania. Platforma NetBeans ponúka veľké množstvo API, čím značne zjednodušuje vývojový proces. Do tejto skupiny patria napríklad Actions API, Nodes API, Options SPI a ďalšie.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:ArchitekturaNetBeans.jpg|center|framed|Obr.2 Architektúra Platformy NetBeans]]&lt;br /&gt;
&lt;br /&gt;
==Tvorba aplikácie na Platforme NetBeans==&lt;br /&gt;
Ako už bolo spomenuté, základom platformy NetBeans a aplikácií na nej postavených sú moduly. Najskôr je potrebné vytvoriť aplikáciu samotnú. NetBeans IDE obsahuje wizarda na tvorbu takéhoto projektu. Cez ''File → New Project'' sa dostaneme do dialógového okna, kde vyberieme príslušnú kategóriu a projekt podľa  obr.3.&lt;br /&gt;
Na ďalšej strane sa vyplní názov projektu a zadá sa cesta, kde sa má projekt uložiť. Týmto sa vytvorilo niekoľko konfiguračných súborov aplikácie. Aby sme však aplikácii mohli dať funkcionalitu, musíme do nej pridať minimálne jeden modul.&lt;br /&gt;
Tvorba modulu je obdobná ako v prípade aplikácie samotnej s tým rozdielom, že podľa obr.3 v položke ''Projects'' vyberieme ''Module'' a vyplníme všetky náležitosti v dialógovom okne. V takom prípade sa vytvorí prázdny modul, obsahujúci len základné knižnice a niekoľko konfiguračných súborov.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim03.jpg|center|framed|Obr.3 Tvorba novej aplikácie na platforme NetBeans]]&lt;br /&gt;
&lt;br /&gt;
==Používanie knižníc a pridávanie závislostí na moduloch==&lt;br /&gt;
Keďže aplikácia bude pracovať s SVG a XML súbormi je nutné pridať do projektu knižnicu JDOM. JDOM je knižnica, ktorá rieši prístup k údajom XML súboru a ich manipuláciu.  JDOM sa nenachádza v štandardnom balíčku knižníc Javy, preto ju treba stiahnuť napríklad z adresy http://www.jdom.org/ .&lt;br /&gt;
Vzhľadom na to, že celá aplikácia je založená na moduloch, je vhodné integrovať externý JAR súbor knižnice vo forme modulu. Tým pádom je možné pridať túto knižnicu ako závislosť pre iné moduly, čím sa zvýši konzistencia aplikácie ako celku.&lt;br /&gt;
Opäť podobne ako v predchádzajúcom prípade podľa obr.3 v položke ''Projects'' vyberieme ''Library Wrapper Module''. V novom okne pridáme jdom.jar a jeho licenčný súbor. Ďalej sa postupuje ako v prípade vytvárania nového modulu.&lt;br /&gt;
Takto vytvorený modul je teraz nutné pridať modulu, ktorý potrebuje danú knižnicu využívať. Najskôr je potrebné sa uistiť, že sú všetky triedy knižnice sprístupnené cez ''Public Packages''. V pravej časti programu NetBeans IDE v okne ''Projects'' treba kliknúť pravým tlačítkom na modul knižnice a vyberať položku ''Properties''. V ''Properties'' okne potom vyberieme položku ''API Versioning''. Všetky balíčky v ''Public Packages'' musia byť zaškrtnuté  (viz. obr.4). To nám zaručí, že je modul verejný a budú ho môcť využívať iné moduly. Takýto modul sa objaví v ponuke závislostí medzi modulmi platformy NetBeans.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim04.jpg|center|framed|Obr.4 Tvorba verejného modulu]]&lt;br /&gt;
&lt;br /&gt;
Keď už má modul alebo knižnica všetky jeho balíčky verejné, môžeme ho pridať ako závislosť druhému modulu. V pravej časti programu NetBeans IDE v okne ''Projects'' treba kliknúť pravým tlačítkom na modul, ktorému chceme pridať závislosť a vyberieme položku ''Properties''. V ''Properties'' okne potom vyberieme položku ''Libraries''. Tu sa po kliknutí na ''Add Dependency'' objaví nové okno, ktoré obsahuje všetky dostupné moduly patriace platforme Netbeans, ale aj moduly, ktoré vytvoril užívateľ a sprístupnil ich cez Public Packages v API versioning. Tu nájdeme modul od ktorého má byť náš modul závislý. Môže to byť modul NetBeansu, vlastný modul, či knižničný modul. Jednému modulu môžeme pridať neobmedzené množstvo závislostí.&lt;br /&gt;
&lt;br /&gt;
==Visual Library API==&lt;br /&gt;
NetBeans platforma obsahuje veľké množstvo modulov, avšak pre účely simulačného programu DynaSim je obzvlášť významná Visual Library API. &lt;br /&gt;
Je to je knižnica, ktorá slúži na zobrazovanie rôznych štruktúr. Knižnica sa obzvlášť hodí na tvorbu grafovo orientovaných reprezentácií. Táto knižnica sa používa v NetBeans mobility pack, v návrhári JSF navigácie a ďalších nástrojoch. Knižnicu ale možno použiť aj mimo NetBeans platformu v akejkoľvek aplikácii založenej na Swingu. Na použitie Visual Library API stačí modulu ktorý ju má používať pridať na ňu závislosť podľa predošlej kapitoly. &lt;br /&gt;
Komponenty vo Visual Library API majú podobne ako pri Swingu stromovú štruktúru. Superclass všetkých grafických komponentov je trieda Widget. Tým pádom v grafovo orientovanom modeli kde sú ulzy vzájomne prepojené hranami, sa za widgety považujú všetky uzly aj hrany.  Widget môže zároveň slúžiť aj ako kontajner pre ďalšie widgety. Každý widget má pozíciu relatívnu k rodičovskému widgetu. Superclass Widget je zodpovedná za prezentáciu okraja a pozadia widgetu, ale aj jeho vlastností ako je farba, či priehľadnosť. Podobne ako Swing kontajner aj widget má layout, ktorý rieši poziciovanie jeho detských widgetov. Widget je možné zviazať s viacerými akciami, ktoré sa vykonajú za splnenia špecifických podmienok.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim01.jpg&amp;diff=4384</id>
		<title>Súbor:Dynasim01.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim01.jpg&amp;diff=4384"/>
		<updated>2010-05-18T21:18:49Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Konceptuálna štruktúra NetBeans IDE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Konceptuálna štruktúra NetBeans IDE&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Funk%C4%8Dn%C3%A1_%C4%8Das%C5%A5_programu_DynaSim&amp;diff=4383</id>
		<title>Funkčná časť programu DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Funk%C4%8Dn%C3%A1_%C4%8Das%C5%A5_programu_DynaSim&amp;diff=4383"/>
		<updated>2010-05-18T21:12:44Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Vytvorená stránka „Kategória:Študentské práce Kategória:Diplomové práce Kategória:Informatika {{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček| Ing. Juraj Ďuďák| 2009/2…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|5|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Funkčná časť programu DynaSim=&lt;br /&gt;
V predošlých kapitolách sme vybudovali základný framework pre simulátor. Vieme vytvoriť grafickú časť komponentov a dátovú časť, ktorá v sebe drží určité informácie ako je poloha vstupov a výstupov, ich typ, vnútorné hodnoty komponentu a popis komponentu. To však na vykonanie simulácie nie je dostačujúce. Každý z komponentov musí mať svoj simulačný algoritmus, ktorý sa cyklicky opakuje počas behu simulácie.&lt;br /&gt;
&lt;br /&gt;
==Globálny simulačný algoritmus==&lt;br /&gt;
Globálny simulačný algoritmus je veľmi jednoduchý a dá sa rozdeliť na 2 kroky. V kroku číslo 1 si komponent načíta hodnoty z vlastných vstupov a vykoná funkciu – simulačný algoritmus. Po výpočte sa prenesú výsledky funkcie na výstupy komponentu. Tento postup sa zopakuje pre všetky komponenty v schéme. V kroku číslo 2 sa vykoná prenos z jednotlivých výstupov komponentov na vstupy s ktorými sú prepojené spojovacími čiarami. Tento postup sa cyklicky opakuje s periódou určenej dĺžky.&lt;br /&gt;
[[Súbor:Dynasim15.jpg|center|framed|Obr.15 Globálny simulačný algoritmus]] &lt;br /&gt;
Celý tento algoritmus sa vykonáva v rámci triedy DynaSimScene. Ako časovač sa používa ScheduledExecutorService. V triede DynaSimScene sa nachádza metóda runSimulation(), ktorá sa volá po stlačení príslušného toolbar tlačítka na spustenie simulácie. V nej sa vytvorí nová inštancia nášho časovača.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 exec = Executors.newSingleThreadScheduledExecutor();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Následne sa zavolá metóda simulate, ktorá vypadá nasledovne:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public void simulate() {&lt;br /&gt;
    final Runnable simulator = new Runnable() {&lt;br /&gt;
       public void run() { simulation(); }&lt;br /&gt;
    };&lt;br /&gt;
    exec.scheduleAtFixedRate(simulator,100, 100, TimeUnit.MILLISECONDS);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
V nej sa vytvorí inštancia rozhrania Runnable a do jeho metódy run() sa zavolá metóda, ktorá sa má cyklicky opakovať, v našom prípade je to metóda simulation(). Nakoniec sa zavolá metóda nášho časovača scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit). Prvý parameter je Runnable, tam sa dosadí náš vytvorený Runnable, tu sa jedná práve o metódu, ktorá sa bude opakovane pomocou tohto časovača vykonávať. Parameter initialDelay je oneskorenie s akým sa časovač spustí, period je perióda s akou sa bude Runnable vykonávať a nakoniec unit, je časová jednotka pre druhý a tretí parameter. To znamená, že po stlačení tlačítka pre spustenie simulácie sa začne cyklicky vykonávať metóda simulation() s periódou 100 milisekúnd. Tá má na starosti vykonávanie globálneho simulačného algoritmu, kde sa nájdu všetky widgety na scéne a následne im pridelené simulačné komponenty typu Component. Tie postupne vykonajú svoje funkcie, výsledky svojich funkcií prenesú na výstupy. Potom sa zavolá metóda na prenos z výstupov na vstupy ďalších komponentov s ktorými sú spojené.&lt;br /&gt;
&lt;br /&gt;
==Simulačné komponenty==&lt;br /&gt;
Čo presne sú simulačné komponenty? Doteraz pre nás boli iba XML a SVG dokumenty, tie však predstavujú iba dátovú štruktúru týchto komponentov. Aby tieto komponenty mohli vykonávať svoje simulačné algoritmy, musia nevyhnutne obsahovať nejaký druh zdrojového kódu, ktorý určuje ich funkcie. Každý jeden komponent má vlastný .java súbor ktorý obsahuje triedu daného komponentu. V nej má zapísané svoje metódy. Každá takáto trieda dedí z rodičovskej triedy Component. Aby sme teda mohli pochopiť ako fungujú jednotlivé komponenty, treba začať od vrchu hierarchie.&lt;br /&gt;
===Trieda Component===&lt;br /&gt;
Trieda Component je abstraktná trieda a slúži na tvorbu tried pre jednotlivé simulačné komponenty. Ich .java súbory sa nachádzajú v knižnici medzi XML a SVG súbormi. Problém však je, že nedokážeme priamo dynamicky vytvoriť inštancie tried obsiahnutých v .java súboroch, vzhľadom na to, že tieto súbory nie sú v podstate nič viac ako textové dokumenty. To znamená, že ich treba skompilovať a vzniknuté .class súbory sa už dajú použiť na tvorbu inštancií za behu programu. Ich inštancie sa tvoria priamo v metóde createComponent, ktorá patrí triede Component. Tejto metóde je predaný parameter typu String s názvom className. To je meno .class triedy, má tvar napríklad sk.tnuni.dynasim.kategória.meno, kde kategória je meno kategórie, ktorej komponent patrí a meno je meno .class súboru bez prípony. Na nájdenie tejto cesty sa opäť používa FolderSearcher. Jeho metóda getClassFolder vráti presnú cestu k adresáru s .class súbormi. K nemu sa už podľa potreby z MyNode pripne kategória a meno tým získame hľadaný className parameter. Ako sa vytvára inštancia zo známeho className môžeme vidieť na príklade:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Component component = null;&lt;br /&gt;
 Class  [] classParm  = null;&lt;br /&gt;
 Object [] objectParm = null;&lt;br /&gt;
&lt;br /&gt;
 try&lt;br /&gt;
 {&lt;br /&gt;
     Class cl = Class.forName(className);&lt;br /&gt;
     java.lang.reflect.Constructor co = cl.getConstructor(classParm);&lt;br /&gt;
     component = (Component)co.newInstance(objectParm);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Najskôr vytvoríme inštanciu Class pre zadané meno. Potom sa pokúsime vytvoriť jej konštruktor. Tomu predávame prázdne pole parameterov, to znamená, že chceme vytvoriť bezparametrický konštruktor. Nakoniec sa vytvorí inštancia triedy Component z novovytvoreného konštruktora. Treba si uvedomiť, že týmto sme nepriamym spôsobom vytvorili inštanciu triedy nejakého konkrétneho simulačného komponentu podľa zadanej cesty v className parametri. Inštancie triedy Component sa tvoria v metóde attachNodeWidget v triede DynaSimScene. To znamená, že krátko po vytvorení ľubovoľného dátového uzla sa volá táto metóda, aby sa mu priradil príslušný grafický widget a práve tu sa vytvorí aj jeho funkčná časť – inštancia triedy Component.&lt;br /&gt;
Trieda Component má niekoľko členských premenných, ktoré sú potrebné pre jej metódy. Drží v sebe inštanciu MyNode, teda dátový uzol ktorému patrí, aby mala táto trieda prístup k jej vnútorným hodnotám. Ďalej je to jej prislúchajúci SVG_Widget, ten sa volá pre potreby vytvorenia meniteľného textu priamo vo widgete. Inštancia DynaSimScene je tiež jednou z jej premenných a je potrebná na prekreslovanie scény v prípade, že  vykonané zmeny týmto komponentom majú nejaký dopad na jej grafickú reprezentáciu. Nakoniec v sebe drží 2 polia referencií na všeobecný dátový typ Value. Jedno pole sú referencie na vstupné hodnoty terminálov a druhé referencie na výstupné hodnoty. Jednotlivé položky týchto polí sú obvykle volané v simulačnom alogritme komponentov. Teraz sa pozrieme na metódy tejto triedy.&lt;br /&gt;
&lt;br /&gt;
'''public abstract void toDo()''' – Metóda, ktorú musí mať každý simulačný komponent. Táto metóda obsahuje simulačný algoritmus komponentu a je volaná v metóde simulation(), ktorá sa pri spustenej simulácii cyklicky opakuje.&lt;br /&gt;
&lt;br /&gt;
'''public void updateComponentProperties()''' – V triede Component je to prázdna metóda bez kódu. Jej detské triedy ju však môžu prepísať a doplniť do nej kód, ktorý sa má vykonávať vždy keď je zaznamenaná nejaká zmena v Property okne, či už to je nastavovanie nejakej hodnoty alebo jej zmena vplyvom simulácie. Môžeme túto metódu chápať ako listener pre Property okno a kód v nej sa vykoná vždy keď dôjde k nejakým zmenám ľubovoľnej položky v tomto okne.&lt;br /&gt;
&lt;br /&gt;
'''public void updateTerminals()''' – Metóda, ktorá sa cyklicky opakuje počas spustenej simulácie. Je volaná vždy pred toDo() metódou. Nájdu sa všetky vstupné terminály tohto komponentu typu MyPin a do jednotlivých položiek Value sa uložia hodnoty týchto vstupov. Rovnaký proces sa vykoná s výstupmi. Jedná sa teda o inicializáciu hodnôt vstupov a výstupov.&lt;br /&gt;
&lt;br /&gt;
'''public void sendToNextTerminal()''' – Ďalšia z metód ktorá sa cyklicky opakuje v metóde simulation(). Táto sa začne vykonávať pre každý terminál až v momente, keď už všetky komponenty na scéne dokončili svoju metódu toDo(). Táto metóda slúži na prenos výstupných hodnôt, ktoré sú uložené vo výstupných termináloch na pripojené vstupné terminály. Táto metóda slúži na vykonanie druhého kroku globálneho simulačného algoritmu.&lt;br /&gt;
&lt;br /&gt;
'''public void public void setChangableText(int x,int y, String text)''' – Každý SVG_Widget má 1 meniteľný text, ktorý dáva triede Component k dispozícii, užívateľ môže nastaviť jeho polohu a obsah textu. Text je centrovaný v bode x,y.&lt;br /&gt;
&lt;br /&gt;
'''public int getIntProperty(String key)''' – táto metóda slúži ako prístupový mostík k dátam z MyNode. Existujú ekvivalentné metódy getterov pre všetky používané typy premenných, tak isto aj settery. Pomocou String key určíme, hodnotu ktorej premennej chceme. Premenné sú určené kľúčom v XML súbore v elemente &amp;lt;key&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Teraz sa pozrieme na spôsob tvorby nejakého konkrétneho simulačného komponentu. Treba si na príklade uvedomiť, ktoré časti sú nutné a ktoré sú nepovinné. ConstInteger je jednoduchý komponent, ktorý nemá žiadne vstupy a výstup je nejaká celočíselná hodnota, ktorú si užívateľ zadá v Properties okne.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class ConstInteger extends Component {&lt;br /&gt;
     int value = 0;&lt;br /&gt;
     public ConstInteger(){}&lt;br /&gt;
 	&lt;br /&gt;
     public void toDo(){&lt;br /&gt;
         ((ValueInt) out[0]).value = value;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void updateComponentProperties(){&lt;br /&gt;
         value = getIntProperty(&amp;quot;VALUE&amp;quot;);&lt;br /&gt;
         setChangableText(Integer.toString(value));&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Prvú vec ktorú si môžeme všimnúť z tohto príkladu je, že náš ConstInteger dedí z triedy Component. Toto je nutnosť pre všetky simulačné komponenty, práve z dôvodu, že sú tvorené cez Component triedu. Konštruktor musí byť vždy prázdny a bezparametrický! Metóda toDo je samotný simulačný algoritmus komponentu. Tu môžeme vidieť, akým spôsobom sa zadaná hodnota value odosiela na výstup tohto komponentu. Premenná out[0] je typu Value a je to referencia na hodnotu prvého výstupu. Preto je treba pretypovať ju na niektorú zo skutočných hodnôt. ValueInt predstavuje integer. Týmto špeciálnym triedam sa venuje ďalšia podkapitola. Prístup ku vstupným premenným máme cez in[x], kde x je poradové číslo terminálu. Terminály sú číslované od 0. K výstupom máme prístup cez out[x]. Nakoniec tu je metóda updateComponentProperties(). Táto nie je nutná, ale je vhodná práve pre updatovanie hodnôt z Properties okna. Ako bolo povedané táto metóda sa volá vždy po vykonaní nejakej zmeny v Properties okne. To znamená, že keď v tomto okne zmeníme nejakú položku, napríklad hodnotu integera, táto metóda sa zavolá. V takom prípade sa do hodnoty value zapíše nová hodnota, získaná z property okna. Na druhom riadku sa nastaví widgetu meniteľný text na súradniciach (0,0) a jeho popis bude novozískaná hodnota z property okna.&lt;br /&gt;
 &lt;br /&gt;
Samozrejme tu sa jedná len o triviálny príklad, obsah metódy toDo() obvykle býva komplexnejší a užívateľ si môže vytvárať v triede komponentu aj vlastné metódy,  triedy a volať akékoľvek dostupné Java knižnice, takže vo svojej podstate môže dať komponentu ľubovoľnú funkcionalitu.&lt;br /&gt;
&lt;br /&gt;
===Value – univerzálny dátový typ===&lt;br /&gt;
Trieda Value a jej detské triedy sa nachádzajú v balíčku sk.tnuni.dynasim.numeric. Jedná sa o zbierku tried, ktoré reprezentujú rôzne dátové typy a umožňujú medzi sebou vzájomné konverzie. Tieto triedy pôvodne vytvoril RNDr. Peter Fabo pre svoj simulačný program. Keďže výstupný terminál môže byť iného dátového typu ako vstupný terminál s ktorým je spojený, za normálnych okolností chceme, aby došlo k pretypovaniu hodnoty prichádzajúcej z výstupu,  na hodnotu očakávanú na vstupe. Trieda Value nám ponúka jedno z možných riešení tohto problému. Value je abstraktná trieda a má len niekoľko abstraktných metód, zväčša na matematické operácie. Má ale niekoľko detských tried, ktoré z nej dedia a to sú: ValueAny, ValueBoolean, ValueChar, ValueInt atď. Tieto triedy už v sebe držia nejakú skutočnú hodnotu value, ktorej dátový typ zodpovedá triede. Teda ValueChar má premennú value dátového typu char, ValueInt má value typu int atď. Jej hodnota sa nastavuje v konštruktore. Ako príklad si zoberme konštruktor ValueInt. V prvom konštruktore sa hodnota value nastaví z parametru typu int. Zaujímavejší je ale druhý konštruktor ktorý má tvar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public ValueInt(Value x){&lt;br /&gt;
    this.value=parse(x);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tu sa konštruktoru predáva parameter typu Value. To môže byť teda ľubovoľný dátový typ. V metóde parse sa zistí o aký dátový typ ide a podľa toho sa vykoná príslušná metóda na konverziu na int. Rovnaký tvar a funkciu má aj metóda setValue(Value x), ktorá slúži na nastavenie hodnoty už existujúcej inštancii. Trieda Component v sebe drží pole vstupný a výstupných hodnôt in[] a out[] ako inštancie triedy Value, lebo sa nedá dopredu zistiť aké dátové typy im budú pridelené. Preto sa vykonáva v toDo() metóde konverzia z Value na príslušný dátový typ, napr. ValueInt ako to bolo ukázané v príklade tvorby simulačného algoritmu komponentu.&lt;br /&gt;
&lt;br /&gt;
===Interaktívne komponenty===&lt;br /&gt;
Dedením z triedy Component sme mohli síce vytvoriť simulačné komponenty, ktoré vykonávali nejakú funkciu, ale ťažko by sa dali označiť za interaktívne. Interaktívne komponenty dávajú užívateľovi možnosť priamo zasahovať do simulačného procesu a za behu simulácie teda môže ovplyvňovať hodnoty stláčaním rôznych tlačidiel, alebo menením hodnôt pomocou slideru. Tak isto za interaktívne komponent môžeme považovať aj rôzne displeje a zobrazenia grafov, ktoré sa dynamicky menia počas behu simulácie.&lt;br /&gt;
&lt;br /&gt;
Na tvorbu takéhoto druhu komponentov sa používa dedenie z abstraktnej metódy ComponentInteractive. Ten dedí priamo z triedy Component, takže má všetky vlastnosti bežných komponentov, ale navyše dokáže vytvoriť „plávajúce okná“ v ktorých môžu byť obsiahnuté rôzne riadiace a zobrazovacie prvky.  Jedná sa o samostatné okná, ktoré je možno ľubovoľne presúvať podľa potreby po celej pracovnej ploche. Sú aktívne a zobrazené napríklad aj po minimalizácii aplikácie DynaSim a ak je spustená simulácia, je stále možné s nimi upravovať hodnoty vstupujúce do simulačného procesu a tým meniť jeho výstupy. Ako také interaktívne komponenty v našom programe vypadajú môžeme vidieť na obr.16.&lt;br /&gt;
[[Súbor:Dynasim16.jpg|center|framed|Obr.16 Interaktívne komponenty programu DynaSim]] &lt;br /&gt;
Ako už bolo povedané, ComponentInteractive je abstraktná trieda. Obsahuje 4 metódy a jednu zahniezdenú abstraktnú triedu View. Triedou View sa vytvárajú naše plávajúce komponenty. Metóda showComponent() sa volá v prípade, keď chceme náš plávajúci komponent zobraziť, hideComponent() sa volá ak ho chceme skryť, a deleteComponent() v prípade, že ho chceme úplne odstrániť. Posledná metóda je abstraktná a má meno createView. V nej sa vytvára inštancia triedy View. ComponentInteractive je teda navonok jednoduchá trieda.&lt;br /&gt;
 &lt;br /&gt;
Teraz sa pozrieme na triedu View, ktorá dedí z JFrame. Jej konštruktor má 2 parametre a to width a height a rozmery tohto JFrame sa nastavia pomocou týchto parametrov. V konštruktore sa vytvorí nový Container. Ten má v sebe 1 JLabel, čo je horná uchopiteľná modrá lišta a je v nej napísané meno komponentu, ktorému toto okno patrí (obr.16). Druhý komponent, ktorý sa do Containeru pridá je JPanel. Toto miesto je vyhradené pre samotné zobrazenie interaktívneho komponentu, čo môže byť obyčajné tlačítko, či slider, ale môže ísť aj o komplexnejšie zobrazenie ako displej, alebo obrazovka osciloskopu. Trieda View má ešte 2 privátne metódy na manipuláciu presunu plávajúceho okna s myšou.&lt;br /&gt;
&lt;br /&gt;
Teraz sa pozrime na ďalší príklad, tento krát na tvorbu Slideru. Po presunutí komponentu Slider z palety na editačnú plochu sa na nej vytvorí widget predstavujúci slider z grafiky načítanej z SVG súboru, ale mimo to aj plávajúci komponent, ktorým je možné meniť jednu z jeho vnútorných hodnôt (obr.16).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Slider extends ComponentInteractive{&lt;br /&gt;
&lt;br /&gt;
    public SliderView sliderView;&lt;br /&gt;
&lt;br /&gt;
    public class SliderView extends View{&lt;br /&gt;
        public JSlider slider;&lt;br /&gt;
        public boolean changed = false;&lt;br /&gt;
&lt;br /&gt;
        public SliderView(){&lt;br /&gt;
            super(150,50);&lt;br /&gt;
            slider=new JSlider(JSlider.HORIZONTAL,0,100,0);&lt;br /&gt;
            slider.setBounds(5,5,140,25);&lt;br /&gt;
            slider.addChangeListener((ChangeListener) new SliderListener());&lt;br /&gt;
            panel.add(slider);&lt;br /&gt;
            setVisible(true);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        class SliderListener implements ChangeListener{&lt;br /&gt;
            public void stateChanged(ChangeEvent e){&lt;br /&gt;
                changed = true;&lt;br /&gt;
                setIntProperty(&amp;quot;VALUE&amp;quot;, slider.getValue());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Táto časť kódu pokrýva len vytvorenie samotného plávajúceho slideru. Ako vidno v našej triede simulačného komponentu Slider, ktorý je detskou triedou triedy  ComponentInterractive v sebe vytvoril novú triedu SliderView, ktorá dedí z abstraktej triedy View. V ňom sa nastaví changeListener. Ten po akejkoľvek zmene polohy posuvníka na slidere zavolá setIntProperty metódu. Tá má na starosti úpravu príslušnej hodnoty v našom dátovom uzle typu MyNode a taktiež zmenu hodnoty v Property okne. Tento slider sa pridá na panel plávajúceho okna a nastaví sa ako viditeľný. Inštancia tejto triedy sa vytvára v metóde createView.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void createView(){&lt;br /&gt;
    view = sliderView = new SliderView();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Samozrejme v tejto triede, keďže dedí z triedy Component, musí byť aj metóda toDo().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void toDo(){&lt;br /&gt;
    ((ValueInt)out[0]).value = sliderView.slider.getValue();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tu je simulačný algoritmus opäť jednoduchý. Na prvý výstup out[0] sa pošle aktuálna hodnota zo slideru. K tomu sa pristupuje cez sliderView, čo je inštancia zahniezdenej triedy SliderView.&lt;br /&gt;
==Tvorba aplikácie==&lt;br /&gt;
Aj keď je program po skompilovaní funkčný, pre koncového užívateľa zrejme tento fakt nebude mať príliš veľkú hodnotu, pokiaľ program nebude jednoducho spustiteľný nejakým spúšťacím súborom. Vytvorenie stand-alone aplikácie na platforme NetBeans je veľmi jednoduché. V NetBeans IDE v okne Projects si nájdeme našu aplikáciu postavenú na platforme NetBeans. Klikneme na ňu pravým tlačítkom a vyberiem položku Build ZIP Distribution. Tu si však treba dať pozor, lebo naša aplikácia musí byť nastavená ako stand-alone aplikácia a nie ako kolekcia prídavných modulov. Aby sme si to overili, treba kliknúť na našu aplikáciu pravým tlačítkom v Projects okne a vybrať položku Properties. Tu si v menu na ľavej strane menom Categories vyberieme položku Application (obr.17). V tomto menu musí byť označená položka „Create Standalone Application“. V Branding name si vyberieme aké meno bude mať priečinok našej novej aplikácie a jej spúšťacie súbory. Application Title je meno NetBeans aplikácie, ktoré sa zobrazuje v IDE. V ľavom menu Categories si môžeme vybrať položku Splash Screen, kde sú možné všetky nastavenia okna, ktoré sa objaví počas spúšťania aplikácie. Nakoniec v poslednej položke v Categories je možné povoliť resp. zakázať určité akcie s oknami v rámci našej aplikácie, ako napríklad presúvanie okien, menenie ich veľkosti a podobne.&lt;br /&gt;
[[Súbor:Dynasim17.jpg|center|framed|Obr.17 Tvorba stand-alone aplikácie]] &lt;br /&gt;
Ak sme si teda overili, že vytvárame stand-alone aplikáciu a v Properties sme si nastavili všetky potrebné náležitosti, môžeme kliknúť na Build ZIP Distribution. Teraz je potrebné nájsť miesto na disku kde sa nachádza náš projekt. V ňom je adresár s názvom „dist“ a ten by mal obsahovať jeden .zip súbor s názvom, aký sme zadali v Properties v položke Branding name. Zip súbor treba rozbaliť a dostaneme priečinok s našou aplikáciu. V jej adresári menom „bin“ sa nachádza jeden .exe súbor a bash script. Exe súborom sa spúšťa aplikácia v operačnom systéme Windows. Bash scrip pre zmenu slúži ako spúšťací súbor v systéme Linux. Takto vytvorená aplikácia je spustiteľná v týchto dvoch systémoch bez nutnosti, aby na nich bol nainštalovaný NetBeans. Jediné, čo je pre ich spustenie potrebné je mať v týchto operačných systémoch nainštalované Java JRE, čiže aplikácia postavená na platforme NetBeans má rovnaké nároky na spustenie ako obyčajné Java aplikácie.&lt;br /&gt;
&lt;br /&gt;
Tu si ale treba uvedomiť, že po postavení tejto aplikácie sa náš modul menom DynaSim, v ktorom bola uložená knižnica komponentov, zmenil na .jar súbor. Naša trieda FolderSearcher, ktorá rieši prístup k týmto súborom sa do .jar súboru nedokáže dostať. To znamená, že treba knižnicu v ktorej sú uložené XML a SVG súbory skopírovať do našej novovytvorenej aplikácie. To isté platí aj o knižnici class súborov. V systéme Windows môžu byť tieto knižnice umiestené v ľubovoľnom mieste našej aplikácie, v systéme Linux ale musia byť umiestené v adresári „bin“, čiže na mieste, kde sa nachádza aj spúšťací bash script.&lt;br /&gt;
Ak sú splnené všetky tieto podmienky, aplikácia je teraz spustiteľná jedným zo spúšťacích súborov.&lt;br /&gt;
&lt;br /&gt;
=Záver=&lt;br /&gt;
V tejto práci je rozobratý spôsob tvorby frameworku pre interaktívny simulačný program. Program obsahuje knižnicu niekoľkých základných simulačných komponentov, ktoré môžeme preniesť z palety na plochu editora a tie je možné vzájomne prepájať medzi sebou spojovacími čiarami. Tým docielime vzniku simulačnej schémy, ktorej simuláciu môžeme spustiť, resp. zastaviť pomocou príslušných tlačítok na toolbare. Boli implementované aj základné interaktívne komponenty, ktoré dávajú užívateľovi možnosť priamo zasahovať do procesu simulácie. Aj keď boli splnené všetky časti zadania tejto práce, len ťažko by sa dal program DynaSim považovať za finálny produkt. Tento fakt však vyplýva z jeho samotnej podstaty, lebo sa jedná o software, ktorý sa dá neustále vylepšovať a upravovať. &lt;br /&gt;
Globálny simulačný algoritmus tohto programu je v súčasnej verzii veľmi jednoduchý a použiteľný len pre komponenty, ktoré sú schopné vypočítať svoju funkciu v jednom kroku, bez zásahov do iných komponentov v schéme počas doby výpočtu. Preto simulačné komponenty ako integrátor nie je zatiaľ možné začleniť do knižnice komponentov. Ďalším problémom je nemožnosť vytvoriť uzol priamo na spojovacej čiare, z ktorého by mohla viesť ďalšia spojovacia čiara. Tým by bolo možné jeden výstup z komponentu viesť priamo na vstup viacerých komponentov. Taktiež by bolo vhodné rozšíriť základnú sadu komponentov. Ďalšou z možných úprav by mohla byť zmena popisu funkcie komponentov z Java .class súborov na Jython súbory. Tie sa môžu kompilovať na bytecode v prípade potreby za behu programu. Tým by užívateľ, ktorý vytvára nové komponenty, nemusel kompilovať celý program na to, aby vytvoril class súbory.&lt;br /&gt;
&lt;br /&gt;
=Zoznam použitej literatúry=&lt;br /&gt;
#	HEROUT, Pavel: Učebnice Jazyka Java. Kopp, České Budějovice, 2000, ISBN 80-7232-115-3&lt;br /&gt;
#	ECKEL, Bruce: Thinking in Java. Prentice HALL PTR, 1998, ISBN 0-13-659723-8&lt;br /&gt;
#	CADENHEAD, Rogers – LEMAY, Laura: Sams Teach Yourself Java 6 in 21 Days. Sams Publishing, Indianapolis, 2007, ISBN-13: 978-0-672-32943-2 &lt;br /&gt;
#	BÖCK, Heiko: The Definitive Guide to NetBeans™ Platform. Apress, 2009, ISBN-13: 978-1-4302-2418-1&lt;br /&gt;
#	NetBeans Visual Library Tutorial. Dostupné [2010.05.02]: &amp;lt;http://platform.netbeans.org/tutorials/nbm-visual_library.html&amp;gt;&lt;br /&gt;
#	SVG - Scalable Vector Graphic.  Dostupné: &amp;lt;http://www.xul.fr/en-xml-svg.html&amp;gt;&lt;br /&gt;
#	Scalable Vector Graphics (SVG) 1.1 Specification - CSS Color Module Level 3. Dostupné [2010.05.02]: &amp;lt;http://www.w3.org/TR/css3-color/&amp;gt;&lt;br /&gt;
#	Scalable Vector Graphics (SVG) 1.1 Specification - Basic Shapes. Dostupné [2010.05.02]: &amp;lt;http://www.w3.org/TR/SVG/shapes.html&amp;gt;&lt;br /&gt;
#	Čo je NetBeans? Dostupné [2010.05.02]: &amp;lt;http://www.netbeans.org/index_sk.html&amp;gt;&lt;br /&gt;
#	JDOM. Dostupné [2010.05.02]: &amp;lt;http://www.jdom.org/&amp;gt;&lt;br /&gt;
#	NetBeans Visual Library in NetBeans Platform 6.0. Dostupné [2010.05.02]: &amp;lt;http://platform.netbeans.org/graph/&amp;gt;&lt;br /&gt;
#	NetBeans Platform Learning Trail. Dostupné [2010.05.02]: &amp;lt;http://netbeans.org/kb/trails/platform.html&amp;gt;&lt;br /&gt;
#	GTK+ Application in Netbeans 6.0. Dostupné [2010.05.02]: &amp;lt;http://wiki.netbeans.org/GtkApplicationInNetBeans&amp;gt;&lt;br /&gt;
#	NetBeans Nodes, Explorer Manager, and Component Palette Tutorial. Dostupné [2010.05.02]: &amp;lt;http://platform.netbeans.org/tutorials/nbm-nodesapi3.html&amp;gt;&lt;br /&gt;
#	NetBeans Nodes API Tutorial. Dostupné [2010.05.02]: &amp;lt;http://platform.netbeans.org/tutorials/nbm-nodesapi2.html&amp;gt;&lt;br /&gt;
#	NetBeans Property Editor Tutorial. Dostupné [2010.05.02]: &amp;lt;http://platform.netbeans.org/tutorials/nbm-property-editors.html&amp;gt;&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim17.jpg&amp;diff=4382</id>
		<title>Súbor:Dynasim17.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim17.jpg&amp;diff=4382"/>
		<updated>2010-05-18T21:06:42Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Tvorba stand-alone aplikácie postavenej na platforme NetBeans&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tvorba stand-alone aplikácie postavenej na platforme NetBeans&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim16.jpg&amp;diff=4381</id>
		<title>Súbor:Dynasim16.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim16.jpg&amp;diff=4381"/>
		<updated>2010-05-18T21:00:55Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Interaktívne komponenty programu DynaSim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Interaktívne komponenty programu DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim15.jpg&amp;diff=4380</id>
		<title>Súbor:Dynasim15.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim15.jpg&amp;diff=4380"/>
		<updated>2010-05-18T20:46:17Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Globálny simulačný algoritmus programu DynaSim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Globálny simulačný algoritmus programu DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Okn%C3%A1_a_toolbary_programu_DynaSim&amp;diff=3791</id>
		<title>Okná a toolbary programu DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Okn%C3%A1_a_toolbary_programu_DynaSim&amp;diff=3791"/>
		<updated>2010-04-20T21:15:58Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|4|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Okná a toolbary programu DynaSim=&lt;br /&gt;
==Paleta==&lt;br /&gt;
Paleta slúži ako knižnica komponentov, ktoré sa z nej dajú preniesť na editačnú plochu DynaSimu. Je aj súčasťou NetBeans IDE, kde napríklad Matisse GUI Builder ukladá AWT a Swing komponenty na paletu, a užívateľ ich potom môže pomocou drag&amp;amp;drop premiestniť na NetBeans editor. Aby sme mohli paletu v našom module používať, je potrebné pridať závislosť na Common Palette. Obsah palety je spravovaný PaletteController-om. PaletteController je prístupný DynaSimTopComponentu cez Lookup. Opäť si treba uvedomiť, že sa jedná o 2 okná, kde editačná plocha a paleta majú svoj vlastný TopComponent. PaletteController sa vytvára pomocou triedy PaletteFactory. Ako paleta môže vypadať je znázornené na nasledujúcom obrázku.&lt;br /&gt;
[[Súbor:Dynasim11.jpg|center|framed|Obr.11 Paleta komponentov v programe DynaSim]]&lt;br /&gt;
Pre tvorbu palety je možné zvoliť jeden z dvoch prístupov. Prvý spôsob je vytvoriť pre každý komponent .xml súbor, v ktorom je zapísané meno a popis komponentu. Takto vytvorené .xml súbory je potom potrebné zaregistrovať v layer.xml súbore DynaSim modulu. Druhý spôsob, ktorý som si ja pre tvorbu palety zvolil, je vytvoriť hierarchiu uzlov a z nej následne vygenerovať paletu. Je potrebné si uvedomiť, že takto vytvorená hierarchia uzlov sa skladá z troch vrstiev. Prvá vrstva predstavuje root uzol, ktorý predáme metóde createPallete() na vytvorenie jej komponentov. Druhá vrstva pozostáva z detských uzlov root uzla a definuje kategórie palety. Posledná vrstva definuje jednotlivé komponenty v kategóriách. Triedy pre tieto komponenty v programe DynaSim nesú meno Shape (tvar), preto aj na obr.12 sú označené ako Shape.&lt;br /&gt;
[[Súbor:Dynasim12.jpg|center|framed|Obr.12 Hierarchia uzlov palety]]&lt;br /&gt;
Všetky triedy pre vytvorenie palety a jej hierarchie uzlov sa nachádzajú v balíčku sk.tnuni.dynasim.palette. Trieda Category slúži len ako kontajner, ktorý v sebe drží dáta. Pri kategóriách nám postačuje, že poznáme ich meno, preto táto trieda obsahuje len getter a setter na nastavenie mena danej kategórie. Trieda CategoryChildren je už zaujímavejšia. Jej deklarácia je nasledovná:&lt;br /&gt;
 public class '''CategoryChildren''' extends Children.Keys&lt;br /&gt;
Trieda Children vytvára a manažuje detské uzly a správa sa ako ich kontajner. Tu je táto trieda použitá ako manažér kategórií, ktoré sa zobrazujú na palete. Kategórie palety slúžia na rozdelenie jednotlivých komponentov do skupín (kategórií). Akým spôsobom budú komponenty rozdelené, už zostáva na užívateľovi. Children.Keys obsahuje metódu na tvorbu uzlov createNodes(). Na triedu CategoryChildren sa môžeme pozerať ako na root uzol, lebo v sebe jedna jej inštancia bude obsahovať všetky existujúce kategórie.&lt;br /&gt;
&lt;br /&gt;
Trieda CategoryNode je potomkom triedy AbstractNode a jej konštruktor dostane ako parameter inštanciu triedy Category, ktorá je následne predaná triede ShapeChildren, čím sa dostávame do ďalšej vrstvy hierarchie.&lt;br /&gt;
&lt;br /&gt;
Trieda Shape je trieda, ktorá je ekvivalent triedy Category, ale na rozdiel od Category v sebe drží dáta pre jednotlivé komponenty a to je number – poradové číslo, v súčasnej verzii nepoužívané, category – meno kategórie do ktorej tento komponent patrí, title - meno komponentu získané z XML súboru, image – cesta k súboru s ikonou, ktorá sa zobrazí na palete vedľa mena komponentu, name – meno XML súboru bez prípony, description – tooltip pre daný komponent.&lt;br /&gt;
&lt;br /&gt;
Trieda ShapeChildren je ekvivalnetom CategoryChildren, na rozdiel od CategoryChildren v sebe drží všetky uzly typu Shape danej kategórie.&lt;br /&gt;
Nakoniec trieda ShapeNode je zodpovedná za zobrazovanie jednotlivých komponentov v palete. Keďže samotné uzly komponentov už nemajú ďalšie detské uzly, supertriede predáme prázdny kontajner detských uzlov Children.LEAF. Cez metódy setDisplayName a setIconWithExtention a ďalšie podobné metódy nastavíme komponentu ako sa má v palete zobrazovať, t.j aké má mať na palete komponent meno, akú bude mať ikonu, tooltip atď. Tieto parametre sú uložené v triede Shape. Tie sa do nej dostanú za pomoci triedy BrowseFolders.&lt;br /&gt;
&lt;br /&gt;
BrowseFolders je jednoduchá trieda, ktorá prechádza priečinkami na zvolenej ceste. V rámci projektu DynaSim sa nachádza priečinok s názvom library. Ak sa pozrieme na obr.12, ''library'' sa nachádza na úrovni root. Library má svoje podpriečinky, tých môže byť ľubovoľné množstvo a môžu mať ľubovoľné pomenovanie. Tieto podpriečinky predstavujú jednotlivé kategórie a platí rovnica: meno podpriečinku = meno kategórie. Nakoniec sa prehľadá obsah týchto podpriečinkov. Ak obsahujú SVG súbory, začne sa hľadať či existuje XML súbor s rovnakým názvom. Ak áno, začne sa s ich parsovaním a z ich root elementov sa získa hodnota atribútu ''name''. Tým sa získa meno komponentu. Ďalej sa hľadá, či existuje PNG alebo GIF súbor s rovnakým menom ako parsovaný XML súbor. V prípade že existuje, použije sa ako ikona komponentu v palete. Uloží sa aj meno súboru bez prípon a z XML súboru sa získa popis pre tooltip. Trieda BrowsFolders toto všetko v konštruktore vykoná pri jej vytvorení na zadanej ceste. Tá musí byť presne určená a ukazovať na miesto s adresárom library. Na nájdenie tohto priečinku sa použije FolderSearcher, vysvetlený v kap. 3.1. Tieto získané hodnoty sa zapíšu do dvojrozmerného poľa typu String menom itemList a cez ten sa potom pristupuje k jednotlivým položkám pri nastavovaní členských premenných inštancie Shape. Prvý rozmer poľa ''itemList'' určuje poradové číslo SVG súboru z ktorého je daný komponent. Druhý rozmer má uložené hodnoty v takomto poradí: 0 – poradové čislo, 1 – názov kategórie, 2 – názov SVG súboru bez prípony, 3 – cesta k ikone komponentu, 4 – meno komponentu z XML, 5 – tooltip z XML súboru. BrowseFolders obsahuje aj statickú premennú ''folderList''. Je to jednorozmerné pole Stringov a obsahuje zoznam adresárov v ''library''.&lt;br /&gt;
&lt;br /&gt;
Doteraz bola vysvetlená len hierarchia uzlov palety a spôsob akým získavajú potrebné dáta. Teraz treba vysvetliť, ako sa vytvorí paleta samotná za pomoci týchto uzlov. Na tvorbu palety sa používa trieda PaletteController. Na tieto účely som si vytvoril triedu PaletteSupport, ktorá má na starosti manažovanie všetkých vlastností palety ako sú tvorba inštancie PaletteController, akcie paletz, či drag&amp;amp;drop. Trieda obsahuje metódu na vytvorenie palety createPallete. Jej funckia je nasledovná.&lt;br /&gt;
 public static PaletteController '''createPalette'''() {&lt;br /&gt;
     AbstractNode paletteRoot = new AbstractNode(new CategoryChildren());&lt;br /&gt;
     paletteRoot.setName(&amp;quot;Palette Root&amp;quot;);&lt;br /&gt;
     return PaletteFactory.createPalette( paletteRoot, new MyActions(), null, new MyDnDHandler() );&lt;br /&gt;
 }&lt;br /&gt;
Ako možno z kódu vidieť, najskôr sa vytvorí AbstractNode menom paletteRoot z nášho CategoryChildren, čo je trieda ktorá v sebe drží všetky kategórie palety. Tá si následne vytvorí jednotlivé CategoryNode a tie následne volajú ShapeChildren. Inými slovami vytvorením  paletteRoot sa nám automaticky vytvorí celá hierarchia uzlov potrebná na tvorbu palety. Funkcia potom vráti PaletteController, ktorý sa vytvorí cez PaletteFactory. Aby sme však pochopili, aká paleta sa vytvorí treba preskúmať premenné createPalette.&lt;br /&gt;
 public static PaletteController createPalette(Node node, PaletteActions pa, PaletteFilter pf, DragAndDropHandler dadh) throws IOException&lt;br /&gt;
Node predstavuje root uzol, pa sú akcie palety. Pre súčasné potreby palety nie sú potrebné žiadne špeciálne akcie a tak vygenerované metódy v triede MyActions() vracajú null. Filter pf má hodnotu null, pretože nechceme použiť žiadne filtrovanie komponentov palety. Nakoniec sa vytvorí nový DragAndDropHandler, ktorého detská trieda je zahniezdená priamo v PaletteSupport triede. Tá bude bližsie rozobraná v nasledujúcej podkapitole.&lt;br /&gt;
&lt;br /&gt;
Aby sme vytvorili paletu musíme vytvoriť inštanciu triedy PaletteController v DynaSimTopComponent cez PaletteSupport.createPalette(). To však nestačí na zobrazenie, pretože sa nachádzame v inom TopComponente. Paleta má vlastný TopComponent a aby medzi nimi vznikla určitá forma komunikácie a dokázali si medzi sebou predávať hodnoty, ju nutné vložiť kontrolér palety do Lookupu. Pridanie PaletteController s menom controler do Lookupu Topcomponentu je nasledovné:&lt;br /&gt;
 associateLookup(new AbstractLookup(content));&lt;br /&gt;
 content.add(controller);&lt;br /&gt;
InstanceContent content sa používa na zobrazovanie Properties okna a samotný kontrolér palety sa do neho pridáva ako položka. Podobne ako content aj controler sa prenáša medzi triedami ako premenná v ich konštruktore, z DynaSimTopComponent-u do DynaSimScene, z tej ďalej do Component_Widget. Tu sa musí v metóde notifyStateChanged opäť controller pridať do content, pretože po vytvorení nového Properties okna sa paleta zruší. Jej pridaním do content sa opäť vytvorí.&lt;br /&gt;
===Implementácia Drag&amp;amp;Drop funkcionality===&lt;br /&gt;
Drag&amp;amp;Drop z palety zabezpečuje trieda MyDnDHandler, ktorá je zahniezdená v PaletteSupport aj jej inštancia je vytvorená v konštruktore PaletteController-a. Táto trieda je detskou triedou triedy DragAndDropHandler. Preťažená je len 1 funkcia a to customize. Tá má na práci prenos dát určitého typu medzi paletou a TopComponentom, ktorý Drop z palety akceptuje. Keďže po dropnutí komponentu z palety na plochu editora chceme, aby sa na danom mieste vytvoril nový grafický komponent typu Component_Widget. Na jeho tvorbu ale potrebujeme najskôr inštanciu typu MyNode a z tej už dokážeme vytvoriť ďalej celú grafickú aj dátovú časť komponentu. Konštruktor pre MyNode má 4 premenné a na ich prenos z palety do inštancie DynaSimScene sa potrebujeme zamerať. Štvrtá premenná je lokácia bodu na ktorý sme položili komponent z palety na plochu editora takže nám stačí prenos troch premnných a to je: meno komponentu, kategória do ktorej patrí a meno SVG súboru bez prípony pre vykreslenie komponentu. Akým spôsobom sa teda tieto 3 hodnoty premenných prenesú z palety do DynaSimScene? Najskôr sa v metóde customize nájde uzol palety z lookup-u. Z neho cez rôzne metódy ako getDisplayName a pod. uložíme do poľa typu String meno, kategótiu a meno súboru. Potom do exTransferable typu ExTransferable, čo je premenná metódy customize uložíme pomocou metódy put toto pole Stringov. Tým sme si zabezpečili prenos týchto hodnôt z palety na iné miesto. Problém je, že miesto, na ktoré chceme tieto hodnoty preniesť musí byť na ne pripravené.&lt;br /&gt;
&lt;br /&gt;
Miesto kam chceme tieto hodnoty preniesť a na ktorom chceme vytvoriť komponenty je inštancia typu DynaSimScene. Ako už bolo viac krát spomínané, DynaSimScene je tiež widget a tým pádom mu je možné pridať rôzne akcie ako iným widgetom. Preto môžeme do jeho konštruktora napísať:&lt;br /&gt;
 getActions().addAction(ActionFactory.createAcceptAction(new AcceptProvider())&lt;br /&gt;
Tento riadok kódu nám zabezpečí, že DynaSimScene bude akceptovať veci dropnuté na jeho plochu, ale AcceptProvider má 2 metódy, ktoré sa automaticky vygenerujú a ich kód treba doplniť. Metóda isAcceptable vždy vracia ConnectorState.ACCEPT. To nám zabezpečí, že akýkoľvek komponent z palety dropnutý na editačnú plochu je akceptovaný editorom. Druhá metóda je oveľa dôležitejšia a jej deklarácia vypadá nasledovne:&lt;br /&gt;
 public void '''accept'''(Widget widget, Point point, Transferable transferable)&lt;br /&gt;
Z premennej point získame bod na ktorý chceme premiestniť komponent a v transferable je uložené pole Stringov, ktoré sme poslali z MyDnDHandler cez exTransferable premennú. K poľu Stringov sa dostaneme z transferable nasledovným spôsobom: String name[] = getNameFromTransferable(transferable);&lt;br /&gt;
&lt;br /&gt;
Tým pádom máme k dispozícii všetky premenné na vytvorenie inštancie typu MyNode. V tejto metóde accept sa vykonajú všetky úkony na tvorbu komponentu na DynaSimScene. Vytvorí sa nový widget cez addNode a cez addPin sa mu pridajú vo for-slučke všetky piny. Nakoniec kontrolér palety cez metódu clearSelection() odznačí označenú položku na palete.&lt;br /&gt;
==Tvorba vlastných okien – náhľad na schému==&lt;br /&gt;
PropertySheet a paleta sú okná, ktoré sú prebraté z NetBeans IDE a vývojár ich môže zavolať a použiť vo vlastnom programe. Platforma Netbeans nám však dáva možnosť vytvoriť si aj svoje vlastné okná úplne od základu.&lt;br /&gt;
&lt;br /&gt;
Na DynaSimScene je možné vytvoriť satelitný pohľad na túto scénu pomocou metódy createSatelliteView(). Problém však je, že ak takýmto spôsobom vytvoríme náhľad, stane sa neoddeliteľnou súčasťou  scény. To znamená, že nám na jednej zo strán scény bude zaberať určité miesto a užívateľ ho nebude môcť vypnúť. Treba však myslieť na to, že niektorí užívatelia nebudú v určitých situáciách potrebovať tento náhľad a uvítali by zväčšenie pracovnej plochy odstránením náhľadu zo scény. Jedným z riešení je vytvorenie samostatného okna v rámci aplikácie, podobné ako je práve Property okno alebo okno palety, kde by bol umiestený náhľad na scénu. Spôsobov ako takéto okno vytvoriť je viacero. Je možné priamo v module DynaSim vytvoriť nový Window Component a podstupovať podobne ako pri tvorbe DynaSimTopComponent (kap.2.1.1). Lepším riešením je však tvorba nového modulu, ktorý bude v sebe obsahovať TopComponent starajúci sa o zobrazovanie satelitného pohľadu scény. Tým, že vytvoríme nový modul, sa podstatne zvýši znovupoužiteľnosť tejto časti programu. Modul môžeme volať aj v iných aplikáciách postavených na platforme NetBeans cez závislosti modulov.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme teda nový modul v rámci našej aplikácie DynaSim Suite. V ľavej časti NetBeans IDE v okne Projects rozbalíme našu aplikáciu. Tu pravým tlačítkom myši klikneme na pložku Modules a vyberieme položku Add New... Otvorí sa wizard pre tvorbu modulu. V Project Name zadáme meno pre náš modul, v Project Location jeho umiestnenie na disku. Klikneme na next. Do Code Name Base zadáme meno hlavného balíčku (package), napr. sk.tnuni.satellite. Je dobré nechať si vygenrovať aj layer.xml. Po stlačení tlačidla Finish sa vytvorí nový modul. V balíčku, ktorý sme zadali sa vytvorí konfiguračný súbor Bundle.properties. Do tohto balíčku si teraz pridáme nový TopComponent. Pravým tlačidlom myši klikneme na balíček a vyberieme položku New... V nej si nájdeme Window Componet, ak sa tu však nenachádza treba ho nájsť v Other → Module Development → Window Componet. Po jeho vábere by sa malo zobraziť okno ako je na obr.13.&lt;br /&gt;
[[Súbor:Dynasim13.jpg|center|framed|Obr.13 Tvorba nového TopComponentu]]&lt;br /&gt;
Vo Windosws Position si vyberieme v ktorej časti aplikácie sa má naše okno zobrazovať. Pre satelitný pohľad som si zvolil ľavú časť aplikácie, t.j. tá, kde sa napríklad v NetBeans IDE nachádza okno Projects. Ak chceme aby sa okno zobrazilo so spustením aplikácie, treba zašktrtnúť Open on Application Start. Po stlačení next prejdeme do ďalšej časti wizarda. Tu stačí zvoliť Class Name Prefix. To je predpona, ktorú budú mať všetky súbory TopComponentu. Ak teda zvolíme ako predponu SatelliteView, wizard vygeneruje niekoľko súborov s menom začínajúcim sa touto predponou,  napríklad SatelliteViewTopComponent.java a ďalšie.&lt;br /&gt;
&lt;br /&gt;
Máme vytvorený modul, ktorý sa stará o zobrazovanie okna na pozícii explorer. Teraz treba oknu dodať funkcionalitu. Požadujeme, aby naše okno zobrazovalo satelitný pohľad na scénu DynaSimTopComponent. Na to stačí do triedy SatelliteViewTopComponent doplniť jednu metódu ako je znázornená na nasledujúcich riadokoch:&lt;br /&gt;
 public void installSatteliteView(Scene scene) {&lt;br /&gt;
     if(this.scene==scene) return;&lt;br /&gt;
     JComponent satview = scene.createSatelliteView();&lt;br /&gt;
         &lt;br /&gt;
     this.remove(satView);&lt;br /&gt;
     this.satView = null;&lt;br /&gt;
     add(satview, BorderLayout.CENTER);&lt;br /&gt;
     this.satView = satview;&lt;br /&gt;
     this.scene = scene;&lt;br /&gt;
 }&lt;br /&gt;
Ako vidno z kódu, jedná sa o veľmi jednoduchú metódu. Metóda je v tomto príklade zjednodušená na účely opisu jej princípu. Najskôr sa overí, či scéna ktorá volá túto metódu je tá istá, čo scéna zapísaná v tejto triede. Ak áno nič sa nestane, lebo satelitný pohľad už je funkčný. Ak je však volaná inou scénou (inou inštanciou Scene), vytvorí sa nový satelitný pohľad a odstráni sa starý, ktorý bol doteraz aktívny. Potom sa TopComponentu pridá novovytvorený satelitný pohľad. Aby táto metóda robila to, čo od nej očakávame, musí byť volaná z našej triedy DynaSimTopComponent. Ten je však umiestnený v inom module, preto musíme všetky packages v module pre satelitný pohľad spraviť public a následne modul pridať ako závislosť modulu DynaSim. Ako toho docieliť je popísane v kap. 1.5.&lt;br /&gt;
&lt;br /&gt;
Teraz už len stačí vyriešiť metódy v rámci modulu DynaSim. V DynaSimScene treba vytvoriť metódu, ktorá bude volať installSatelliteView z druhého modulu. Najskôr si vytvoríme v tejto metóde inštanciu SatelliteViewTopComponent cez metódu findInstance(). Potom z tejto inštancie zavoláme našu metódu na vytvorenie satelitného pohľadu. Metóda triedy DynaSimScene vypadá nasledovne:&lt;br /&gt;
 public void installSatView(){&lt;br /&gt;
     SatelliteViewTopComponent tc = SatelliteViewTopComponent.findInstance();&lt;br /&gt;
     tc.installSatteliteView(this);&lt;br /&gt;
 }&lt;br /&gt;
Túto metódu ešte treba volať v TopComponente DynaSimu v jeho metóde componentActivated(), aby sa zavolala vždy keď sa aktivuje editačné okno DynaSimu.&lt;br /&gt;
==Pridávanie tlačidiel do toolbaru==&lt;br /&gt;
Aplikačné okno NetBeans platformy obsahuje oblasť pre toolbary. Do nej je možné pridávať vlastné toolbary a vlastné tlačidlá. Nasledujúci postup sa bude vzťahovať na tvorbu tlačidla v menu a toolbare, ktoré po jeho stlačení vytvorí nový projekt programu DynaSim. V podstate sa vytvorí nová inštancia DynaSimTopComponent s tým, že už existujúce inštancie DynaSimTopComponentov sa zachovajú. To znamená, že ak už má užívateľ spustený nejaký projekt na ktorom pracuje, stlačením tlačidla pre nový projekt sa vytvorí nová záložka na mieste pre projekty. Užívateľ kliknutím na záložky potom bude môcť prepínať medzi rozpracovanými projektmi.&lt;br /&gt;
Pridanie položky do menu a príslušného tlačidla na toolbar sa dá vykonať veľmi jednoducho, opäť pomocou wizarda prístupného v NetBeans IDE. V projects okne si nájdeme modul, ktorému chceme pridať tlačidlo. V našom prípade je to modul DynaSim. Klikneme naň pravým tlačidlom myši a vyberieme v New položku Action. Ak sa tam táto položka nenachádza nájdeme ju v Other → Module Development → Action. Otvorí sa okno wizarda. V prvom kroku si musíme vybrať, či má byť daná akcia tlačidla prístupná vždy, alebo len za určitých podmienok. Vyberieme si položku Always Enabled, lebo chceme, aby sme mohli nový projekt vytvárať kedykoľvek. Pokračujeme tlačítkom Next.&lt;br /&gt;
[[Súbor:Dynasim14.jpg|center|framed|Obr.14 Wizard pre tvorbu novej akcie]] &lt;br /&gt;
Ďalší krok vo wizardovi (obr.14) je určenie, či chceme pre našu akciu vytvoriť položku v hlavnom menu bare, tlačidlo na toolbare, alebo obidvoje. Prvá položka Category reprezentuje sémantické zgrupovanie akcií. Je možné si vybrať niektorú z už existujúcich alebo si vytvoriť vlastnú kategóriu. V položke Menu si vyberieme v ktorej kategórii v hlavnom menu sa má naša akcia zobraziť. Poradie voči ostatným akciám v danej kategórii sa určuje cez Position. HERE identifikuje lokáciu, kde sa naša akcia medzi ostatnými položkami zobrazí. Podobne je to aj s toolbar tlačítkom. Nakoniec si môžeme zvoliť klávesovú skratku, ktorou našu akciu zavoláme. Opäť klikneme na Next a v poslednej časti wizarda si vyberieme meno pre triedu v ktorej sa akcia tlačidla vykoná. V položke Display Name si určíme meno nášho tlačidla a nakoniec v Icon položke vyberieme ikonu pre naše tlačidlo. Ikony môžu byt formátu PNG alebo GIF. Každá akcia by mala mať k dispozícii 2 ikony. Jedna o rozmeroch 16x16 a ďalšia 24x24 pixelov. Menšia ikona by mala mať normálny názov, napríklad ''new.png''. Táto sa použije na vytvorenie menu položky v prípade, že sme ju v predošlej časti wizarda nechali vytvoriť. Väčšia ikona by sa mala volať rovnako ako menšia, ale na koniec mena jej treba pridať číslicu 24, teda ''new24.png''. Táto ikona sa použije na tvorbu toolbar tlačidla. Stlačením Finish sa nám vygeneruje nová trieda vo zvolenom balíčku. Do nej už stačí doplniť kód, ktorý sa má vykonať. V metóde actionPerformed vytvoríme nový DynaSimTopComponent a zavoláme jeho metódu open (). Týmto postupom sme vytvorili nové tlačítko v toolbare a príslušnú menu položku. Po kliknutí na ne sa vytvorí nový projekt programu DynaSim. Obdobným spôsobom fungujú aj ďalšie akcie ktoré sú volané z menu resp. z toolbar tlačidiel.&lt;br /&gt;
==Úprava toolbaru a menu baru pomocou layer.xml==&lt;br /&gt;
V predošlej kapitole bolo vysvetlené ako si vytvoriť vlastné položky v menu a nové tlačidlá v toolbaroch. Tým nie je problém vytvoriť si nové tlačidlá pre nový projekt, save, load a ďalšie akcie. Problém však je, že aplikácie postavené na platforme NetBeans dedia určité defaultné tlačítka, ktoré sú neaktívne. Vývojár ich môže samozrejme využiť, ale jednoduchše je vytvoriť si tlačítka vlastné. Preto chceme tieto neaktívne tlačítka odstrániť. To sa dá vykonať jednoducho editáciou konfiguračného súboru modulov layer.xml. V module DynaSim sa tento súbor nachádza v balíčku sk.tnuni.dynasim. Layer.xml je centrálny konfiguračný súbor, ktorý definuje prakticky všetko, čo modul pridáva do NetBeans platformy.&lt;br /&gt;
V Menu v položke File sa defaultne nachádza Save, Save As, Save All. Tieto sú pre nás neaktívne a chceme odstrániť ich akcie a aj ich položky v menu. Na to je nutné editovať layer.xml súbor. Na odstránenie akcií si nájdeme element folder, ktorý má atribút s menom Actions. V ňom je zobrazená hierarchia akcií pre jednotlivé kategórie. Položky, čo chceme odstrániť sa nachádzajú v kategórii File. Do nej treba doplniť 3 detské elementy s atribútom name ako to vidno na príklade.&lt;br /&gt;
 &amp;lt;folder name=&amp;quot;Actions&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;folder name=&amp;quot;File&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAllAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAsAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/folder&amp;gt;&lt;br /&gt;
 &amp;lt;/folder&amp;gt;&lt;br /&gt;
Tým sme odstránili akcie samotné. Teraz treba odstrániť ich menu položky podobným spôsobom.&lt;br /&gt;
 &amp;lt;folder name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;folder name=&amp;quot;File&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAllAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAsAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/folder&amp;gt;&lt;br /&gt;
 &amp;lt;/folder&amp;gt;&lt;br /&gt;
Nakoniec sa odstráni aj toolbar tlačítko pre SaveAll.&lt;br /&gt;
 &amp;lt;folder name=&amp;quot;Toolbars&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;folder name=&amp;quot;File&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;file name=&amp;quot;org-openide-actions-SaveAllAction.shadow_hidden&amp;quot;/&amp;gt;&lt;br /&gt;
     &amp;lt;/folder&amp;gt;&lt;br /&gt;
 &amp;lt;/folder&amp;gt;&lt;br /&gt;
K akciám sa v layer.xml pristupuje cez atribút name. Jeho hodnota musí byť zložená z balíčku v ktorom sa akcia nachádza. Miesto bodiek sa použijú pomlčky. Ďalej následuje meno akcie a za ním prípona shadow. Ak chceme akciu skryť použije sa shadow_hidden. Napríklad org-openide-actions-SaveAllAction.shadow_hidden znamená, že chceme akciu SaveAllAction z org.openide.actions skryť. Je možné skryť len tlačítko na toolbare s tým, že príslušné tlačítko v menu zostane viditeľné a naopak.&lt;br /&gt;
&lt;br /&gt;
Layer.xml však neslúži len na zobrazovanie a skrývanie menu a toolbar položiek. Predstavme si situáciu, kde máme už vytvorený toolbar, ale zistíme, že sa nám nepáči rozloženie jednotlivých tlačítiek. Jeden zo spôsobov je zmazať všetky triedy pre akcie tlačítiek a odstrániť ich z layer.xml a properties.bundle. Následne cez wizarda vytvoriť tlačítka nanovo a v Position im nastaviť novú pozíciu voči ostatným tlačítkam. Toto je však veľmi napraktický a časovo náročný spôsob, obzvlášť ak chceme meniť polohu väčšieho množstva tlačítiek. Našťastie tu je však oveľa jednoduchšie riešenie. Každé tlačítko má v layer.xml detský element ''attr'' s atribútom ''name'', ktorý má hodnotu ''position''. Druhý atribút je ''intvalue''. Jeho hodnota je nejaký integer. V závislosti na hodnote tohto čísla sa určí pozícia daného tlačítka voči ostatným tlačítkam. Čím je číslo menšie, tým sa tlačítko na toolbare umiestni viac vľavo, v prípade menu zase viac navrch. Tlačítko pre toolbar nejakej akcie má vlastnú int hodnotu a položka menu môže mať inú hodnotu. To znamená, že poloha tlačítka na toolbare a poloha položky v menu bare sú od seba nezávislé.&lt;br /&gt;
&lt;br /&gt;
Príklad použitia pozičného atribútu v layer.xml:&lt;br /&gt;
 &amp;lt;file name=&amp;quot;sk-tnuni-dynasim-ZoomDefaultAction.shadow&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;attr name=&amp;quot;position&amp;quot; intvalue=&amp;quot;255&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/file&amp;gt;&lt;br /&gt;
 &amp;lt;file name=&amp;quot;sk-tnuni-dynasim-InitGridsAction.shadow&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;attr name=&amp;quot;position&amp;quot; intvalue=&amp;quot;260&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/file&amp;gt;&lt;br /&gt;
Príklad je vyňatý z elementu pre Menu bar v jeho View menu. Tu môžeme vidieť, že akcia ZoomDefaultAction má menšiu hodnotu pozície ako InitGridsAction. To znamená, že sa v menu ZoomDefaultAction zobrazí nad InitGridsAction. Prepísaním týchto hodnôt v layer.xml súbore môžeme upraviť pozície jednotlivých položiek menu, či tlačidiel na toolbare voči sebe. Po vytvorení vlastnej akcie sa obvykle v layer.xml element attr na zmenu pozície nevytvorí. Vývojár ho musí doplniť sám a odporúča sa to, lebo ak tak neučiní, pri kompilácii dostane varovné hlásenia o chýbajúcich pozíciách pre jednotlivé položky menu a toolbaru.&lt;br /&gt;
&lt;br /&gt;
Na prvý pohľad sa môže layer.xml javiť veľmi zložito a mätúco, ale v skutočnosti je to silný nástroj NetBeans platformy, vďaka ktorému môžeme manažovať menu bar a tool bar samotnej platformy.&lt;br /&gt;
==Akcie pre uloženie a nahratie simulačných schém==&lt;br /&gt;
Kým akcie na vytvorenie nového pracovného okna DynaSimu, zoomovanie alebo vytvorenie mriežky na scéne sú relatívne jednoduché a zo zdrojového kódu ľahko pochopiteľné, akcie pre uloženie a nahratie schémy nie sú úplne triviálnou záležitosťou. To hlavne z dôvodu, že potrebujeme zistiť polohu a hodnoty všetkých widgetov na scéne, tie následne zapísať do nejakého súboru na disku. Pri nahrávaní scény budeme tento súbor parsovať a zo získaných hodnôt vybudujeme novú scénu, ktorá musí byť identická s tou, ktorá bola do súboru uložená.&lt;br /&gt;
&lt;br /&gt;
Schéma zo scény sa ukladá do XML súboru, aby však nedochádzalo k nechcenej zámene s XML súbormi pre simulačné komponenty, prípona save súborov je zmenená na .dsp (DynaSim Project). Štruktúrovanie samotného dokumentu je však zhodné s XML špecifikáciou. Na ukladanie a nahrávanie schémy je v programe niekoľko tried a metód v už existujúcich triedach. Triedy pre akcie samotné sú SaveAsXMLAction a LoadFromXMLAction. Tieto boli vytvorené cez wizarda na tvorbu akcií a ich metóda ActionPerformed iba nájde aktívny DynaSimTopComponent. Z neho sa podľa zvolenej akcie zavolá príslušná metóda na  uloženie scény saveAsXML alebo nahratie scény loadFromXML. DynaSimTopComponent tieto metódy priamo neobsluhuje, iba ich predá ďalej tým, že zavolá metódy DynaSimScene. Opäť sa podľa príslušnej akcie zavolá buď metóda saveWidgetsToXML alebo loadWidgetsFromXML. To sú metódy z triedy DynaSimScene. Teraz sa bližšie pozrieme na saveWidgetsToXML. Táto metóda najskôr vytvorí JFileChooser, čo je swing komponent, prevažne určený na ukladanie a nahrávanie súborov. Jeho dialógové okno sa nastaví ako .SAVE_DIALOG a vykonajú sa ďalšie potrebné natavenia ako napríklad povolenie pracovať len so súbormi (nie s priečinkami) a ktorý typ súborov má vytvárať a akceptovať. Potom sa zo súboru, ktorý užívateľ cez tento JFileChooser vytvorí inštancia triedy WidgetsXML, čo je posledná trieda potrebná pre implementáciu save a load funkcionality do programu. &lt;br /&gt;
&lt;br /&gt;
Aby sme mohli pokračovať vo vysvetlovaní metódy saveWidgetsToXML, je potrebné si najskôr objasniť čo vlastne trieda WidgetsXML robí. Konštruktor má takýto tvar:&lt;br /&gt;
 public WidgetsXML(File file) {&lt;br /&gt;
     this.file = file;&lt;br /&gt;
 }&lt;br /&gt;
Jediný parameter ktorý mu predávame je súbor file. Ten sa potom uloží medzi členské premenné. Skutočnú funkcionalitu inštancii tejto triedy dodávajú jej metódy. Ich krátke zhrnutie je nasledovné:&lt;br /&gt;
&lt;br /&gt;
'''public void prepareToSave()''' – Metóda do nášho súboru zapíše hlavičku XML a základnú prázdnu hierarchiu XML elementov pomocou PrintWriteru. Výsledný súbor sa uloží do členskej premennej Document document.&lt;br /&gt;
&lt;br /&gt;
'''public void prepareToLoad()''' – Načíta sa obsah súboru do Document document. Táto metóda sa volá pri loadovaní.&lt;br /&gt;
&lt;br /&gt;
'''public void addMyNode(MyNode node)''' – V elemente my-nodes sa vytvorí nový detský element MyNode. Vytvoria sa v ňom atribúty pre meno, kategóriu, bod, kde widget na scéne leží, jednotlivé hodnoty z property okna a ďalšie potrebné údaje o našom Component_widgete. Potom sa z našej premennej node do nich zapíšu hodnoty.&lt;br /&gt;
&lt;br /&gt;
'''public ArrayList&amp;lt;MyNode&amp;gt; getMyNodes()''' – Táto metóda sa volá počas loadovania a v Document document sa postupne parsuje obsah elementu my-nodes z XML súboru. Zo získaných údajov sa vytvorí nová inštancia MyNode a potom sa do nej zapíšu hodnoty vnútorných premnných. Nakoniec sa pridá do ArrayListu.&lt;br /&gt;
&lt;br /&gt;
'''public void setCounter(IdGenerator generator)''' – Metóda, ktorá uloží do elementu counter detský element s atribútom posledného vygenerovaného id čísla pre jednotlivé piny. Piny musia mať unikátne číslo, preto si musíme pamätať po loade, aké je posledné číslo pinu.&lt;br /&gt;
&lt;br /&gt;
'''public void getCounter(IdGenerator generator)''' – Metóda na zistenie vygenerovaného čísla posledného pinu. &lt;br /&gt;
public boolean save() – Táto metóda sa volá ako posledná pred uložením. Z Document document sa vytvorí nový XML súbor.&lt;br /&gt;
&lt;br /&gt;
Ďalšie metódy sú addMyPin, getMyPins, addMyEdge a getMyEdges. Tieto metódy sú ekvivalentom addMyNodes a getMyNodes pre piny a spojovacie čiary a fungujú na rovnakom princípe.&lt;br /&gt;
&lt;br /&gt;
Po ozrejmení si metód vo WidgetsXML sa môžeme vrátiť do metódy saveWidgetsToXML v triede DynaSimScene. Čo teda potrebujeme pre uloženie scény spraviť? Potrebujeme nájsť všetky Component_Widgety, všetky ich Pin_Widgety a všetky spojovacie čiary typu MyConnectionWidget. K ním treba nájsť ich dátové časti MyNode, MyPin, MyEdge. Tie cez príslušné metódy addMyNode, addMyPin, addMyEdge triedy WidgetsXML zapíšeme do XML. Najskôr si nájdeme zoznam všetkých Component_Widgetov. Ako už bolo na začiatku tejto práce spomenuté, widgety sa ukladajú na vrstvu ''mainLayer'' a spojovacie čiary na vrstvu ''connectionLayer''. Takže ak chceme získať zoznam všetkých Component_Widgetov na scéne stačí jeden riadok kódu:&lt;br /&gt;
 List&amp;lt;Widget&amp;gt; list = mainLayer.getChildren();&lt;br /&gt;
Potom už stačí len vo for-cykle prechádzať zoznam, z jednotlivých widgetov získať ich dátovú časť MyNode a pridať tento uzol cez wxml.addMyNode inštancii triedy WidgetsXML. Treba si uvedomiť, že väčšina Component_Widgetov má obvykle aj niekoľko pinov, čiže v ďalšom forcykle nájdeme všetky ich Pin_Widgety a ich dátovú časť MyPin zapíšeme do wxml cez metódu addMyPin.&lt;br /&gt;
Podobný postup volíme aj pri hľadaní spojovacích čiar. Spojovacie čiary sú detskými widgetami vrstvy connectionLayer a ich zoznam dostaneme cez connectionLayer.getChildren(). Cez addMyEdge sa v slučke pridajú MyEdge do wxml. Nakoniec sa zavolá z WidgetsXML metóda save(), ktorá vygeneruje zo získaných údajov náš XML súbor.&lt;br /&gt;
&lt;br /&gt;
Pri nahrávaní schémy z tohto súboru sa volá metóda loadWidgetsFromXML(). Tu sa tiež podobným spôsobom vytvorí JFileChooser, tento krát ale s OPEN_DIALOG. Po výbere load súboru užívateľom sa opäť vytvorí z tohto súboru inštancia triedy WidgetsXML menom wxml a zavolá sa jej metóda prepareToLoad. Z wxml získame ArrayList pre MyNode a postupne ich vo for-cykle vytvárame po jednom. Z nich sa vytvoria nové Component_Widget. Opäť nemôžeme zabudnúť ani na piny jednotlivých Component_Widgetov a treba do tohto for-cyklu dať ďalší, ktorý ich bude pridávať ako detské widgety Component_Widgetu. Pridávanie spojovacích čiar je tiež podobné, ale tu treba myslieť na to, ktorý pin s ktorým treba prepojiť. Každý MyPin má svoje unikátne číslo, uložené v premennej id. Každý MyEdge má 2 hodnoty - source a target. V nich je zapísaná hodnota id zdrojového a cieľového pinu. Tu teda vo for-cykle prechádzame MyEdge po jednej a každá MyEdge musí porovnávať tieto hodnoty source a target s id všetkých pinov na scéne. Ak sa nájdu zhodné id pinov s týmito hodnotami, vytvorí sa medzi nimi spojenie cez metódu addEdge.&lt;br /&gt;
&lt;br /&gt;
Po vytvorení všetkých Component_Widgetov a ich prepojení spojovacími čiarami podľa  XML súboru sa loading ukončí a scéna by mala zodpovedať scéne v dobe jej uloženia do súboru.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim14.jpg&amp;diff=3790</id>
		<title>Súbor:Dynasim14.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim14.jpg&amp;diff=3790"/>
		<updated>2010-04-20T20:40:37Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Wizard v NetBeans IDE pre tvorbu novej akcie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wizard v NetBeans IDE pre tvorbu novej akcie&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim13.jpg&amp;diff=3789</id>
		<title>Súbor:Dynasim13.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim13.jpg&amp;diff=3789"/>
		<updated>2010-04-20T20:29:23Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Tvorba nového TopComponentu na platforme NetBeans&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tvorba nového TopComponentu na platforme NetBeans&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Okn%C3%A1_a_toolbary_programu_DynaSim&amp;diff=3782</id>
		<title>Okná a toolbary programu DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Okn%C3%A1_a_toolbary_programu_DynaSim&amp;diff=3782"/>
		<updated>2010-04-18T22:17:04Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Vytvorená stránka „Kategória:Študentské práce Kategória:Diplomové práce Kategória:Informatika {{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček| Ing. Juraj Ďuďák| 2009/2…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|4|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Okná a toolbary programu DynaSim=&lt;br /&gt;
==Paleta==&lt;br /&gt;
Paleta slúži ako knižnica komponentov, ktoré sa z nej dajú preniesť na editačnú plochu DynaSimu. Je aj súčasťou NetBeans IDE, kde napríklad Matisse GUI Builder ukladá AWT a Swing komponenty na paletu, a užívateľ ich potom môže pomocou drag&amp;amp;drop premiestniť na NetBeans editor. Aby sme mohli paletu v našom module používať, je potrebné pridať závislosť na Common Palette. Obsah palety je spravovaný PaletteController-om. PaletteController je prístupný DynaSimTopComponentu cez Lookup. Opäť si treba uvedomiť, že sa jedná o 2 okná, kde editačná plocha a paleta majú svoj vlastný TopComponent. PaletteController sa vytvára pomocou triedy PaletteFactory. Ako paleta môže vypadať je znázornené na nasledujúcom obrázku.&lt;br /&gt;
[[Súbor:Dynasim11.jpg|center|framed|Obr.11 Paleta komponentov v programe DynaSim]]&lt;br /&gt;
Pre tvorbu palety je možné zvoliť jeden z dvoch prístupov. Prvý spôsob je vytvoriť pre každý komponent .xml súbor, v ktorom je zapísané meno a popis komponentu. Takto vytvorené .xml súbory je potom potrebné zaregistrovať v layer.xml súbore DynaSim modulu. Druhý spôsob, ktorý som si ja pre tvorbu palety zvolil, je vytvoriť hierarchiu uzlov a z nej následne vygenerovať paletu. Je potrebné si uvedomiť, že takto vytvorená hierarchia uzlov sa skladá z troch vrstiev. Prvá vrstva predstavuje root uzol, ktorý predáme metóde createPallete() na vytvorenie jej komponentov. Druhá vrstva pozostáva z detských uzlov root uzla a definuje kategórie palety. Posledná vrstva definuje jednotlivé komponenty v kategóriách. Triedy pre tieto komponenty v programe DynaSim nesú meno Shape (tvar), preto aj na obr.12 sú označené ako Shape.&lt;br /&gt;
[[Súbor:Dynasim12.jpg|center|framed|Obr.12 Hierarchia uzlov palety]]&lt;br /&gt;
Všetky triedy pre vytvorenie palety a jej hierarchie uzlov sa nachádzajú v balíčku sk.tnuni.dynasim.palette. Trieda Category slúži len ako kontajner, ktorý v sebe drží dáta. Pri kategóriách nám postačuje, že poznáme ich meno, preto táto trieda obsahuje len getter a setter na nastavenie mena danej kategórie. Trieda CategoryChildren je už zaujímavejšia. Jej deklarácia je nasledovná:&lt;br /&gt;
 public class '''CategoryChildren''' extends Children.Keys&lt;br /&gt;
Trieda Children vytvára a manažuje detské uzly a správa sa ako ich kontajner. Tu je táto trieda použitá ako manažér kategórií, ktoré sa zobrazujú na palete. Kategórie palety slúžia na rozdelenie jednotlivých komponentov do skupín (kategórií). Akým spôsobom budú komponenty rozdelené, už zostáva na užívateľovi. Children.Keys obsahuje metódu na tvorbu uzlov createNodes(). Na triedu CategoryChildren sa môžeme pozerať ako na root uzol, lebo v sebe jedna jej inštancia bude obsahovať všetky existujúce kategórie.&lt;br /&gt;
&lt;br /&gt;
Trieda CategoryNode je potomkom triedy AbstractNode a jej konštruktor dostane ako parameter inštanciu triedy Category, ktorá je následne predaná triede ShapeChildren, čím sa dostávame do ďalšej vrstvy hierarchie.&lt;br /&gt;
&lt;br /&gt;
Trieda Shape je trieda, ktorá je ekvivalent triedy Category, ale na rozdiel od Category v sebe drží dáta pre jednotlivé komponenty a to je number – poradové číslo, v súčasnej verzii nepoužívané, category – meno kategórie do ktorej tento komponent patrí, title - meno komponentu získané z XML súboru, image – cesta k súboru s ikonou, ktorá sa zobrazí na palete vedľa mena komponentu, name – meno XML súboru bez prípony, description – tooltip pre daný komponent.&lt;br /&gt;
&lt;br /&gt;
Trieda ShapeChildren je ekvivalnetom CategoryChildren, na rozdiel od CategoryChildren v sebe drží všetky uzly typu Shape danej kategórie.&lt;br /&gt;
Nakoniec trieda ShapeNode je zodpovedná za zobrazovanie jednotlivých komponentov v palete. Keďže samotné uzly komponentov už nemajú ďalšie detské uzly, supertriede predáme prázdny kontajner detských uzlov Children.LEAF. Cez metódy setDisplayName a setIconWithExtention a ďalšie podobné metódy nastavíme komponentu ako sa má v palete zobrazovať, t.j aké má mať na palete komponent meno, akú bude mať ikonu, tooltip atď. Tieto parametre sú uložené v triede Shape. Tie sa do nej dostanú za pomoci triedy BrowseFolders.&lt;br /&gt;
&lt;br /&gt;
BrowseFolders je jednoduchá trieda, ktorá prechádza priečinkami na zvolenej ceste. V rámci projektu DynaSim sa nachádza priečinok s názvom library. Ak sa pozrieme na obr.12, ''library'' sa nachádza na úrovni root. Library má svoje podpriečinky, tých môže byť ľubovoľné množstvo a môžu mať ľubovoľné pomenovanie. Tieto podpriečinky predstavujú jednotlivé kategórie a platí rovnica: meno podpriečinku = meno kategórie. Nakoniec sa prehľadá obsah týchto podpriečinkov. Ak obsahujú SVG súbory, začne sa hľadať či existuje XML súbor s rovnakým názvom. Ak áno, začne sa s ich parsovaním a z ich root elementov sa získa hodnota atribútu ''name''. Tým sa získa meno komponentu. Ďalej sa hľadá, či existuje PNG alebo GIF súbor s rovnakým menom ako parsovaný XML súbor. V prípade že existuje, použije sa ako ikona komponentu v palete. Uloží sa aj meno súboru bez prípon a z XML súboru sa získa popis pre tooltip. Trieda BrowsFolders toto všetko v konštruktore vykoná pri jej vytvorení na zadanej ceste. Tá musí byť presne určená a ukazovať na miesto s adresárom library. Na nájdenie tohto priečinku sa použije FolderSearcher, vysvetlený v kap. 3.1. Tieto získané hodnoty sa zapíšu do dvojrozmerného poľa typu String menom itemList a cez ten sa potom pristupuje k jednotlivým položkám pri nastavovaní členských premenných inštancie Shape. Prvý rozmer poľa ''itemList'' určuje poradové číslo SVG súboru z ktorého je daný komponent. Druhý rozmer má uložené hodnoty v takomto poradí: 0 – poradové čislo, 1 – názov kategórie, 2 – názov SVG súboru bez prípony, 3 – cesta k ikone komponentu, 4 – meno komponentu z XML, 5 – tooltip z XML súboru. BrowseFolders obsahuje aj statickú premennú ''folderList''. Je to jednorozmerné pole Stringov a obsahuje zoznam adresárov v ''library''.&lt;br /&gt;
&lt;br /&gt;
Doteraz bola vysvetlená len hierarchia uzlov palety a spôsob akým získavajú potrebné dáta. Teraz treba vysvetliť, ako sa vytvorí paleta samotná za pomoci týchto uzlov. Na tvorbu palety sa používa trieda PaletteController. Na tieto účely som si vytvoril triedu PaletteSupport, ktorá má na starosti manažovanie všetkých vlastností palety ako sú tvorba inštancie PaletteController, akcie paletz, či drag&amp;amp;drop. Trieda obsahuje metódu na vytvorenie palety createPallete. Jej funckia je nasledovná.&lt;br /&gt;
 public static PaletteController '''createPalette'''() {&lt;br /&gt;
     AbstractNode paletteRoot = new AbstractNode(new CategoryChildren());&lt;br /&gt;
     paletteRoot.setName(&amp;quot;Palette Root&amp;quot;);&lt;br /&gt;
     return PaletteFactory.createPalette( paletteRoot, new MyActions(), null, new MyDnDHandler() );&lt;br /&gt;
 }&lt;br /&gt;
Ako možno z kódu vidieť, najskôr sa vytvorí AbstractNode menom paletteRoot z nášho CategoryChildren, čo je trieda ktorá v sebe drží všetky kategórie palety. Tá si následne vytvorí jednotlivé CategoryNode a tie následne volajú ShapeChildren. Inými slovami vytvorením  paletteRoot sa nám automaticky vytvorí celá hierarchia uzlov potrebná na tvorbu palety. Funkcia potom vráti PaletteController, ktorý sa vytvorí cez PaletteFactory. Aby sme však pochopili, aká paleta sa vytvorí treba preskúmať premenné createPalette.&lt;br /&gt;
 public static PaletteController createPalette(Node node, PaletteActions pa, PaletteFilter pf, DragAndDropHandler dadh) throws IOException&lt;br /&gt;
Node predstavuje root uzol, pa sú akcie palety. Pre súčasné potreby palety nie sú potrebné žiadne špeciálne akcie a tak vygenerované metódy v triede MyActions() vracajú null. Filter pf má hodnotu null, pretože nechceme použiť žiadne filtrovanie komponentov palety. Nakoniec sa vytvorí nový DragAndDropHandler, ktorého detská trieda je zahniezdená priamo v PaletteSupport triede. Tá bude bližsie rozobraná v nasledujúcej podkapitole.&lt;br /&gt;
&lt;br /&gt;
Aby sme vytvorili paletu musíme vytvoriť inštanciu triedy PaletteController v DynaSimTopComponent cez PaletteSupport.createPalette(). To však nestačí na zobrazenie, pretože sa nachádzame v inom TopComponente. Paleta má vlastný TopComponent a aby medzi nimi vznikla určitá forma komunikácie a dokázali si medzi sebou predávať hodnoty, ju nutné vložiť kontrolér palety do Lookupu. Pridanie PaletteController s menom controler do Lookupu Topcomponentu je nasledovné:&lt;br /&gt;
 associateLookup(new AbstractLookup(content));&lt;br /&gt;
 content.add(controller);&lt;br /&gt;
InstanceContent content sa používa na zobrazovanie Properties okna a samotný kontrolér palety sa do neho pridáva ako položka. Podobne ako content aj controler sa prenáša medzi triedami ako premenná v ich konštruktore, z DynaSimTopComponent-u do DynaSimScene, z tej ďalej do Component_Widget. Tu sa musí v metóde notifyStateChanged opäť controller pridať do content, pretože po vytvorení nového Properties okna sa paleta zruší. Jej pridaním do content sa opäť vytvorí.&lt;br /&gt;
===Implementácia Drag&amp;amp;Drop funkcionality===&lt;br /&gt;
Drag&amp;amp;Drop z palety zabezpečuje trieda MyDnDHandler, ktorá je zahniezdená v PaletteSupport aj jej inštancia je vytvorená v konštruktore PaletteController-a. Táto trieda je detskou triedou triedy DragAndDropHandler. Preťažená je len 1 funkcia a to customize. Tá má na práci prenos dát určitého typu medzi paletou a TopComponentom, ktorý Drop z palety akceptuje. Keďže po dropnutí komponentu z palety na plochu editora chceme, aby sa na danom mieste vytvoril nový grafický komponent typu Component_Widget. Na jeho tvorbu ale potrebujeme najskôr inštanciu typu MyNode a z tej už dokážeme vytvoriť ďalej celú grafickú aj dátovú časť komponentu. Konštruktor pre MyNode má 4 premenné a na ich prenos z palety do inštancie DynaSimScene sa potrebujeme zamerať. Štvrtá premenná je lokácia bodu na ktorý sme položili komponent z palety na plochu editora takže nám stačí prenos troch premnných a to je: meno komponentu, kategória do ktorej patrí a meno SVG súboru bez prípony pre vykreslenie komponentu. Akým spôsobom sa teda tieto 3 hodnoty premenných prenesú z palety do DynaSimScene? Najskôr sa v metóde customize nájde uzol palety z lookup-u. Z neho cez rôzne metódy ako getDisplayName a pod. uložíme do poľa typu String meno, kategótiu a meno súboru. Potom do exTransferable typu ExTransferable, čo je premenná metódy customize uložíme pomocou metódy put toto pole Stringov. Tým sme si zabezpečili prenos týchto hodnôt z palety na iné miesto. Problém je, že miesto, na ktoré chceme tieto hodnoty preniesť musí byť na ne pripravené.&lt;br /&gt;
&lt;br /&gt;
Miesto kam chceme tieto hodnoty preniesť a na ktorom chceme vytvoriť komponenty je inštancia typu DynaSimScene. Ako už bolo viac krát spomínané, DynaSimScene je tiež widget a tým pádom mu je možné pridať rôzne akcie ako iným widgetom. Preto môžeme do jeho konštruktora napísať:&lt;br /&gt;
 getActions().addAction(ActionFactory.createAcceptAction(new AcceptProvider())&lt;br /&gt;
Tento riadok kódu nám zabezpečí, že DynaSimScene bude akceptovať veci dropnuté na jeho plochu, ale AcceptProvider má 2 metódy, ktoré sa automaticky vygenerujú a ich kód treba doplniť. Metóda isAcceptable vždy vracia ConnectorState.ACCEPT. To nám zabezpečí, že akýkoľvek komponent z palety dropnutý na editačnú plochu je akceptovaný editorom. Druhá metóda je oveľa dôležitejšia a jej deklarácia vypadá nasledovne:&lt;br /&gt;
 public void '''accept'''(Widget widget, Point point, Transferable transferable)&lt;br /&gt;
Z premennej point získame bod na ktorý chceme premiestniť komponent a v transferable je uložené pole Stringov, ktoré sme poslali z MyDnDHandler cez exTransferable premennú. K poľu Stringov sa dostaneme z transferable nasledovným spôsobom: String name[] = getNameFromTransferable(transferable);&lt;br /&gt;
&lt;br /&gt;
Tým pádom máme k dispozícii všetky premenné na vytvorenie inštancie typu MyNode. V tejto metóde accept sa vykonajú všetky úkony na tvorbu komponentu na DynaSimScene. Vytvorí sa nový widget cez addNode a cez addPin sa mu pridajú vo for-slučke všetky piny. Nakoniec kontrolér palety cez metódu clearSelection() odznačí označenú položku na palete.&lt;br /&gt;
==Tvorba vlastných okien==&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim12.jpg&amp;diff=3781</id>
		<title>Súbor:Dynasim12.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim12.jpg&amp;diff=3781"/>
		<updated>2010-04-18T22:06:52Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: bola nahraná nová verzia „Súbor:Dynasim12.jpg“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hierarchia uzlov palety programu DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim12.jpg&amp;diff=3780</id>
		<title>Súbor:Dynasim12.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim12.jpg&amp;diff=3780"/>
		<updated>2010-04-18T22:06:02Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Hierarchia uzlov palety programu DynaSim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hierarchia uzlov palety programu DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim11.jpg&amp;diff=3779</id>
		<title>Súbor:Dynasim11.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim11.jpg&amp;diff=3779"/>
		<updated>2010-04-18T22:04:22Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Paleta komponentov v programe DynaSim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Paleta komponentov v programe DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=D%C3%A1tov%C3%A1_%C4%8Das%C5%A5_simula%C4%8Dn%C3%BDch_komponentov&amp;diff=3778</id>
		<title>Dátová časť simulačných komponentov</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=D%C3%A1tov%C3%A1_%C4%8Das%C5%A5_simula%C4%8Dn%C3%BDch_komponentov&amp;diff=3778"/>
		<updated>2010-04-18T22:02:09Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Vytvorená stránka „Kategória:Študentské práce Kategória:Diplomové práce Kategória:Informatika {{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček| Ing. Juraj Ďuďák| 2009/2…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|3|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Dátová časť simulačných komponentov=&lt;br /&gt;
Widgety v sebe uchovávajú len grafickú časť komponentu. Druhý problém je, že na scéne môže byť len jeden widget z každého druhu, čiže by na scéne mohol byť len jeden Integer, len jeden Slider atď. Aby sme tento problém odstránili, je potrebné každý widget zviazať s inštanciou triedy, ktorá v sebe uchováva dáta. Dáta jednotlivých komponentov môžu predstavovať napríklad meno, kategóriu, cestu k SVG a XML súboru, vnútorné stavy a ďalšie potrebné údaje.&lt;br /&gt;
&lt;br /&gt;
==MyNode==&lt;br /&gt;
Táto trieda predstavuje v DynaSimScene uzol samotný a SVG_Widget je len jeho grafickou reprezentáciou. Trieda samotná je na vrchole hierarchie, dedí len z triedy Object. Konštruktor je nasledovný:&lt;br /&gt;
 public '''MyNode'''(String title, String category, String name, Point location)&lt;br /&gt;
Parameter title je názov komponentu, ten sa získava z XML dokumentu, category je meno kategórie do ktorej komponent patrí. XML dokument sa parsuje v konštruktore MyNode, ale aby sme získali jeho meno, potrebujeme XML parsovať ešte predtým. To sa vykonáva v triede BrowseFolders pri tvorbe palety. Meno kategórie je vlastne meno adresára v ktorom je uložený SVG a XML súbor daného komponentu. Name je názov SVG/XML súboru bez prípony a location je miesto, na ktoré sa widget prilepí na scénu.&lt;br /&gt;
V konštruktore sa inicializujú niektoré premenné z parametrov a zavolá sa metóda readXML(), pomocou ktorej sa rozparsuje XML súbor, ktorého cesta sa poskladá z mena kategórie a mena súboru, ktoré sme získali z parametrov. &lt;br /&gt;
Miesto kde sa nachádza knižnica samotná sa získa z metódy getLibraryFolder() inštancie triedy FolderSearcher. FolderSearcher je trieda, ktorá slúži na hľadanie cesty ku knižnici s XML súbormi pre DynaSim. Táto knižnica má názov ''“library“'' a nachádza sa v projekte DynaSimu. FolderSearcher teda začne hľadať v projekte a postupuje hlbšie v adresároch kým nenájde adresár s názvom ''“library“''. Absolútnu cestu k tomuto adresáru si uloží medzi členské premenné a dostať sa k tejto ceste je možné cez metódu getLibraryFolder(). Tvar v akom cestu k adresáru vráti je závislý od operačného systému.&lt;br /&gt;
&lt;br /&gt;
===Štruktúra XML súboru simulačného komponentu===&lt;br /&gt;
Zápis XML súboru komponentu môže vypadať nasledovne:&lt;br /&gt;
 [[Súbor:DynasimXML.jpg]]&lt;br /&gt;
Dáta získané z parsovania takéhoto XML súboru v triede MyNode nám po označení komponentu na scéne vygenerujú PropertySheet, ako môžeme vidieť na obr.10. Ako vidno z časti kódu, root element má názov component a má len jeden atribút s názvom name. Podľa tohto atribútu sa vygeneruje meno pre daný komponent s priradeným poradovým číslom. XML súbor nie je kontrolovaný podľa DTD súboru. Priame detské elementy root elementu sú input, output, properties, desctiptionm, jython. XML môže mať ľubovoľný počet elementov s menom input a output. Input predstavuje vstupný pin, output výstupný. Ich atribúty x a y určujú polohu pinu v rámci komponentu. Je vhodné zvoliť ich tak, aby neboli mimo hraníc komponentu, ktoré sú určené v root elemente SVG súboru. Element name je meno terminálu, môže byť ľubovoľné a type určuje, aký dátový typ daný terminál v sebe drží.&lt;br /&gt;
&lt;br /&gt;
Element properties by mal byť v XML súbore len jeden, ten však môže obsahovať ľubovoľný počet elementov s menom property. Property predstavuje jednu vnútornú premennú, tá je definovaná piatimi elementmi ako vidieť v ukážkovom kóde. Detský element type určuje akého dátového typu je daná premenná. V súčasnosti sú implementované tieto typy: BOOL – ktorý predstavuje boolean hodnotu, INT – hodnotu typu int, FLOAT – float, STRING – String.&lt;br /&gt;
&lt;br /&gt;
Element Description má 3 detské elementy, slúži na opis komponentu. Na obr.10 môžeme vidieť, ako sa textové hodnoty týchto elementov prejavia na Property Sheete. &lt;br /&gt;
&lt;br /&gt;
===MyEdge a MyPin===&lt;br /&gt;
MyEdge a MyPin predstavujú dátovú vrstu pre spojovaciu čiaru a pin. Každému pinu sa pridelí po jeho vytvorení cez generátor unikátne číslo a to sa zapíše do členskej premennej MyPin s názvom id ako String. Každý MyPin má getter a setter pre premennú typu Point. Hodnota tohto bodu sa získava z XML súboru a používa sa na prilepenie pinu na zvolené miesto v rámci komponentu. MyPin ešte obsahuje premennú typu boolean s názvom isInput. Tá určuje či je pin vstup alebo výstup. Táto informácia as taktiež získa z XML súboru a ak je element typu input, isInput má hodnotu true, ak je element typu output, isInput má hodnotu false.&lt;br /&gt;
&lt;br /&gt;
MyEdge je tiež tvorené len gettermi a settermi. Má 2 premenné typu String s menom ''source'' a ''target''. Tie predstavujú id pinov, ktoré sú spojené touto čiarou.&lt;br /&gt;
&lt;br /&gt;
==Tvorba Properties okna pomocou MyPropertyNode==&lt;br /&gt;
Na editačnú plochu simulátora si užívateľ pridáva simulačné komponenty z palety. Po kliknutí myšou na niektorý z takto pridaných komponentov vyžadujeme, aby sa vygenerovalo okno s hodnotami komponentu, ktoré môže užívateľ upravovať. MyPropertyNode má na starosti vytvorenie Properties okna z údajov obsiahnutých inštanciou MyNode. Príklad takéhoto okna je možno vidieť na nasledovnom obrázku:&lt;br /&gt;
[[Súbor:Dynasim10.jpg|center|framed|Obr.10 Príklad Properies okna]]&lt;br /&gt;
Aby sa takéto okno po označení nejakého komponentu vygenerovalo, musí byť splnených niekoľko nutných podmienok. V prvom rade sa musí vyriešiť medzimodulová komunikácia. Kým sa modul DynaSim stará o editačnú plochu, ktorá je v okne ''editor'', nachádzajúca sa v centrálnej časti programového interface, okno Properties sa nachádza v okne properties, ktoré sa štandardne nachádza v pravej dolnej časti programu a je riadené modulom Nodes API. Ten treba pridať ako závislosť na modul DynaSim. Tým sa však ešte komunikácia medzi modulmi nevyriešila, lebo okno properties stále nebude vedieť, či je vôbec niečo v okne editora označené. Na to existuje trieda Lookup. Za normálnych okolností môže mať jeden TopComponent len jeden Lookup, avšak DynaSimTopComponent potrebuje dva, jeden pre Property okno a druhý nesôkôr pre paletu. To sa dá obísť cez vytvorenie InstanceContent:&lt;br /&gt;
 private InstanceContent content = new InstanceContent();&lt;br /&gt;
V konštruktore DynaSimTopComponentu potom vytvoríme abstraktný lookup a pridáme ho Topcomponentu nasledovne:&lt;br /&gt;
 associateLookup(new AbstractLookup(content));&lt;br /&gt;
InstanceContent content sa potom prenáša medzi triedami ako premenná v ich konštruktore, z DynaSimTopComponent-u do DynaSimScene, z tej ďalej do Component_Widget – po pridaní simulačného komponentu na plochu editora.&lt;br /&gt;
Component_Widget má zdedenú metódu z triedy Widget s názvom notifyStateChanged, ktorá sleduje zmenu stavu widgetu. Nasledovná časť kódu je z tejto metódy a rieši, čo sa stane po kliknutí na komponent na editačnej ploche.&lt;br /&gt;
 if(newState.isSelected()){&lt;br /&gt;
             propNode = new MyPropertyNode(this.getNode());&lt;br /&gt;
             content.set(Collections.singleton(propNode), null);&lt;br /&gt;
             content.add(controller);&lt;br /&gt;
 } else {&lt;br /&gt;
             if(propNode!=null)&lt;br /&gt;
                 try {&lt;br /&gt;
                 propNode.destroy();&lt;br /&gt;
             } catch (IOException ex) {&lt;br /&gt;
                 Exceptions.printStackTrace(ex);&lt;br /&gt;
             }&lt;br /&gt;
Ak je komponent označený vytvorí sa nová inštancia MyPropertyNode, kde sa za parameter dosadí MyNode inštancia zviazaná s týmto komponentom. V ďalšom riadku sa novovytvorená inštancia uloží do content. A tým sme vlastne dosiahli, že sa nám po kliknutí na simulačný komponent vytvorí propertySheet. Problém je, že sa nám potom stratí paleta, preto treba znova pridať cez content.add kontrolér palety. Slučka else rieši, čo sa stane, keď sa objekt odznačí, napr. Kliknutím na editačnú plochu. Metóda propNode.destroy() zruší túto MyPropertyNode a tým sa Properties okno vynuluje.&lt;br /&gt;
Aby toto všetko mohlo fungovať aj trieda MyPropertyNode musí spĺňať jednu podmienku a to, že musí byť rozšírením AbstractNode triedy. Jej deklarácia je nasledovná:&lt;br /&gt;
 public class MyPropertyNode extends AbstractNode implements PropertyChangeListener&lt;br /&gt;
Konštruktor:&lt;br /&gt;
 public MyPropertyNode(MyNode node) {&lt;br /&gt;
         super(Children.LEAF);&lt;br /&gt;
         this.node = node;    &lt;br /&gt;
 }&lt;br /&gt;
AbstractNode má v konštruktore parameter pre inštanciu triedy Children, pretože sa obvykle používa pri stromových štruktúrach uzlov. V našom prípade však máme len samostatné uzly typu MyNode a nemajú ďalšie detské uzly, preto sa použije LEAF ako koncový uzol. MyPropertyNode má metódu createSheet(), ktorú zdedila z AbstractNode. Táto metóda slúži na vytvorenie Property okna typu Sheet a jeho naplnenie položkami a ich príslušnými hodnotami. Na začiatku sa vytvorí nová inštancia triedy Sheet. Vytvorením inštancie Sheet.Set sa vytvorí nový blok v Properties okne a cez set príkazy mu je možné prideliť meno a popis. Jednotlivé hodnoty položiek, ktoré sa majú v takomto bloku zobrazovať sa nachádzajú v inštancii triedy MyNode. Ako tieto hodnoty zobraziť v Properties okne sa dá jednoducho ukázať na nasledovnom príklade:&lt;br /&gt;
 Property categoryProp = new PropertySupport.Reflection (node, String.class, &amp;quot;getCategory&amp;quot;, null);&lt;br /&gt;
Konštruktor triedy Reflection je nasledovný:&lt;br /&gt;
 Reflection (Object o, Class type, String method1, String method2);&lt;br /&gt;
Object o predstavuje triedu z ktorej chceme danú hodnotu získať resp. nastaviť cez Properties okno. Class type je typ premennej s ktorou chceme pracovať, to môže byť int.class, String.class a pod. String method1 predstavuje názov getteru pre túto premennú a method2 názov setteru v s Stringu. Ak má method2 hodnotu null nie je možné meniť jeho hodnotu pomocou Properties okna. Z toho vyplýva, že v predošlom príklade chceme z inštancie node typu MyNode získať premennú dátového typu String. Názov getteru je getCathegory() a nie je možné meniť túto hodnotu cez setter v Properties okne.&lt;br /&gt;
&lt;br /&gt;
Gettery a settery sa logicky musia nachádzať v triede MyNode. Každá premenná ktorú chceme zobraziť v Properties okne musí mať minimálne svoj getter a v prípade, že ju chceme v okne aj editovať musí mať aj setter. Štandardne má každý komponent 5 základných hodnôt, ktoré ho opisujú a to je Name, Category, Type, Function, Description (obr.10). Name je jediná meniteľná položka, ostatné sú nemenné Category je meno adresára v ktorom je uložený XML súbor a ostatné položky sa získajú parsovaním tohto XML dokumentu. &lt;br /&gt;
&lt;br /&gt;
Mimo týchto základných položiek môže mať komponent aj ďalšie. Tie opisujú hodnoty jeho vnútorných stavov. Každý komponent by mal mať ľubovoľné množstvo vnútorných hodnôt, ľubovoľného dátového typu. Tu však nastáva vážny problém! Každá z týchto  hodnôt musí mať svoj vlastný getter a setter, a keďže Java nedokáže za chodu programu do triedy dopisovať metódy musia sa do triedy napísať pred kompilácoiu. Inými slovami, ak očakávame, že žiadny komponent nebude mať viac ako 6 vnútorných hodnôt musíme vytvoriť 6 getterov a 6 setterov pre int, 6 getterov a 6 setterov pre float atď. Takže treba vytvoriť v triede MyNode gettery a settery pre všetky dátové typy s ktorými chceme v programe DynaSim pracovať. Počet týchto getterov a setterov obmedzuje možný počet hodnôt, ktoré možno zobraziť a upraviť v Properties okne. Ak budeme mať 3 gettery a settery pre každý dátový typ, Properties okno nebude schopné zobraziť viac ako 3 prvé položky. Ak teda uvažujeme, že chceme mať komponenty so 100 vnútornými hodnotami, potrebujeme vytvoriť 100 getterov a 100 setterov pre každý dátový typ!!! Z toho dôvodu je súčasná verzia programu obmedzená na 6 vnútorných hodnôt pre dátové typy int, float, boolean a String.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim10.jpg&amp;diff=3777</id>
		<title>Súbor:Dynasim10.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim10.jpg&amp;diff=3777"/>
		<updated>2010-04-18T21:54:26Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Príklad Properies okna&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Príklad Properies okna&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:DynasimXML.jpg&amp;diff=3776</id>
		<title>Súbor:DynasimXML.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:DynasimXML.jpg&amp;diff=3776"/>
		<updated>2010-04-18T21:50:28Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Príklad XML súboru pre simulačný komponent programu DynaSim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Príklad XML súboru pre simulačný komponent programu DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Vizu%C3%A1lna_%C4%8Das%C5%A5_programu_DynaSim&amp;diff=3775</id>
		<title>Vizuálna časť programu DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Vizu%C3%A1lna_%C4%8Das%C5%A5_programu_DynaSim&amp;diff=3775"/>
		<updated>2010-04-18T21:40:53Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Vytvorená stránka „Kategória:Študentské práce Kategória:Diplomové práce Kategória:Informatika {{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček| Ing. Juraj Ďuďák| 2009/2…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|2|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Vizuálna časť programu DynaSim=&lt;br /&gt;
Vzhľadom na design aplikácie DynaSim, je vhodné začať najskôr s tvorbou vizuálnej časti, a až potom pokračovať v tvorbe funkčnej časti, pretože  funkčná časť je priamo závislá od časti grafickej. Pred tým však treba vytvoriť novú aplikáciu na platforme NetBeans a vytvoriť v nej modul, ktorý bude predstavovať jadro tejto aplikácie.&lt;br /&gt;
&lt;br /&gt;
==Okno editora programu DynaSim==&lt;br /&gt;
Ak už máme vytvorenú aplikáciu platformy NetBeans a v nej jeden prázdny modul (viz. kap 1.4), môžeme si všimnúť, že aplikácia a modul obsahujú len konfiguračné súbory. Po skompilovaní takéhoto projektu je však možné ho spustiť aj napriek tomu, že sme do neho nedodali žiaden kód. Spustí sa len základný framework aplikácie (obr.5).&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim05.jpg|center|framed|Obr.5 Prázdny projekt]]&lt;br /&gt;
&lt;br /&gt;
Ako vidno z obrázku, toolbar je neaktívny a väčšina položiek v menu je taktiež neaktívna. Aby sme teda frameworku mohli dodať funkcionalitu, musíme vytvoriť nové okná a akcie pre jednotlivé menu položky. Môžeme začať s tvorbou okna editora. Do okna editora sa budú pridávať jednotlivé simulačné komponenty z palety a tie sa následne prepoja spojovacími čiarami. To znamená, že sa bude jednať o grafické rozhranie, v ktorom užívateľ tvorí vlastné simulačné schémy.&lt;br /&gt;
&lt;br /&gt;
===TopComponent===&lt;br /&gt;
Na tvorbu nových okien v rámci aplikácií postavených na platforme NetBeans sa používa TopComponent. Ten je poskytovaný cez modul Window System API. Na vytvorenie nového okna v aplikácii klikneme pravým tlačítkom na modul, ktorý bude manažovať toto okno a vyberieme položku New → Other a následne označíme Window Componenet z kategórie Module Developement. Po kliknutí na tlačítko Next sa nám zobrazí nové okno. V ňom v drop-down menu s názvom Window Position vyberieme jednu z preddefinovaných pozícií okna. Kedže chceme vytvoriť okno editora, je vhodné zvoliť si pozíciu editor. Tým sa celá nevyužitá šedá plocha v strede našej aplikácie (obr.5) pridelí TopComponentu. Ďalej je možné vo wizardovi nastaviť, či sa má okno spúšťať so spustením aplikácie. V ďalšom kroku je treba doplniť predponu pre názov triedy a môžeme dodať ikonu pre toto okno. Po stlačení tlačidla finish wizard vytvorí mimo hlavnej triedy aj niekoľko jej prislúchajúcich súborov. Je vhodné všimnúť si, že nám wizard automaticky vytvoril aj závislosti na potrebné moduly, konkrétne na Settings API, Swing Layout Extensions integration, UI utilities API, Utilities API a Window System API.&lt;br /&gt;
Teraz je nutné ísť do našeho novovytvoreného java súboru s koncovkou TopComponent a predponou, ktorú sme zvolili vo wizardovi (napr. DynaSimTopComponent). V source časti tohto súboru sa nám vygeneroval kód a môžeme si všimnúť aj niekoľko preťažených metód, ktoré predstavujú abstraktné metódy rodičovskej triedy. Zatiaľ však nie je nutné ich meniť. &lt;br /&gt;
V design časti nastavíme TopComponentu BorderLayout a a pridáme jScrollPane. Tým máme zaručené, že celá plocha editora bude scrollovateľná.&lt;br /&gt;
&lt;br /&gt;
===GraphPinScene===&lt;br /&gt;
Na simulačné schémy, ktoré budeme tvoriť v okne editora sa treba pozerať ako na grafovo orientovaný model. Simulačné komponenty predstavujú uzly a spojovacie čiary medzi nimi hrany. Visual Library API je vhodná práve na takéto účely. &lt;br /&gt;
Visual Library API nám ponúka dva druhy koreňových elementov – scén vhodných na tieto účely a to GraphScene a GraphPinScene. Scéna samotná je widget a ako bolo načrtnuté v kapitole 1.6, widgety majú stromovú štruktúru. Scéna je na úplnom vrchu hierarchie tejto stromovej štruktúry a stará sa o zobrazovanie ostatných widgetov na editačnej ploche.&lt;br /&gt;
GraphScene je scéna ktorá sa skladá len z uzlov a hrán, kým GraphPinScene obsahuje komponenty skladajúce sa z uzlov, hrán a pinov, čiže vstupov/výstupov jednotlivých uzlov. Jeden uzol môže mať ľubovoľný počet pinov. GraphPinScene je vhodnejšia pre účely DynaSimu, lebo jeho simulačné komponenty sa tiež skladajú z uzlov, hrán a terminálov.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim06-1.jpg|center|framed|Obr.6 Porovanie GraphScene a GraphPinScene]]&lt;br /&gt;
&lt;br /&gt;
GraphPinScene&amp;lt;N, E, P&amp;gt; je abstraktná trieda, preto z nej treba vytvoriť novú triedu dedením. Takto vytvorená trieda v programe Dynasim má názov DynaSimScene, jej delarácia je nasledovná:&lt;br /&gt;
&lt;br /&gt;
 public class '''DynaSimScene''' extends GraphPinScene&amp;lt;MyNode,MyEdge,MyPin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Po jej vytvorení sa automaticky vygeneruje časť kódu pre jej abstraktné metódy, to znamená, že sa v detskej triede preťažia. Ich parametre sú priamo závislé od dátového typu zadaného v šablóne pre GraphPinScene. MyNode, MyEdge a MyPin predstavujú dátové uzly jednotlivých widgetov. Tie budú rozobrané v kapitole 3. Od vývojára sa očakáva, že doplní kód týchto metód podľa špecifických potrieb jeho programu. Tieto metódy sú volané inými metódami danej triedy a neodporúča sa volať tieto preťažené metódy priamo. &lt;br /&gt;
Inštancia tejto triedy sa skladá z vrstiev LayerWidget, ktoré slúžia na zobrazovanie widgetov na scéne. DynaSimScene má 3 takéto vrstvy a to:&lt;br /&gt;
&lt;br /&gt;
'''mainLayer''' – slúži na zobrazovanie simulačných komponentov&lt;br /&gt;
&lt;br /&gt;
'''connectionLayer''' – slúži na zobrazovanie spojovacích čiar&lt;br /&gt;
&lt;br /&gt;
'''interractionLayer''' – slúži na zobrazovanie select obdĺžnika pri multiselecte&lt;br /&gt;
&lt;br /&gt;
Pri vytváraní takýchto vrstiev a postupuje nasledovne:&lt;br /&gt;
&lt;br /&gt;
1. Vytvorí sa inštancia triedy LayerWidget&lt;br /&gt;
&lt;br /&gt;
2. Vytvorená inštancia sa scéne pridá ako detský widget&lt;br /&gt;
&lt;br /&gt;
Príklad vytvorenia novej vrstvy v konštruktore triedy DynaSimScene:&lt;br /&gt;
&lt;br /&gt;
 LayerWidget mainLayer = new LayerWidget(this);&lt;br /&gt;
 this.addChild(mainLayer);&lt;br /&gt;
&lt;br /&gt;
Teraz sa bližšie pozrieme na preťažené metódy, ktoré sa automaticky vygenerovali:&lt;br /&gt;
&lt;br /&gt;
'''protected Widget attachNodeWidget(MyNode node)''' – táto metóda je volaná metódou addNode. Tá sa v tomto programe volá po dropnutí vybraného komponentu z palety na editačnú plochu. Metóda je zodpovedná za tvorbu widgetu pre simulačný komponent a jeho pridanie na scénu. Konkrétne v programe DynaSim sa pod widgetom rozumie inštancia typu Component_Widget, ktorý sa vytvorí na základe údajov z parametra node a následne sa prilepí na mainLayer.&lt;br /&gt;
&lt;br /&gt;
'''protected Widget attachEdgeWidget(MyEdge edge)''' – táto metóda je volaná metódou addEdge. Metóda je zodpovedná za tvorbu widgetu pre spojovaciu čiaru a jeho pridanie na scénu. V programe DynaSim sa pod týmto widgetom rozumie inštancia typu MyConnectionWidget, ktorý sa vytvorí na základe údajov z parametra edge a následne sa prilepí na connectionLayer. Ďalej sa nastaví router, ktorý riadi cestu spojovacej čiary.&lt;br /&gt;
&lt;br /&gt;
'''protected Widget attachPinWidget(MyNode node, MyPin pin)''' – táto metóda je volaná metódou addPin. Metóda je zodpovedná za tvorbu widgetu pre terminál simulačného komponentu a jeho pridanie na scénu. V programe DynaSim sa pod widgetom rozumie inštancia typu Pin_Widget, ktorý sa vytvorí na základe údajov z parametra funkcie a následne sa prilepí na SVG_Widget, ktorý je súčasťou Component_Widget-u. Pin_Widgetu sa tu pridá aj akcia na tvorbu spojovacích čiar.&lt;br /&gt;
&lt;br /&gt;
'''protected void attachEdgeSourceAnchor(MyEdge edge, MyPin oldSourcePin, MyPin sourcePin)''' – táto metóda je volaná metódou setEdgeSource. Metóda má vo vizuálnej reprezentácii na starosti pripojenie nového zdrojového pinu ku hrane. Pomocou parametra edge sa nájde inštancia našej spojovacej čiary a pomocou parametra sourcePin sa nájde widget, ktorému tento pin patrí. Pre tento widget sa vytvorí kotva dátového typu Anchor. Nakoniec sa spojovacej čiare cez jej metódu setSourceAnchor kotva pridá. Tým sa upevní kotva spojovacej čiary v zdrojovom termináli.&lt;br /&gt;
&lt;br /&gt;
'''protected void attachEdgeTargetAnchor(MyEdge edge, MyPin oldTargetPin, MyPin targetPin)''' – táto metóda je volaná metódou setEdgeTarget. Metóda má vo vizuálnej reprezentácii na starosti pripojenie nového cieľového pinu ku hrane a funguje obdobne ako predchádzajúca metóda.&lt;br /&gt;
&lt;br /&gt;
Trieda DynaSimScene obsahuje aj ďalšie metódy, tie sú však využívané zväčša menu a toolbar tlačítkami a je im venovaný priestor v príslušnej kapitole.&lt;br /&gt;
&lt;br /&gt;
==SVG – Škálovateľná vektorová grafika==&lt;br /&gt;
Jedná sa o špecifikáciu založenú na XML súborovom formáte, ktorá slúži na popis dvojrozmernej vektorovej grafiky. SVG je otvorený štandard, ktorý vytvorilo konzorcium World Wide Web.&lt;br /&gt;
Myšlienka programu DynaSim je založená na popise komponentov XML a SVG súbormi, kde XML v sebe drží dátovú časť a obsahuje inicializačné hodnoty a popisy komponentu a SVG obsahuje popis grafickej reprezentácie daného komponentu. Zápis SVG dokumentu môže vyzerať napríklad takto:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE svg PUBLIC &amp;quot;-//W3C//DTD SVG 1.1//EN&amp;quot; &lt;br /&gt;
   &amp;quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;160&amp;quot; height=&amp;quot;160&amp;quot; viewBox=&amp;quot;0 0 160 160&amp;quot; version=&amp;quot;1.1&amp;quot;&lt;br /&gt;
      xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;rect x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;100&amp;quot;&lt;br /&gt;
         fill=&amp;quot;none&amp;quot; stroke=&amp;quot;blue&amp;quot; stroke-width=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;circle cx=&amp;quot;100&amp;quot; cy=&amp;quot;100&amp;quot; r=&amp;quot;50&amp;quot;&lt;br /&gt;
         fill=&amp;quot;none&amp;quot; stroke=&amp;quot;lightseagreen&amp;quot; stroke-width=&amp;quot;5&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;text x=&amp;quot;15&amp;quot; y=&amp;quot;40&amp;quot;&lt;br /&gt;
         font-family=&amp;quot;Verdana&amp;quot; font-size=&amp;quot;30&amp;quot; fill=&amp;quot;red&amp;quot; &amp;gt;&lt;br /&gt;
     Hello&lt;br /&gt;
   &amp;lt;/text&amp;gt;&lt;br /&gt;
 &amp;lt;/svg&amp;gt;&lt;br /&gt;
Ako sa takáto časť kódu zobrazí v prehliadači Mozilla Firefox môžeme vidieť na obr.7. SVG dokáže natívne zobrazovať väčšina internetových prehliadačov. Ako možno vidieť z príkladu, jednotlivé geometrické tvary sa zadávajú cez xml tagy a ich poloha, rozmery a farby sú určené cez ich atribúty. Je dôležité v koreňovom svg tagu nastaviť veľkosť zobrazovanej plochy cez width a height.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim07.jpg|center|framed|Obr.7 Príklad SVG obrázku]]&lt;br /&gt;
&lt;br /&gt;
Ďalšie podrobnejšie informácie o SVG je možno získať na adrese http://www.w3.org/TR/SVG/ .&lt;br /&gt;
&lt;br /&gt;
==Grafická časť simulačných komponentov==&lt;br /&gt;
Simulačné komponenty sú zložené z widgetov, ktoré tvoria grafickú reprezentáciu komponentu a z nodes – dátových uzlov, ktoré v sebe uchovávajú informácie o vnútornom stave komponentu. Ako už bolo načrtnuté, widgety majú stromovú štruktúru, kde rodičovský widget môže mať niekoľko detských widgetov a tieto detské widgety opäť môžu mať svoje vlastné detské widgety atď. V prípade grafickej časti komponentu je koreňovým widgetom Component_Widget a jeho štrukúru možno vidieť na obr.8.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim08.jpg|center|framed|Obr.8 Architektúra grafickej časti komponentu]]&lt;br /&gt;
&lt;br /&gt;
Component_Widget má 2 detské widgety a to SVG_Widget, zodpovedný za zobrazovanie grafiky načítanej z SVG súboru a LabelWidget, ktorý slúži na zobrazovanie mena komponentu. SVG_Widget môže mať ľubovoľný počet detských widgetov typu Pin_Widget, ktoré označujú miesta pre vstupy a výstupy z komponentu.&lt;br /&gt;
&lt;br /&gt;
===SVG_Widget===&lt;br /&gt;
SVG_Widget je detskou triedou triedy Widget a je zodpovedný za parsovanie SVG súboru a vykreslenie objektu z načítaných údajov na scénu. Deklarácia konštruktora je nasledovná:&lt;br /&gt;
 public '''SVG_Widget''' (DynaSimScene scene, String svgfile, MyNode node)&lt;br /&gt;
Scene je scéna na ktorú sa daný widget prilepí, svgfile je cesta k SVG súboru z ktorého si widget načíta potrebné grafické údaje a node je dátový uzol, v ktorom sú uložené vnútorné stavy simulačného komponentu a jeho popis. V konštruktore sa volá metóda na parsovanie SVG súboru readSVG() a vytvorí sa popup menu pre tento komponent typu JPopupMenu. Následne sa do neho postupne pridajú jednotlivé položky typu JMenuItem. Na záver sa widgetu pridajú preddefinované akcie cez metódu getActions().addAction(WidgetAction action). Tieto akcie dodávajú widgetu funkcionalitu a majú vplyv aj na rodičovské widgety. V konštruktore je zadefinovaná akcia pre označenie widgetu, hover akcia, ktorá má hodnotu true ak sa kurzor myši nachádza nad týmto widgetom, akcia pre implementáciu popup menu a delete akcia, ktorá obsluhuje mazanie widgetov.&lt;br /&gt;
Niektoré významné metódy tejto triedy:&lt;br /&gt;
&lt;br /&gt;
'''private void readSVG (String svgFile)''' – táto metóda je určená na parsovanie SVG súboru, ku ktorému je zadaná cesta v jej parametri. Súbor sa parsuje pomocou SAXBuilder-u a získané hodnoty sa ukladajú medzi členské premenné inštancie.&lt;br /&gt;
&lt;br /&gt;
'''protected Rectangle calculateClientArea ()''' – je to abstraktná metóda triedy Widget. Vracia obdĺžnik do ktorého sa widget vykresľuje.&lt;br /&gt;
&lt;br /&gt;
'''public void paintWidget ()''' – je to abstraktná metóda triedy Widget a je zodpovedná za vykresľovanie widgetu. Metóda sa volá automaticky vždy, keď sa má widget prekresliť. Na vykresľovanie samotné sa používa AWT a údaje získné z parsovania SVG súboru metódou readSVG.&lt;br /&gt;
&lt;br /&gt;
===Pin_Widget===&lt;br /&gt;
Pin_Widget je detskou triedou triedy Widget a slúži na grafické zobrazenie terminálu simulačného komponentu. Konštruktor vypadá následovne:&lt;br /&gt;
 public '''Pin_Widget''' (Scene scene, MyPin pin)&lt;br /&gt;
Scene je scéna na ktorú sa daný widget prilepí, pin je dátový uzol, v ktorom sú uložené informácie o pine ako meno a poradové číslo. Metóda paintWidget() vykresľuje červený kríž. Ten označuje miesto terminálu. Informácie o počte a polohe jednotlivých terminálov sú obsiahnuté v príslušnom XML súbore.&lt;br /&gt;
&lt;br /&gt;
===Component_Widget===&lt;br /&gt;
Component_Widget je detskou triedou triedy Widget a zapúzdruje v sebe SVG_Widget a LabelWidget. Táto trieda má na starosti centrovanie svojich detských widgetov voči sebe. Konštruktor vypadá následovne:&lt;br /&gt;
 public '''Component_Widget''' (DynaSimScene scene, String svgfile, MyNode node, InstanceContent content, PaletteController controller)&lt;br /&gt;
Scene je scéna na ktorú sa daný widget prilepí, svgfile je cesta k SVG súboru a node je dátový uzol, v ktorom sú uložené vnútorné stavy simulačného komponentu a jeho popis. Tieto 3 parametre sa použíjú na vytvorenie inštancie SWG_Widget priamo v tomto konštruktore. Následne sa vytvorí inštancia LabelWidgetu s parametrom scene. LabelWidget je súčasťou Visual Library API a slúži na reprezentáciu textu na scéne. Tu slúži vlastne ako podpis komponentu a na scéne sa zobrazuje priemo pod grafickou časťou komponetu. V konštruktore sa ešte nastaví pomocou metódy setLayout centrovanie detských widgetov Component_Widget-u.&lt;br /&gt;
&lt;br /&gt;
Zaujímavé metódy tejto triedy:&lt;br /&gt;
&lt;br /&gt;
'''public final void setLabel(String label)''' – cez túto metódu sa mení meno komponentu. Je dôležité, aby sa nemenil len podpis samotný v LabelWidgete, ale treba zmenit meno komponentu aj v jeho dátovom uzle „node“.&lt;br /&gt;
&lt;br /&gt;
'''public void notifyStateChanged(ObjectState previousState, ObjectState newState)''' – je to abstraktná metóda triedy Widget. Volá sa vždy, keď sa zmení stav widgetu. To môže znamenať, že bol widget napr. označený, alebo je nad ním kurzor myši, resp. má tento widget na sebe focus. V tomto prípade, ak je widget označený, zmení sa jeho farba a ďalej sa cez PropertyNode vytvorí property sheet. Akým spôsobom, to je rozobrané v príslušnej kapitole. Component_Widget sa na scénu typu DynaSimScene pridáva cez metódu attachNodeWidget(MyNode node). Tá je volaná po dropnutí vybraného komponentu z palety na editačnú plochu. Ako vypadá inštancia Component_Widget-u na editačnej ploche je vidno na obr.9.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim09.jpg|center|framed|Obr.9 Príklad pre Component_Widget]]&lt;br /&gt;
&lt;br /&gt;
==Spojovacie čiary==&lt;br /&gt;
V grafovo orientovanom modeli sa uzly prepájajú pomocou hrán. To znamená, že jednotlivé komponenty musia byť prepojiteľné medzi sebou spojovacími čiarami. Treba brať na zreteľ, že sa komponenty neprepájajú priamo medzi sebou, ale každý komponent má svoje terminály. Tie môžu zastávať úlohu vstupu alebo výstupu pre tieto komponenty a práve pomocou nich sa prepájajú medzi sebou. Tiež treba brať do úvahy, že komponent môže mať viacero vstupov a tie môžu požadovať rôzne dátové typy aj v rámci jediného komponentu. Tak isto aj viacero výstupov z čoho každý môže predstavovať iný dátový typ.&lt;br /&gt;
===MyConnectionWidget===&lt;br /&gt;
Inštancie triedy ConnectionWidget majú za úlohu vykresľovať spojovacie čiary na scéne medzi dvoma bodmi. Tieto body sú určené inštanciami triedy Anchor – kotvami, ktoré sa dajú upevniť len v pinoch komponentu. ConnectionWidget je detskou triedou triedy Widget. Cesta spojenia je špecifikovaná kontrolnými bodmi, ktoré sa môžu pridať na čiaru automaticky podľa typu použitého routera, alebo ich môže užívateľ pridávať sám dvojklikom na spojovaciu čiaru. Vzhľadom na to, že chceme  spojovacím čiaram pridať aj ďalšie vlastnosti ako popup menu, musíme triedu ConnectionWidget rozšíriť na MyConnectionWidget. Konštruktor triedy:&lt;br /&gt;
 public '''MyConnectionWidget'''(Scene scene, MyEdge edge)&lt;br /&gt;
&lt;br /&gt;
scene - scéna na ktorú sa daný widget prilepí.&lt;br /&gt;
&lt;br /&gt;
edge – inštancia triedy, ktorá v sebe uchováva dáta tejto spojovacej čiary, ako meno, zdrojový a cieľový pin.&lt;br /&gt;
&lt;br /&gt;
V konštruktore sa vytvorí popup menu rovnakým spôsobom ako v SVG_Widgete. Ďalej sa nastavia tvary kontrolných bodov a kotiev cez metódy ''setControlPointShape'' a ''setTargetAnchorShape''. Nakoniec cez metódy getActions().addAction pridáme tejto spojovacej čiare akcie, ktoré s ňou môžeme vykonávať a to sú akcia na mazanie, hover akcia, možnosť označenia, možnosť rekonekcie, vytvorenie popup menu, možnosť pridávania a odoberania kontrolných bodov dvojklikom na čiaru a nakoniec akciu na pohyb kontrolnými bodmi myšou.&lt;br /&gt;
Spojovacie čiary sa na scénu typu DynaSimScene pripájajú na vrstvu connectionLayer cez metódu addEdge. Samotná spojovacia čiara sa však vytvára v metóde attachEdgeWidget, ktorá je volaná metódou addEdge.&lt;br /&gt;
&lt;br /&gt;
===MyConnectionProvider===&lt;br /&gt;
Na to, kde sa môže spojovacia čiara ukotviť existujú určité pravidlá. Na ich určenie sa používa interface ConnectProvider. Preto si treba vytvoriť novú triedu:&lt;br /&gt;
 public class '''MyConnectionProvider''' implements ConnectProvider&lt;br /&gt;
V triede DynaSimScene sa vytvorí nová akcia pre widgety a má následovný tvar: &lt;br /&gt;
 private WidgetAction connectAction = ActionFactory.createConnectAction (interractionLayer, new MyConnectionProvider(this));&lt;br /&gt;
Táto akcia sa cez getActions().addAction pridá každému widgetu typu Pin_Widget. Tým máme zaručené, že sa môžu medzi sebou prepájať komponenty medzi sebou len cez piny. Potom môžeme po kliknutí na zdrojový pin myšou ťahať spojenie k cieľovému pinu a pustiť tlačítko myši. Tým sa vytvorí spojenie medzi pinmi.&lt;br /&gt;
&lt;br /&gt;
Niektoré metódy zdedené cez implementáciu, ktoré určujú pravidlá pre prepojenie:&lt;br /&gt;
&lt;br /&gt;
'''public boolean isSourceWidget(Widget sourceWidget)''' – Metóda, ktorá zisťuje, či daný widget môže byť zdrojom pre ukotvenie spojovacej čiary. Ak je widget inštanciou triedy Pin_Widget, vyhovuje podmienke.&lt;br /&gt;
&lt;br /&gt;
'''public ConnectorState isTargetWidget (Widget sourceWidget, Widget targetWidget)''' – Metóda, ktorá zisťuje či daný widget môže byť zdrojom pre ukotvenie spojovacej čiary. Ak je widget inštanciou triedy Pin_Widget, vráti sa hodnota ConnectorState.ACCEPT, tým pádom je možné vytvoriť prepojenie medzi zdrojovým a cieľovým widgetom.&lt;br /&gt;
&lt;br /&gt;
'''public void createConnection(Widget sourceWidget, Widget targetWidget)''' – Metóda na vytvorenie spojenia medzi dvoma terminálmi typu Pin_Widget. Podmienkou pre prepojenie dvoch terminálov je to, že jeden terminál je vstup a druhy výstup. Táto informácia je uložená v inštancii triedy MyPin, ktorá sa použila na tvorbu pinu. Ak je táto podmienka splnená vytvorí sa spojenie medzi zdrojom a cieľom.&lt;br /&gt;
&lt;br /&gt;
===MyReconnectProvider===&lt;br /&gt;
Užívateľovi sa môže stať, že prepojí medzi sebou nesprávne piny. Aby napravil chybu, musel by zmazať celé spojenie a vytvoriť ho znovu. Avšak vďaka akcii na opätovné prepojenie mu stačí chytiť koncový bod spojovacej čiary, zdrojový alebo cieľový a spojiť ho s iným terminálom, čím môže opraviť svoju chybu, bez nutnosti mazania spojenia a tvorby nového. Na to slúži interface ConnectionProvider, ktorý je implementovaný nasledovne:&lt;br /&gt;
 public class MyReconnectProvider implements ReconnectProvider&lt;br /&gt;
Cez getActions().addAction sa cez ActionFactory vytvorí nová reconnect akcia s použitím tohto provideru. Takto vytvorená akcia je volaná v konštruktore triedy MyConnectionWidget. To znamená, že každá spojovacia čiara sa dá znovu prepojiť podľa stanovených podmienok provideru.&lt;br /&gt;
&lt;br /&gt;
Niektoré zdedené triedy z implementácie:&lt;br /&gt;
&lt;br /&gt;
'''public boolean isSourceReconnectable(ConnectionWidget connectionWidget)''' – Metóda, ktorá zisťuje, či je zdrojový widget prepojiteľný. Metóda vráti true hodnotu ak je zdrojový widget typu Pin_Widget.&lt;br /&gt;
&lt;br /&gt;
'''public boolean isTargetReconnectable(ConnectionWidget connectionWidget)''' – Metóda, ktorá zisťuje, či je cieľový widget prepojiteľný. Metóda vráti true hodnotu ak je cieľový widget typu Pin_Widget.&lt;br /&gt;
&lt;br /&gt;
'''public void reconnectingStarted (ConnectionWidget connectionWidget, boolean reconnectingSource)''' – V tejto metóde sa riešia akcie, ktoré sa majú vykonať, ak sa začne s novým prepájaním. V tomto prípade chceme aby sa na mieste kde bola pôvodne spojovacia čiara spojená s Pin_Widgetom znova objavil červený kríž, reprezentujúci terminál, keďže už viac nie je čiara s týmto terminálom spojená.&lt;br /&gt;
public void reconnectingFinished (ConnectionWidget connectionWidget, boolean reconnectingSource) – Metóda, ktorá sa vykoná po dokončení opätovného prepojenia rozpojeného konca spojovacej čiary s náhradným terminálom. Chceme, aby červený kríž reprezentujúci tento terminál zmizol.&lt;br /&gt;
&lt;br /&gt;
'''public ConnectorState isReplacementWidget (ConnectionWidget connectionWidget, Widget replacementWidget, boolean reconnectingSource)''' – Metóda, ktorá zisťuje či daný widget môže byť náhradným pinom. Ak je typu Pin_Widget, nemá hodnotu null a je vstup ak bol aj predošlý pin vstup, resp výstup ak bol rpedošlý pin vystup, metóda vráti hodnotu ConnectorState.ACCEPT. Potom sa môže zavolať nasledujúca metóda.&lt;br /&gt;
&lt;br /&gt;
'''public void reconnect (ConnectionWidget connectionWidget, Widget replacementWidget, boolean reconnectingSource)''' – V tejto metóde sa zmení zdrojový, respektíve cieľový pin, za ten, ktorý sme prepájali.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim09.jpg&amp;diff=3774</id>
		<title>Súbor:Dynasim09.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim09.jpg&amp;diff=3774"/>
		<updated>2010-04-18T21:26:17Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Príklad pre Component_Widget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Príklad pre Component_Widget&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim08.jpg&amp;diff=3773</id>
		<title>Súbor:Dynasim08.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim08.jpg&amp;diff=3773"/>
		<updated>2010-04-18T21:15:42Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: bola nahraná nová verzia „Súbor:Dynasim08.jpg“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Architektúra grafickej časti simulačného komponentu pre program DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim08.jpg&amp;diff=3772</id>
		<title>Súbor:Dynasim08.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim08.jpg&amp;diff=3772"/>
		<updated>2010-04-18T21:14:31Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Architektúra grafickej časti simulačného komponentu pre program DynaSim&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Architektúra grafickej časti simulačného komponentu pre program DynaSim&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim07.jpg&amp;diff=3771</id>
		<title>Súbor:Dynasim07.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim07.jpg&amp;diff=3771"/>
		<updated>2010-04-18T21:11:55Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Príklad SVG obrázku&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Príklad SVG obrázku&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim06-1.jpg&amp;diff=3770</id>
		<title>Súbor:Dynasim06-1.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim06-1.jpg&amp;diff=3770"/>
		<updated>2010-04-18T20:55:00Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Porovanie GraphScene a GraphPinScene&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Porovanie GraphScene a GraphPinScene&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim05.jpg&amp;diff=3768</id>
		<title>Súbor:Dynasim05.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim05.jpg&amp;diff=3768"/>
		<updated>2010-04-18T20:44:24Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Prázdny projekt aplikácie vytvorenej na platforme Netbeans&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Prázdny projekt aplikácie vytvorenej na platforme Netbeans&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Interakt%C3%ADvny_simul%C3%A1tor_DynaSim&amp;diff=3767</id>
		<title>Interaktívny simulátor DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Interakt%C3%ADvny_simul%C3%A1tor_DynaSim&amp;diff=3767"/>
		<updated>2010-04-18T20:31:10Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
{{Praca_uvod|1|Interaktívny simulátor DynaSim|Platforma NetBeans|Vizuálna časť programu DynaSim|Dátová časť simulačných komponentov|Okná a toolbary programu DynaSim|Funkčná časť programu DynaSim}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|slovensky&lt;br /&gt;
|anglicky&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Platforma NetBeans=&lt;br /&gt;
Platforma NetBeans je framework pre Swing aplikácie. NetBeans bol pôvodne vyvíjaný ako študentský projekt na Karlovej Univerzite v Prahe. Projekt kúpila v roku 1999 spoločnosť Sun a v roku 2000 z neho spravila open-source projekt.  Platforma poskytuje pre aplikácie na nej vyvíjané ukladanie stavu, prepájanie akcií s menu položkami, toolbary, klávesové skratky, či správu okien a mnohé ďalšie veci, ktoré predtým musel každý vývojár písať samostatne. &lt;br /&gt;
NetBeans platforma poskytuje spoľahlivú a flexibilnú aplikačnú architektúru. Aplikácie postavené na tejto platforme nemusia nutne vypadať ako NetBeans IDE, ktoré je tiež postavené na nej. Využitím NetBeans platformy je možné ušetriť mnohé mesiace vývoja.&lt;br /&gt;
Za posledných niekoľko rokov sa zvýšila popularita ''rich-client'' desktopových platforiem. Tento trend viedli práve NetBeans platforma a Eclipse RCP. Kým Eclipse RCP je založená na  SWT a JFace, čo sú nové neštandardné štýly a koncepty, platformna NetBeans je kompletne závislá od štandardných Java API s použitím AWT a Swing, čím plne integruje pôvodný koncept Java SE.&lt;br /&gt;
&lt;br /&gt;
==Charakteristiky Rich Client Platformy==&lt;br /&gt;
Rich-client platforma je aplikačné prostredie – základ desktopových aplikácií. Väčšina desktopových aplikácií má podobné vlastnosti ako sú rôzne menu, toolbary, status bary, zobrazovanie dát, ukladanie a nahrávanie užívateľsky špecifických dát a pod. Na tieto a ďalšie typické vlastnosti klientských aplikácií rich-client platforma poskytuje framework, s ktorým sa tieto vlastnosti dajú jednoducho spojiť dokopy. Framework takéhoto druhu sa zameriava na konfigurovateľnosť a rozšíriteľnosť aplikácie. &lt;br /&gt;
Najdôležitejším aspektom rich-client platformy je jej architektúra. Aplikácie založené na rich-client platforme sú písané vo forme modulov, v ktorých sú logicky koherentné časti aplikácie izolované.&lt;br /&gt;
Okrem Modularity ponúkanej rich-client architektúrou, ktorá poskytuje vysokú mieru robustnosti a hodnoty pre koncového užívateľa, poskytuje aj ďalšie výhody a to:&lt;br /&gt;
*Zníženie vývojového času&lt;br /&gt;
*Konzistentnosť užívateľského rozhrania&lt;br /&gt;
*Možnosť updatovania&lt;br /&gt;
*Platformovú nezávislosť&lt;br /&gt;
*Znovupoužiteľnosť a spoľahlivosť&lt;br /&gt;
&lt;br /&gt;
'''Zníženie vývojového času''' – Rich-client platforma poskytuje viacero API pre vývoj desktopových aplikácií. Vďaka znovupoužiteľnosti mnohých preddefinovaných komponentov sú vývojári schopní koncentrovať sa na funkčnú logiku aplikácie.&lt;br /&gt;
&lt;br /&gt;
'''Konzistentnosť užívateľského rozhrania''' – Rich-client platforma poskytuje framework pre zobrazenie užívateľského rozhrania a obzvlášť sa stará o konzistentnosť, prístupnosť a použiteľnosť.&lt;br /&gt;
&lt;br /&gt;
'''Možnosť updatovania''' – Za použitia rich-client platformy je možné rýchlo a efektívne distribuovať nové alebo updatované moduly koncovým užívateľom. Updaty môžu byť distribuované a inštalované formou modulov, to znamená, že nové nekonfliktné prvky aplikácie môžu byť vyvíjané nezávisle druhým vývojárskym týmom.&lt;br /&gt;
&lt;br /&gt;
'''Platformová nezávislosť''' - Rich-client platformy sú založené na medzinárodných štandardoch a znovupoužiteľných komponentoch. To znamená, že Java aplikácie na nich postavené sú automaticky spustiteľné na rôznych operačných systémoch ako sú Windows, či Linux, ak majú k dispozícii Java Runtime Environment. &lt;br /&gt;
&lt;br /&gt;
'''Znovupoužiteľnosť a spoľahlivosť''' – Rich-client platformy poskytujú širokú škálu modulov a funkcií, ktoré môžu byť využité vo vytváranej aplikácii. Ak modul úplne nezodpovedá požiadavkám aplikácie, je možné ho použiť ako počiatočný bod a následne ho rozšíriť alebo zmeniť podľa potreby. Keďže väčšina platforiem dáva k dispozícii aj svoje zdrojové kódy, niekedy môže byť výhodnejšie zmeniť alebo rozšíriť platformu samotnú. Tieto faktory implikujú veľkú mieru spoľahlivosti a voľnosti.&lt;br /&gt;
&lt;br /&gt;
==Charakteristiky Platformy NetBeans==&lt;br /&gt;
Platforma NetBeans ponúka okrem bežných výhod rich-client platformy viacero frameworkov a niekoľko ďalších špecifík, ktoré môžu byť užitočné pre niektoré aplikácie. Za zmienku stojí napríklad:&lt;br /&gt;
*Framework pre užívateľské rozhranie&lt;br /&gt;
*Data editor&lt;br /&gt;
*Customization display&lt;br /&gt;
*Wizard framework&lt;br /&gt;
*Data systémy&lt;br /&gt;
*Medzinárodnosť&lt;br /&gt;
*Help system&lt;br /&gt;
&lt;br /&gt;
'''Framework pre užívateľské rozhranie''' – Okná, menu, toolbary a daľšie komponenty sú poskytované platformou. To znamená, že sa vývojár môže sústrediť na špecifické úlohy, čo zmenší dĺžku kódu a zníži náchylnosť na chybu. Celý užívateľský interface v platforme NetBeans je založený na AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
'''Data Editor''' – je editor z NetBeans IDE a môžu ho používať aj iné aplikácie. Nástroje a funkčnosť editora môžu byť rýchlo a ľahko rozšírená a adaptovaná na požiadavky aplikácie.&lt;br /&gt;
&lt;br /&gt;
'''Customization display''' – Displej s užívateľsky a aplikačne špecifickými nastaveniami je potrebný v každej aplikácii.&lt;br /&gt;
&lt;br /&gt;
'''Wizard Framework''' – Platforma NetBeans ponúka jednoduché nástroje na tvorbu rozšíriteľých a user-friendly asistentov, ktorí budú užívateľa sprevádzať cez komplexné kroky v aplikácii.&lt;br /&gt;
&lt;br /&gt;
'''Data Systémy''' – U platformy NetBeans, dáta môžu byť lokálne alebo prístupné cez FTP, CVS, databázu, alebo XML súbor. Dátový prístup z jedného modulu je transparentný pre všetky ostatné moduly vďaka použitiu abstrakcie. Samotný dátový prístup je riešený pomocou NetBeans API.&lt;br /&gt;
&lt;br /&gt;
'''Medzinárodnosť''' – Platforma NetBeans poskytuje triedy a metódy na preklad JavaHelp a ďalších zdrojov do cudzích jazykov.&lt;br /&gt;
&lt;br /&gt;
'''Help System''' – Pomocou štandardného JavaHelp systému, NetBeans platforma ponúka centrálny systém pre integráciu a zobrazovanie nápovedy pre koncového užívateľa. Samostatné moduly môžu pridať ich vlastné nápovedy do help systému aplikácie.&lt;br /&gt;
&lt;br /&gt;
==Architektúra Platformy NetBeans==&lt;br /&gt;
Základným stavebným blokom platformy NetBeans je modul. Modul je kolekcia funkčne súvisiacich tried, spoločne s popisom rozhraní ktoré modul poskytuje a popisom ďalších modulov, ktoré potrebuje na to aby fungoval. Celá platforma NetBeans, rovnako ako aj aplikácie na nej postavené sú rozdelené do modulov. Tie sú nahraté jadrom Platformy NetBeans, ktoré sa nazýva NetBeans runtime container. NetBeans runtime container loaduje aplikačné moduly dynamicky a automaticky a následne je aj zodpovedný za beh aplikácie. V tomto prípade je NetBeans IDE dobrým príkladom modulárnej rich-client aplikácie. Funkčnosť a charakteristiky IDE ako napríklad podpora jazyku Java alebo editor zdrojového kódu , sú tvorené formou modulov postavených na Platforme Netbeans. To so sebou prináša možnosť rozšíriť aplikáciu o ďalšie moduly a možnosť adaptácie na špecifické požiadavky užívateľa tým, že sa nepoužívané moduly deaktivujú alebo odinštalujú.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:obr1.jpg|center|framed|Obr.1 Konceptuálna štruktúra NetBeans IDE]]&lt;br /&gt;
&lt;br /&gt;
Aby aplikácia dosiahla takýto stupeň modularity, Platforma Netbeans na jednej strane dovoľuje modulom dedičnosť inými modulmi a na strane druhej im dovoľuje komunikovať medzi sebou bez vzájomnej závislosti na sebe. Inými slovami Platforma NetBeans podporuje loose coupling (voľné prepojenie) modulov v rámci aplikácie.&lt;br /&gt;
Na optimalizáciu zapúzdrenia kódu do modulov. Čo je v modulárnom systéme nevyhnutné, Platforma NetBeans poskytuje svoj vlastný classloader systém. Každý modul je nahratý jeho classloaderom a tým sa sprístupní separátna nezávislá časť kódu. Na využitie funkčnosti ostatných modulov, modul môže deklarovať závislosti (dependency) na iných moduloch. &lt;br /&gt;
Samotná platforma NetBeans je sformovaná zo skupiny jadrových modulov (Obr.2), ktoré sú potrebné na spustenie aplikácie a na definovanie jej užívateľského rozhrania. Platforma NetBeans ponúka veľké množstvo API, čím značne zjednodušuje vývojový proces. Do tejto skupiny patria napríklad Actions API, Nodes API, Options SPI a ďalšie.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:ArchitekturaNetBeans.jpg|center|framed|Obr.2 Architektúra Platformy NetBeans]]&lt;br /&gt;
&lt;br /&gt;
==Tvorba aplikácie na Platforme NetBeans==&lt;br /&gt;
Ako už bolo spomenuté, základom platformy NetBeans a aplikácií na nej postavených sú moduly. Najskôr je potrebné vytvoriť aplikáciu samotnú. NetBeans IDE obsahuje wizarda na tvorbu takéhoto projektu. Cez ''File → New Project'' sa dostaneme do dialógového okna, kde vyberieme príslušnú kategóriu a projekt podľa  obr.3.&lt;br /&gt;
Na ďalšej strane sa vyplní názov projektu a zadá sa cesta, kde sa má projekt uložiť. Týmto sa vytvorilo niekoľko konfiguračných súborov aplikácie. Aby sme však aplikácii mohli dať funkcionalitu, musíme do nej pridať minimálne jeden modul.&lt;br /&gt;
Tvorba modulu je obdobná ako v prípade aplikácie samotnej s tým rozdielom, že podľa obr.3 v položke ''Projects'' vyberieme ''Module'' a vyplníme všetky náležitosti v dialógovom okne. V takom prípade sa vytvorí prázdny modul, obsahujúci len základné knižnice a niekoľko konfiguračných súborov.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim03.jpg|center|framed|Obr.3 Tvorba novej aplikácie na platforme NetBeans]]&lt;br /&gt;
&lt;br /&gt;
==Používanie knižníc a pridávanie závislostí na moduloch==&lt;br /&gt;
Keďže aplikácia bude pracovať s SVG a XML súbormi je nutné pridať do projektu knižnicu JDOM. JDOM je knižnica, ktorá rieši prístup k údajom XML súboru a ich manipuláciu.  JDOM sa nenachádza v štandardnom balíčku knižníc Javy, preto ju treba stiahnuť napríklad z adresy http://www.jdom.org/ .&lt;br /&gt;
Vzhľadom na to, že celá aplikácia je založená na moduloch, je vhodné integrovať externý JAR súbor knižnice vo forme modulu. Tým pádom je možné pridať túto knižnicu ako závislosť pre iné moduly, čím sa zvýši konzistencia aplikácie ako celku.&lt;br /&gt;
Opäť podobne ako v predchádzajúcom prípade podľa obr.3 v položke ''Projects'' vyberieme ''Library Wrapper Module''. V novom okne pridáme jdom.jar a jeho licenčný súbor. Ďalej sa postupuje ako v prípade vytvárania nového modulu.&lt;br /&gt;
Takto vytvorený modul je teraz nutné pridať modulu, ktorý potrebuje danú knižnicu využívať. Najskôr je potrebné sa uistiť, že sú všetky triedy knižnice sprístupnené cez ''Public Packages''. V pravej časti programu NetBeans IDE v okne ''Projects'' treba kliknúť pravým tlačítkom na modul knižnice a vyberať položku ''Properties''. V ''Properties'' okne potom vyberieme položku ''API Versioning''. Všetky balíčky v ''Public Packages'' musia byť zaškrtnuté  (viz. obr.4). To nám zaručí, že je modul verejný a budú ho môcť využívať iné moduly. Takýto modul sa objaví v ponuke závislostí medzi modulmi platformy NetBeans.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Dynasim04.jpg|center|framed|Obr.4 Tvorba verejného modulu]]&lt;br /&gt;
&lt;br /&gt;
Keď už má modul alebo knižnica všetky jeho balíčky verejné, môžeme ho pridať ako závislosť druhému modulu. V pravej časti programu NetBeans IDE v okne ''Projects'' treba kliknúť pravým tlačítkom na modul, ktorému chceme pridať závislosť a vyberieme položku ''Properties''. V ''Properties'' okne potom vyberieme položku ''Libraries''. Tu sa po kliknutí na ''Add Dependency'' objaví nové okno, ktoré obsahuje všetky dostupné moduly patriace platforme Netbeans, ale aj moduly, ktoré vytvoril užívateľ a sprístupnil ich cez Public Packages v API versioning. Tu nájdeme modul od ktorého má byť náš modul závislý. Môže to byť modul NetBeansu, vlastný modul, či knižničný modul. Jednému modulu môžeme pridať neobmedzené množstvo závislostí.&lt;br /&gt;
&lt;br /&gt;
==Visual Library API==&lt;br /&gt;
NetBeans platforma obsahuje veľké množstvo modulov, avšak pre účely simulačného programu DynaSim je obzvlášť významná Visual Library API. &lt;br /&gt;
Je to je knižnica, ktorá slúži na zobrazovanie rôznych štruktúr. Knižnica sa obzvlášť hodí na tvorbu grafovo orientovaných reprezentácií. Táto knižnica sa používa v NetBeans mobility pack, v návrhári JSF navigácie a ďalších nástrojoch. Knižnicu ale možno použiť aj mimo NetBeans platformu v akejkoľvek aplikácii založenej na Swingu. Na použitie Visual Library API stačí modulu ktorý ju má používať pridať na ňu závislosť podľa predošlej kapitoly. &lt;br /&gt;
Komponenty vo Visual Library API majú podobne ako pri Swingu stromovú štruktúru. Superclass všetkých grafických komponentov je trieda Widget. Tým pádom v grafovo orientovanom modeli kde sú ulzy vzájomne prepojené hranami, sa za widgety považujú všetky uzly aj hrany.  Widget môže zároveň slúžiť aj ako kontajner pre ďalšie widgety. Každý widget má pozíciu relatívnu k rodičovskému widgetu. Superclass Widget je zodpovedná za prezentáciu okraja a pozadia widgetu, ale aj jeho vlastností ako je farba, či priehľadnosť. Podobne ako Swing kontajner aj widget má layout, ktorý rieši poziciovanie jeho detských widgetov. Widget je možné zviazať s viacerými akciami, ktoré sa vykonajú za splnenia špecifických podmienok.&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim04.jpg&amp;diff=3766</id>
		<title>Súbor:Dynasim04.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim04.jpg&amp;diff=3766"/>
		<updated>2010-04-18T20:27:50Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Tvorba verejného modulu na platforme NetBeans&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tvorba verejného modulu na platforme NetBeans&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim03.jpg&amp;diff=3765</id>
		<title>Súbor:Dynasim03.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Dynasim03.jpg&amp;diff=3765"/>
		<updated>2010-04-18T20:21:41Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Tvorba novej aplikácie na platforme NetBeans&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tvorba novej aplikácie na platforme NetBeans&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Interakt%C3%ADvny_simul%C3%A1tor_DynaSim&amp;diff=2367</id>
		<title>Interaktívny simulátor DynaSim</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Interakt%C3%ADvny_simul%C3%A1tor_DynaSim&amp;diff=2367"/>
		<updated>2010-02-23T22:24:19Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Pridanie prvej kapitoly&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študentské práce]]&lt;br /&gt;
[[Kategória:Diplomové práce]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Hlavička_FM|{{PAGENAME}}|Bc. Michal Janíček|&lt;br /&gt;
Ing. Juraj Ďuďák|&lt;br /&gt;
2009/2010&lt;br /&gt;
|Diplomový projekt&lt;br /&gt;
|Mechatronika&lt;br /&gt;
}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Abstrakt&lt;br /&gt;
|slovensky&lt;br /&gt;
|anglicky&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Platforma NetBeans=&lt;br /&gt;
Platforma NetBeans je framework pre Swing aplikácie. NetBeans bol pôvodne vyvíjaný ako študentský projekt na Karlovej Univerzite v Prahe. Projekt kúpila v roku 1999 spoločnosť Sun a v roku 2000 z neho spravila open-source projekt.  Platforma poskytuje pre aplikácie na nej vyvíjané ukladanie stavu, prepájanie akcií s menu položkami, toolbary, klávesové skratky, či správu okien a mnohé ďalšie veci, ktoré predtým musel každý vývojár písať samostatne. &lt;br /&gt;
NetBeans platforma poskytuje spoľahlivú a flexibilnú aplikačnú architektúru. Aplikácie postavené na tejto platforme nemusia nutne vypadať ako NetBeans IDE, ktoré je tiež postavené na nej. Využitím NetBeans platformy je možné ušetriť mnohé mesiace vývoja.&lt;br /&gt;
Za posledných niekoľko rokov sa zvýšila popularita ''rich-client'' desktopových platforiem. Tento trend viedli práve NetBeans platforma a Eclipse RCP. Kým Eclipse RCP je založená na  SWT a JFace, čo sú nové neštandardné štýly a koncepty, platformna NetBeans je kompletne závislá od štandardných Java API s použitím AWT a Swing, čím plne integruje pôvodný koncept Java SE.&lt;br /&gt;
&lt;br /&gt;
==Charakteristiky Rich Client Platformy==&lt;br /&gt;
Rich-client platforma je aplikačné prostredie – základ desktopových aplikácií. Väčšina desktopových aplikácií má podobné vlastnosti ako sú rôzne menu, toolbary, status bary, zobrazovanie dát, ukladanie a nahrávanie užívateľsky špecifických dát a pod. Na tieto a ďalšie typické vlastnosti klientských aplikácií rich-client platforma poskytuje framework, s ktorým sa tieto vlastnosti dajú jednoducho spojiť dokopy. Framework takéhoto druhu sa zameriava na konfigurovateľnosť a rozšíriteľnosť aplikácie. &lt;br /&gt;
Najdôležitejším aspektom rich-client platformy je jej architektúra. Aplikácie založené na rich-client platforme sú písané vo forme modulov, v ktorých sú logicky koherentné časti aplikácie izolované.&lt;br /&gt;
Okrem Modularity ponúkanej rich-client architektúrou, ktorá poskytuje vysokú mieru robustnosti a hodnoty pre koncového užívateľa, poskytuje aj ďalšie výhody a to:&lt;br /&gt;
*Zníženie vývojového času&lt;br /&gt;
*Konzistentnosť užívateľského rozhrania&lt;br /&gt;
*Možnosť updatovania&lt;br /&gt;
*Platformovú nezávislosť&lt;br /&gt;
*Znovupoužiteľnosť a spoľahlivosť&lt;br /&gt;
&lt;br /&gt;
'''Zníženie vývojového času''' – Rich-client platforma poskytuje viacero API pre vývoj desktopových aplikácií. Vďaka znovupoužiteľnosti mnohých preddefinovaných komponentov sú vývojári schopní koncentrovať sa na funkčnú logiku aplikácie.&lt;br /&gt;
&lt;br /&gt;
'''Konzistentnosť užívateľského rozhrania''' – Rich-client platforma poskytuje framework pre zobrazenie užívateľského rozhrania a obzvlášť sa stará o konzistentnosť, prístupnosť a použiteľnosť.&lt;br /&gt;
&lt;br /&gt;
'''Možnosť updatovania''' – Za použitia rich-client platformy je možné rýchlo a efektívne distribuovať nové alebo updatované moduly koncovým užívateľom. Updaty môžu byť distribuované a inštalované formou modulov, to znamená, že nové nekonfliktné prvky aplikácie môžu byť vyvíjané nezávisle druhým vývojárskym týmom.&lt;br /&gt;
&lt;br /&gt;
'''Platformová nezávislosť''' - Rich-client platformy sú založené na medzinárodných štandardoch a znovupoužiteľných komponentoch. To znamená, že Java aplikácie na nich postavené sú automaticky spustiteľné na rôznych operačných systémoch ako sú Windows, či Linux, ak majú k dispozícii Java Runtime Environment. &lt;br /&gt;
&lt;br /&gt;
'''Znovupoužiteľnosť a spoľahlivosť''' – Rich-client platformy poskytujú širokú škálu modulov a funkcií, ktoré môžu byť využité vo vytváranej aplikácii. Ak modul úplne nezodpovedá požiadavkám aplikácie, je možné ho použiť ako počiatočný bod a následne ho rozšíriť alebo zmeniť podľa potreby. Keďže väčšina platforiem dáva k dispozícii aj svoje zdrojové kódy, niekedy môže byť výhodnejšie zmeniť alebo rozšíriť platformu samotnú. Tieto faktory implikujú veľkú mieru spoľahlivosti a voľnosti.&lt;br /&gt;
&lt;br /&gt;
==Charakteristiky Platformy NetBeans==&lt;br /&gt;
Platforma NetBeans ponúka okrem bežných výhod rich-client platformy viacero frameworkov a niekoľko ďalších špecifík, ktoré môžu byť užitočné pre niektoré aplikácie. Za zmienku stojí napríklad:&lt;br /&gt;
*Framework pre užívateľské rozhranie&lt;br /&gt;
*Data editor&lt;br /&gt;
*Customization display&lt;br /&gt;
*Wizard framework&lt;br /&gt;
*Data systémy&lt;br /&gt;
*Medzinárodnosť&lt;br /&gt;
*Help system&lt;br /&gt;
&lt;br /&gt;
'''Framework pre užívateľské rozhranie''' – Okná, menu, toolbary a daľšie komponenty sú poskytované platformou. To znamená, že sa vývojár môže sústrediť na špecifické úlohy, čo zmenší dĺžku kódu a zníži náchylnosť na chybu. Celý užívateľský interface v platforme NetBeans je založený na AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
'''Data Editor''' – je editor z NetBeans IDE a môžu ho používať aj iné aplikácie. Nástroje a funkčnosť editora môžu byť rýchlo a ľahko rozšírená a adaptovaná na požiadavky aplikácie.&lt;br /&gt;
&lt;br /&gt;
'''Customization display''' – Displej s užívateľsky a aplikačne špecifickými nastaveniami je potrebný v každej aplikácii.&lt;br /&gt;
&lt;br /&gt;
'''Wizard Framework''' – Platforma NetBeans ponúka jednoduché nástroje na tvorbu rozšíriteľých a user-friendly asistentov, ktorí budú užívateľa sprevádzať cez komplexné kroky v aplikácii.&lt;br /&gt;
&lt;br /&gt;
'''Data Systémy''' – U platformy NetBeans, dáta môžu byť lokálne alebo prístupné cez FTP, CVS, databázu, alebo XML súbor. Dátový prístup z jedného modulu je transparentný pre všetky ostatné moduly vďaka použitiu abstrakcie. Samotný dátový prístup je riešený pomocou NetBeans API.&lt;br /&gt;
&lt;br /&gt;
'''Medzinárodnosť''' – Platforma NetBeans poskytuje triedy a metódy na preklad JavaHelp a ďalších zdrojov do cudzích jazykov.&lt;br /&gt;
&lt;br /&gt;
'''Help System''' – Pomocou štandardného JavaHelp systému, NetBeans platforma ponúka centrálny systém pre integráciu a zobrazovanie nápovedy pre koncového užívateľa. Samostatné moduly môžu pridať ich vlastné nápovedy do help systému aplikácie.&lt;br /&gt;
&lt;br /&gt;
==Architektúra Platformy NetBeans==&lt;br /&gt;
Základným stavebným blokom platformy NetBeans je modul. Modul je kolekcia funkčne súvisiacich tried, spoločne s popisom rozhraní ktoré modul poskytuje a popisom ďalších modulov, ktoré potrebuje na to aby fungoval. Celá platforma NetBeans, rovnako ako aj aplikácie na nej postavené sú rozdelené do modulov. Tie sú nahraté jadrom Platformy NetBeans, ktoré sa nazýva NetBeans runtime container. NetBeans runtime container loaduje aplikačné moduly dynamicky a automaticky a následne je aj zodpovedný za beh aplikácie. V tomto prípade je NetBeans IDE dobrým príkladom modulárnej rich-client aplikácie. Funkčnosť a charakteristiky IDE ako napríklad podpora jazyku Java alebo editor zdrojového kódu , sú tvorené formou modulov postavených na Platforme Netbeans. To so sebou prináša možnosť rozšíriť aplikáciu o ďalšie moduly a možnosť adaptácie na špecifické požiadavky užívateľa tým, že sa nepoužívané moduly deaktivujú alebo odinštalujú.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:obr1.jpg|center|framed|Obr.1 Konceptuálna štruktúra NetBeans IDE]]&lt;br /&gt;
&lt;br /&gt;
Aby aplikácia dosiahla takýto stupeň modularity, Platforma Netbeans na jednej strane dovoľuje modulom dedičnosť inými modulmi a na strane druhej im dovoľuje komunikovať medzi sebou bez vzájomnej závislosti na sebe. Inými slovami Platforma NetBeans podporuje loose coupling (voľné prepojenie) modulov v rámci aplikácie.&lt;br /&gt;
Na optimalizáciu zapúzdrenia kódu do modulov. Čo je v modulárnom systéme nevyhnutné, Platforma NetBeans poskytuje svoj vlastný classloader systém. Každý modul je nahratý jeho classloaderom a tým sa sprístupní separátna nezávislá časť kódu. Na využitie funkčnosti ostatných modulov, modul môže deklarovať závislosti (dependency) na iných moduloch. &lt;br /&gt;
Samotná platforma NetBeans je sformovaná zo skupiny jadrových modulov (Obr.2), ktoré sú potrebné na spustenie aplikácie a na definovanie jej užívateľského rozhrania. Platforma NetBeans ponúka veľké množstvo API, čím značne zjednodušuje vývojový proces. Do tejto skupiny patria napríklad Actions API, Nodes API, Options SPI a ďalšie.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:ArchitekturaNetBeans.jpg|center|framed|Obr.2 Architektúra Platformy NetBeans]]&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:ArchitekturaNetBeans.jpg&amp;diff=2366</id>
		<title>Súbor:ArchitekturaNetBeans.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:ArchitekturaNetBeans.jpg&amp;diff=2366"/>
		<updated>2010-02-23T22:15:21Z</updated>

		<summary type="html">&lt;p&gt;MichalJanicek: Architektúra Platformy NetBeans&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Architektúra Platformy NetBeans&lt;/div&gt;</summary>
		<author><name>MichalJanicek</name></author>
		
	</entry>
</feed>