11.07.2015 Views

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

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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!