Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ... Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

einsty.hostujem.sk
from einsty.hostujem.sk More from this publisher
11.07.2015 Views

P R O G R A M U J E M EPridanie referencie na webovú slububu, v našom prípade adresu http://LLEVO/wsAutori/Service1.asmx. Tlaèidlom Add Referencepridáme do projektu referenciu na webovú slubu.Referenciu v pravom okne vývojového prostredia premenujeme na wsAutori. Ak sa po−zrieme do adresára nášho projektu, nájdeme tam podadresár Web References | wsAutori,ktorý obsahuje nieko¾ko súborov obsahujúcich proxy triedy a interakcie SOAP.Na zaèiatok zdrojového súboru Form1.cs pridáme referenciuusing System.Net;a inštancie proxy tried webovej slubyprivate DataSet dsAutori;private DataTable dtAuthors;private wsAutori.Service1 ws = new wsAutori.Service1();Jadro kódu bude v procedúre btDaj_Click. Všimnime si, e v praktickej aplikácii je dob−rým zvykom poisti sa proti vzniku chýb a výnimiek (programová konštrukcie try – catch).private void btDaj_Click(object sender, System.EventArgs e){try{dsAutori = ws.DajAutora(tbMesto.Text);dtAuthors = dsAutori.Tables["Authors"];PridajDataDoListView();}catch (WebException we){MessageBox.Show("Nemozem sa pripojit. Chyba: " + we.Message,}}"Connection Failed");Jednotlivé záznamy zapuzdrené v datasete pridáme do komponentu ListView pomocounovovytvorenej metódy PridajDataDoListView().Kód v tele procedúry je pomerne jednoduchý, ide o pridanie obsahu dvoch ståpcov da−tasetu do komponentu ListView.private void PridajDataDoListView(){ListViewItem polozka;lvAutori.Clear();lvAutori.Columns.Add("ContactName",(lvAutori.Width/2),HorizontalAlignment.Left);lvAutori.Columns.Add("Address",(lvAutori.Width/2),HorizontalAlignment.Right);lvAutori.View = View.Details;foreach(DataRow row in dtAuthors.Rows){polozka = new ListViewItem(row["au_lname"].ToString());polozka.SubItems.Add(row["au_fname"].ToString());lvAutori.Items.Add(polozka);}}Výsledok v okne emulátora na náš testovací dopytsvedèí o jeho správnosti.U v závere predchádzajúceho príkladu sme na−znaèili, e riešenie s vyuitím webovej sluby je ove¾aèistejšie z h¾adiska pouitej architektúry. Formátovékonverzie údajov môu nepatrne zníi výkon, aletáto drobná nevýhoda je vyváená jednoduchosouklientskej aplikácie, ale hlavne menšou frekvenciounutnosti upgrade u klienta. Vo väèšine príkladov po−staèí úprava webovej sluby a takto inovovaná apli−kaèná logika je bez nutnosti akýchko¾vek zásahov uklienta ihneï k dispozícii. Výhody z h¾adiska jedno−duchosti a èistoty oddelenia jednotlivých architekto−nických vrstiev aplikácie sú takisto neoddiskutovate¾−né. K webovej slube môeme cez protokol HTTP pri−stupova prakticky odkia¾ko¾vek a môeme ju vyuívaaj z iných typov aplikácií (pozri úvodné èasti seriálu,venované MMIT).Test aplikácieV budúcom pokraèovaní sa budeme venova SQLServeru CE, teda databázovému serveru, ktorý beípriamo na mobilnom zariadení.¼uboslav LackoProgramujeme v Jave7. èas: Komponenty JTable a JTreenájdete na CD REVUEAj keï sa nám rok prehupol do druhej polovice a vonku zúria leto a prázdniny, mono stesi našli chví¾ku èasu na to, aby ste zasadli za svoj poèítaè a venovali sa ïalšiemu pokraèo−vaniu nášho seriálu o praktickom programovaní v Jave. Verím, e vás zaujme, pretoe sabudeme venova ve¾mi praktickej téme, a to komponentom JTable (podporné triedy súumiestnené v balíku javax.swing.table) a JTree (javax.swing.tree), ktoré sú súèasou kniniceSwing. Ako podklad na prácu s nimi nám poslúi predchádzajúca èas, v ktorej sme sa obo−známili s dátovými modelmi a architektúrou MVC. Pokia¾ ste teda z nejakého dôvodu eštepredošlú èas nepreštudovali, odporúèam vám tak spravi ešte prv, ne sa zaènete venovatej dnešnej.JTABLE. Komponent JTable predstavuje ve¾mi komplexný poh¾ad na tabu¾ku. Aby stesprávne pochopili termín poh¾ad, spomeòte si na predchádzajúcu èas a architektúru MVC(model/view/controller) – komponent JTable je moné chápa z aspektu tejto architektúryako písmeno V, alebo ak chcete, View, teda po slovensky poh¾ad. U v predošlom pokraèo−vaní ste mali monos oboznámi sa s komponentmi, ktoré predstavujú iba urèitý poh¾adna dáta, prièom tieto dáta sú v skutoènosti poskytované inými, nevizuálnymi komponent−mi. Preto na prácu s nimi je potrebné pouíva viacero podporných tried. My zaèneme roz−právanie o triede JTable jednoduchšími príkladmi a postupne sa prepracujeme k zloitejšímèrtám jej architektúry MVC.Komponent JTable je moné skonštruova viacerými spôsobmi. Najjednoduchšie je po−ui konštruktor preberajúci ako celoèíselné parametre poèet riadkov a poèet ståpcov ta−bu¾ky:// skonštruujeme tabu¾ku 5x4JTable table = new JTable(5, 4);Pokia¾ by ste chceli hneï v konštruktore inicializova bunky tabu¾ky nejakými východis−kovými hodnotami, môete poui konštruktor prijímajúci dvojrozmerné pole objektov typuObject a pole objektov opisujúcich jednotlivé ståpce:// vytvoríme maticu dátString[][] data = {{"1", "2", "3"},{"4", "5", "6"},{"7", "8", "9"}};// vytvoríme pole s opisom ståpcovString[] names = {"Prvý", "Druhý", "Tretí"};// skonštruujeme tabu¾kuJTable table = new JTable(data, names);S komponentom JTable budete najèastejšie pouíva aj komponent JScrollPane, pretoev prípade, e tabu¾ku nezapuzdríte do JScrollPane a umiestnite ju do kontajnera priamo,nebudú zobrazované záhlavia ståpcov:JScrollPane jsp = new JScrollPane(table);getContentPane()add(jsp);DÁTOVÝ MODEL KOMPONENTU JTABLE. Trieda, ktorú chcete poui ako dáto−vý model pre JTable, musí implementova rozhranie TableModel, definované v balíku javax.swing.table. Toto rozhranie obsahuje nasledujúce metódy:addTableModelListener() – metóda slúiaca na pridanie poslucháèa typuTableModelListener, ktorého metóda tableChanged() je volaná pri kadej zmene dát.Väèšinou je poslucháèom samotná tabu¾ka, aby mohla prekresli svoj obsah pri zmene dát.removeTableModelListener() – odregistruje poslucháèa typu TableModelListenerzo zoznamu poslucháèov.getColumnClass() – metóda vracia objekt typu Class, ktorý opisuje typ dát uloenýchv ståpci s indexom daným ako parametrom.7/2003 PC REVUE 123

P R O G R A M U J E M EgetColumnCount() – metóda vracajúca poèet ståpcov tabu¾ky.getColumnName() – metóda vráti názov ståpca s indexom daným ako parameter.getRowCount() – metóda vracajúca poèet riadkov v tabu¾ke (vynímajúc záhlavie).getValueAt() – metóda vráti hodnotu v riadku a ståpci, zadanými ako parametre, hod−nota je vrátená ako objekt typu Object.setValueAt() – metóda slúiaca na nastavenie hodnoty v riadku a ståpci, zadanými akoparametre, hodnota je odovzdávaná ako prvý parameter, ako objekt typu Object.isCellEditable() – metóda vráti logickú hodnotu true alebo false na základe toho, èi jealebo nie je moné editova bunku v riadku a ståpci danými ako parametre.Implementácia všetkých metód môe by niekedy zdåhavá a hlavne zbytoèná záleitos,keïe existujú u preddefinované triedy ako AbstractTableModel a DefaultTableModel, ktorénám implementáciu vlastného dátového modelu znaène u¾ahèujú.Trieda AbstractTableModel je abstraktná a poskytuje základnú funkènos dátového mo−delu tabu¾ky implementáciou väèšiny metód rozhrania TableModel. Jedinými tromi me−tódami, ktorých implementácia sa ponecháva na aplikaènom programátorovi, sú metódygetRowCount(), getColumnCount() a getValueAt(). Pri vytváraní konkrétnej triedy rozširu−júcej triedu AbstractTableModel sa musíte teda postara iba o správne urèenie poètu ståp−cov a riadkov a správne urèenie hodnoty uloenej na danej pozícii. Pozrime sa, ako môetaká ukáková implementácia triedy odvodenej od AbstractTableModel vyzera:class MyTableModel extends AbstractTableModel {private Object[][] values;public MyTableModel(Object[][] values) {this.values = values;}public int getRowCount() {return values.length;}public int getColumnCount() {return values[0].length;}public Object getValueAt(int row, int column) {return values[row][column];}}Ako vidíte, pri inštanciácii objektu nášho dátového modelu treba odovzda konštruk−toru odkaz na maticu hodnôt typu Object, ktoré budú zobrazované v jednotlivých bun−kách tabu¾ky. Poèet riadkov je urèený poètom polí, ktoré premenná values obsahuje (pre−menná values je matica, teda pole polí). Poèet ståpcov je determinovaný poètom prvkovprvého po¾a matice. Keï si zobrazovací komponent (v našom prípade komponent JTable)vyiada hodnotu konkrétnej bunky v tabu¾ke, je mu jednoducho odovzdaný odkaz naobjekt s príslušnými hodnotami riadkového a ståpcového indexu. Náš novovytvorený dáto−vý model môe by pouitý napr. takto:Object[][] values = {{"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}};getContentPane().add(new JTable(new MyTableModel(values)));Takto vytvorená tabu¾ka bude obsahova tri riadky a tri ståpce s postupne vypísanýmihodnotami od 1 po 9.DEFAULTTABLEMODEL. Trieda DefaultTableModel sa pouíva vdy, keï pri konštrukciikomponentu JTable nepouijete konštruktor preberajúci ako jeden z parametrov inštan−ciu dátového modelu, reprezentovanú ako odkaz na triedu implementujúcu rozhranieTableModel. Ide teda o analógiu s komponentmi preberanými v predošlej èasti, pretoe vprípade pouitia konštruktora preberajúceho dáta v inej podobe ne zapuzdrené v dáto−vom modeli alebo v prípade pouitia bezparametrického konštruktora bude pouitý de−faultný dátový model DefaultTableModel, do ktorého budú získané dáta importované.Trieda DefaultTableModel je konkrétnou implementáciou rozhrania TableModel a je odvo−dená od AbstractTableModel. K tomu pridáva nieko¾ko metód, ktoré znaène u¾ahèujú mani−puláciu so zapuzdrenými dátami. Pomocou metód addRow(), insertRow() a addColumn()môete pridáva riadky a ståpce hodnôt, pomocou metód removeRow() a moveRow() riad−ky maza alebo premiestòova. Môete takisto nastavi konkrétnu hodnotu jedinej bunkyprostredníctvom metódy setValueAt(). Na presnú špecifikáciu a zoznam parametrov tých−to metód staèí nahliadnu do dokumentácie k API.Ako vidíte, vïaka triede DefaultTableModel èasto nebudete nútení implementova vlast−nú triedu s rozhraním TableModel. V nasledujúcom príklade nadviaeme na predchádza−júcu ukáku, tentoraz však vo verzii s pouitím DefaultTableModel. Pridáme aj zapuzdreniezobrazovacieho komponentu JTable do komponentu JScrollPane. To nám umoní vidieaj záhlavia ståpcov (ak ste si predchádzajúci príklad testovali, urèite ste si všimli, e záhla−via ståpcov nie sú vidite¾né). Pre úsporu miesta uvádzame len metódu init():public void init() {DefaultTableModel tableModel = new DefaultTableModel(3, 3);int value = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)tableModel.setValueAt(String.valueOf(++value), i, j);JTable table = new JTable(tableModel);getContentPane().add(new JScrollPane(table));}Istee je moné naplni dátový model viacerými spôsobmi, tu som vám predstavil tennajjednoduchší – nastavenie hodnoty kadej bunky osobitne v cykle. Podstatnejší tu všakje fakt, e sme nemuseli implementova vlastnú triedu dátového modelu.Výsledok máte monos vidie na obrázku 1.JTREE. Ïalším zaujímavým komponentom, ktorý prinies−la kninica Swing, je komponent JTree. Ako u jeho názovnapovedá, ide o komponent, ktorý vykreslí údaje štruktúro−vané do stromu, aký máte monos vidie napr. aj v apliká−cii Prieskumník, ktorý v strome zobrazuje adresárovú štruk−túru.Zloitejšie pouitie komponentu JTree vyaduje znalosObr. 1viacerých tried definovaných v balíèku javax.swing.tree, alezáklady, ako vytvorenie jednoduchého stromu s nieko¾kýmivetvami, si môeme demonštrova na príklade. Vyuijeme vòom konštruktor JTree preberajúci ako parameter poleobjektov typu Object, ktoré reprezentujú hodnoty v strome.Kadý strom má práve jeden uzol na najvyššej úrovni,nazývaný aj koreòový uzol alebo skrátene koreò. Zobrazo−vanie tohto koreòového uzla je implicitne vypnuté. Zmenutohto nastavenia je moné vykona volaním metódy setRoot−Visible().Poïme u na s¾úbený príklad:import javax.swing.*;Obr. 2import javax.swing.tree.*;import java.awt.*;public class JTreeExample extends JApplet {public void init() {Object[] data = {"Paul", "John", "George", "Ringo"};JTree tree = new JTree(data);tree.setRootVisible(true);getContentPane().add(tree);}}Výsledok máte monos vidie na obrázku 2.Iste vás u napadla otázka, èo robi v prípade, e chceme vloi do stromu uzly, ktoréobsahujú ïalšie poduzly. Riešením je definova danú poloku po¾a, ktorým komponentJTree inicializujeme, ako pole alebo objekt typu Vector. Lepšie je pouitie triedy Vector,pretoe takýto prístup nám umoní prekry metódu toString(), ktorej návratová hodnotaje pouitá ako názov tohto uzla. Poloky vloené do tejto triedy potom reprezentujú jejdcérske uzly. Na objasnenie uvádzam nasledujúci príklad (metóda init()):public void init() {Object[] data = {"", "Help!", "Revolver", "Abbey road", "Let it be"};Vector ff = new Vector() {public String toString() {return "Fab Four";}};ff.add("Paul");ff.add("John");ff.add("George");ff.add("Ringo");data[0] = ff;JTree tree = new JTree(data);tree.setRootVisible(true);getContentPane().add(tree);}Výsledok po rozbalení vetvy "Fab Four" máte monosvidie na obrázku 3.Myslím, e teraz by vám u mal by základný spôsobpouitia triedy JTree jasný. Viete vytvori tento vizuálnykomponent, ako aj naplni ho dátami do ¾ubovo¾nej úrov−ne (aj keï mono trošku akopádne).DÁTOVÝ MODEL KOMPONENTU JTREE. Je naèa−se, aby sme si povedali, akým spôsobom sú uloené dáta,ktoré sú zobrazené komponentom JTree. Podobne akoostatné komponenty, s ktorými ste sa oboznámili v tomtoseriáli, pouíva tento komponent svoj dátový model,ktorý je reprezentovaný objektom triedy implementujúcejrozhranie TreeModel, definované v triede javax.swing.tree.Toto rozhranie deklaruje metódy na pridávanie a odobe−ranie poslucháèov udalostí súvisiacich so zmenami v dáto− Obr. 3vom modeli, ktorými sú addTreeModelListener() a remove−TreeModelListener().Metóda getChild() vráti objekt reprezentujúci dcérsky uzol objektu, ktorý jej odovzdá−te ako parameter. Takisto musíte špecifikova index dcérskeho uzla, ktorého odkaz chce−te získa, prièom tieto uzly sú indexované od 0 v poradí, v akom boli k uzlu pridané. Me−tóda getChildCount() vráti poèet dcérskych uzlov uzla zadaného ako parameter. Na ziste−nie indexu umiestnenia v rodièovskom uzle dcérskeho uzla vyuijete metódu getIndex−OfChild().Rozhranie ïalej deklaruje metódu getRoot(), ktorá vráti objekt reprezentujúci koreòo−vý uzol stromu. Metóda isLeaf() signalizuje, èi uzol zadaný ako parameter je listom stro−mu, alebo nie. Listom stromu je taký uzol, ktorý nemá alebo nemôe ma nijaké dcérskeuzly.124 PC REVUE 7/2003

P R O G R A M U J E M EgetColumnCount() – metóda vracajúca poèet ståpcov tabu¾ky.getColumnName() – metóda vráti názov ståpca s indexom daným ako parameter.getRowCount() – metóda vracajúca poèet riadkov v tabu¾ke (vynímajúc záhlavie).getValueAt() – metóda vráti hodnotu v riadku a ståpci, zadanými ako parametre, hod−nota je vrátená ako objekt typu Object.setValueAt() – metóda slúiaca <strong>na</strong> <strong>na</strong>stavenie hodnoty v riadku a ståpci, zadanými akoparametre, hodnota je o<strong>do</strong>vzdávaná ako prvý parameter, ako objekt typu Object.isCellEditable() – metóda vráti logickú hodnotu true alebo false <strong>na</strong> základe toho, èi jealebo nie je moné editova bunku v riadku a ståpci danými ako parametre.Implementácia všetkých metód môe by niekedy zdåhavá a hlavne zbytoèná záleitos,keïe existujú u preddefinované triedy ako AbstractTableModel a DefaultTableModel, ktorénám implementáciu vlastného dátového modelu z<strong>na</strong>ène u¾ahèujú.Trieda AbstractTableModel je abstraktná a poskytuje základnú funkènos dátového mo−delu tabu¾ky implementáciou väèšiny metód rozhrania TableModel. Jedinými tromi me−tódami, ktorých implementácia sa ponecháva <strong>na</strong> aplikaènom programátorovi, sú metódygetRowCount(), getColumnCount() a getValueAt(). Pri vytváraní konkrétnej triedy rozširu−júcej triedu AbstractTableModel sa musíte teda postara iba o správne urèenie poètu ståp−cov a riadkov a správne urèenie hodnoty uloenej <strong>na</strong> danej pozícii. Pozrime sa, ako môetaká ukáková implementácia triedy odvodenej od AbstractTableModel vyzera:class MyTableModel extends AbstractTableModel {private Object[][] values;public MyTableModel(Object[][] values) {this.values = values;}public int getRowCount() {return values.length;}public int getColumnCount() {return values[0].length;}public Object getValueAt(int row, int column) {return values[row][column];}}Ako vidíte, pri inštanciácii objektu nášho dátového modelu treba o<strong>do</strong>vzda konštruk−toru odkaz <strong>na</strong> maticu hodnôt typu Object, ktoré budú zobrazované v jednotlivých bun−kách tabu¾ky. Poèet riadkov je urèený poètom polí, ktoré premenná values obsahuje (pre−menná values je matica, teda pole polí). Poèet ståpcov je determinovaný poètom prvkovprvého po¾a matice. Keï si zobrazovací komponent (v <strong>na</strong>šom prípade komponent JTable)vyiada hodnotu konkrétnej bunky v tabu¾ke, je mu jednoducho o<strong>do</strong>vzdaný odkaz <strong>na</strong>objekt s príslušnými hodnotami riadkového a ståpcového indexu. Náš novovytvorený dáto−vý model môe by pouitý <strong>na</strong>pr. takto:Object[][] values = {{"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}};getContentPane().add(new JTable(new MyTableModel(values)));Takto vytvorená tabu¾ka bude obsahova tri riadky a tri ståpce s postupne vypísanýmihodnotami od 1 po 9.DEFAULTTABLEMODEL. Trieda DefaultTableModel sa pouíva vdy, keï pri konštrukciikomponentu JTable nepouijete konštruktor preberajúci ako jeden z parametrov inštan−ciu dátového modelu, reprezentovanú ako odkaz <strong>na</strong> triedu implementujúcu rozhranieTableModel. Ide teda o a<strong>na</strong>lógiu s komponentmi preberanými v pre<strong>do</strong>šlej èasti, pretoe vprípade pouitia konštruktora preberajúceho dáta v inej po<strong>do</strong>be ne zapuzdrené v dáto−vom modeli alebo v prípade pouitia bezparametrického konštruktora bude pouitý de−faultný dátový model DefaultTableModel, <strong>do</strong> ktorého budú získané dáta importované.Trieda DefaultTableModel je konkrétnou implementáciou rozhrania TableModel a je odvo−dená od AbstractTableModel. K tomu pridáva nieko¾ko metód, ktoré z<strong>na</strong>ène u¾ahèujú mani−puláciu so zapuzdrenými dátami. Pomocou metód addRow(), insertRow() a addColumn()môete pridáva riadky a ståpce hodnôt, pomocou metód removeRow() a moveRow() riad−ky maza alebo premiestòova. Môete takisto <strong>na</strong>stavi konkrétnu hodnotu jedinej bunkyprostredníctvom metódy setValueAt(). Na presnú špecifikáciu a zoz<strong>na</strong>m parametrov tých−to metód staèí <strong>na</strong>hliadnu <strong>do</strong> <strong>do</strong>kumentácie k API.Ako vidíte, vïaka triede DefaultTableModel èasto nebudete nútení implementova vlast−nú triedu s rozhraním TableModel. V <strong>na</strong>sledujúcom príklade <strong>na</strong>dviaeme <strong>na</strong> predchádza−júcu ukáku, tentoraz však vo verzii s pouitím DefaultTableModel. Pridáme aj zapuzdreniezobrazovacieho komponentu JTable <strong>do</strong> komponentu JScrollPane. To nám umoní vidieaj záhlavia ståpcov (ak ste si predchádzajúci príklad testovali, urèite ste si všimli, e záhla−via ståpcov nie sú vidite¾né). Pre úsporu miesta uvádzame len metódu init():public void init() {DefaultTableModel tableModel = new DefaultTableModel(3, 3);int value = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)tableModel.setValueAt(String.valueOf(++value), i, j);JTable table = new JTable(tableModel);getContentPane().add(new JScrollPane(table));}Istee je moné <strong>na</strong>plni dátový model viacerými spôsobmi, tu som vám predstavil ten<strong>na</strong>jjednoduchší – <strong>na</strong>stavenie hodnoty kadej bunky osobitne v cykle. Podstatnejší tu všakje fakt, e sme nemuseli implementova vlastnú triedu dátového modelu.Výsle<strong>do</strong>k máte monos vidie <strong>na</strong> obrázku 1.JTREE. Ïalším zaujímavým komponentom, ktorý prinies−la kninica Swing, je komponent JTree. Ako u jeho názov<strong>na</strong>povedá, ide o komponent, ktorý vykreslí údaje štruktúro−vané <strong>do</strong> stromu, aký máte monos vidie <strong>na</strong>pr. aj v apliká−cii Prieskumník, ktorý v strome zobrazuje adresárovú štruk−túru.Zloitejšie pouitie komponentu JTree vyaduje z<strong>na</strong>losObr. 1viacerých tried definovaných v balíèku javax.swing.tree, alezáklady, ako vytvorenie jednoduchého stromu s nieko¾kýmivetvami, si môeme demonštrova <strong>na</strong> príklade. Vyuijeme vòom konštruktor JTree preberajúci ako parameter poleobjektov typu Object, ktoré reprezentujú hodnoty v strome.Kadý strom má práve jeden uzol <strong>na</strong> <strong>na</strong>jvyššej úrovni,<strong>na</strong>zývaný aj koreòový uzol alebo skrátene koreò. Zobrazo−vanie tohto koreòového uzla je implicitne vypnuté. Zmenutohto <strong>na</strong>stavenia je moné vyko<strong>na</strong> volaním metódy setRoot−Visible().Poïme u <strong>na</strong> s¾úbený príklad:import javax.swing.*;Obr. 2import javax.swing.tree.*;import java.awt.*;public class JTreeExample extends JApplet {public void init() {Object[] data = {"Paul", "John", "George", "Ringo"};JTree tree = new JTree(data);tree.setRootVisible(true);getContentPane().add(tree);}}Výsle<strong>do</strong>k máte monos vidie <strong>na</strong> obrázku 2.Iste vás u <strong>na</strong>padla otázka, èo robi v prípade, e chceme vloi <strong>do</strong> stromu uzly, ktoréobsahujú ïalšie poduzly. Riešením je definova danú poloku po¾a, ktorým komponentJTree inicializujeme, ako pole alebo objekt typu Vector. Lepšie je pouitie triedy Vector,pretoe takýto prístup nám umoní prekry metódu toString(), ktorej návratová hodnotaje pouitá ako názov tohto uzla. Poloky vloené <strong>do</strong> tejto triedy potom reprezentujú jejdcérske uzly. Na objasnenie uvádzam <strong>na</strong>sledujúci príklad (metóda init()):public void init() {Object[] data = {"", "Help!", "Revolver", "Abbey road", "Let it be"};Vector ff = new Vector() {public String toString() {return "Fab Four";}};ff.add("Paul");ff.add("John");ff.add("George");ff.add("Ringo");data[0] = ff;JTree tree = new JTree(data);tree.setRootVisible(true);getContentPane().add(tree);}Výsle<strong>do</strong>k po rozbalení vetvy "Fab Four" máte monosvidie <strong>na</strong> obrázku 3.Myslím, e teraz by vám u mal by základný spôsobpouitia triedy JTree jasný. Viete vytvori tento vizuálnykomponent, ako aj <strong>na</strong>plni ho dátami <strong>do</strong> ¾ubovo¾nej úrov−ne (aj keï mono trošku akopádne).DÁTOVÝ MODEL KOMPONENTU JTREE. Je <strong>na</strong>èa−se, aby sme si povedali, akým spôsobom sú uloené dáta,ktoré sú zobrazené komponentom JTree. Po<strong>do</strong>bne akoostatné komponenty, s ktorými ste sa oboznámili v tomtoseriáli, pouíva tento komponent svoj dátový model,ktorý je reprezentovaný objektom triedy implementujúcejrozhranie TreeModel, definované v triede javax.swing.tree.Toto rozhranie deklaruje metódy <strong>na</strong> pridávanie a o<strong>do</strong>be−ranie poslucháèov udalostí súvisiacich so zme<strong>na</strong>mi v dáto− Obr. 3vom modeli, ktorými sú addTreeModelListener() a remove−TreeModelListener().Metóda getChild() vráti objekt reprezentujúci dcérsky uzol objektu, ktorý jej o<strong>do</strong>vzdá−te ako parameter. Takisto musíte špecifikova index dcérskeho uzla, ktorého odkaz chce−te získa, prièom tieto uzly sú indexované od 0 v poradí, v akom boli k uzlu pridané. Me−tóda getChildCount() vráti poèet dcérskych uzlov uzla zadaného ako parameter. Na ziste−nie indexu umiestnenia v rodièovskom uzle dcérskeho uzla vyuijete metódu getIndex−OfChild().Rozhranie ïalej deklaruje metódu getRoot(), ktorá vráti objekt reprezentujúci koreòo−vý uzol stromu. Metóda isLeaf() sig<strong>na</strong>lizuje, èi uzol zadaný ako parameter je listom stro−mu, alebo nie. Listom stromu je taký uzol, ktorý nemá alebo nemôe ma nijaké dcérskeuzly.124 PC REVUE 7/2003

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!