LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Programujeme s XML (5.) - DOM v Javě II

Minule jsme si zopakovali načítání a ukládání dokumentů. Dnes se tedy podíváme, jak náš dokument propojíme s tabulkou.

29.6.2004 15:00 | Aleš Hakl | Články autora | přečteno 12720×

Pokud chceme v komponentě JTable zobrazit vlastní data, je často nejrychlejší implementovat vlastní třídu odvozenou od třídy AbstractTableModel (tedy přesněji řečeno od třídy TableModel, ale AbstractTableModel nám poskytne některé užitečné pomocné metody.). Musíme tedy implementovat tyto metody:

Implementaci prvních tří metod a metody isCellEditable() rozebírat nebudu, v našem případě totiž nejsou vůbec zajímavé. Metoda getRowCount() v našem případě nepřistupuje přímo k dokumentu, ale pouze vrací hodnotu chráněné proměnné rowCount, jež je v odpovídajících metodách nastavováná, inkrementována a dekrementována. Vzhledem k tomu, že zbytek této ukázkové třídy je napsán silně neoptimálně, je to jen taková ukázka, jak by to také mohlo jít.

    public Object getValueAt(int row, int col) {
        Element it = ((Element)doc.getDocumentElement().getElementsByTagName("person").item(row));
        if (it==null) return null;
        Element el = (Element)it.getElementsByTagName(tags[col]).item(0);
        if (el==null) return null;
        Text text = (Text)el.getFirstChild();
        if (text==null) return null;
        return text.getData();
    }

Nejprve z kořenového elementu dokumentu vybereme všechny elementy s názvem "person", poté ze seznamu použijeme takový element, jaký nám udává parametr row. Pokud takový element neexistuje, získáme null, což na následujícím řádku ošetřujeme podmínkou. Z pole tags zjistíme název elementu odpovídajícího danému sloupci, a element uložíme do proměnné, celé je opět ošetřeno na výskyt hodnoty null. Z tohoto elementu použijeme první dceřiný uzel (tj. textový uzel, situace, že by se tam vyskytoval jiný uzel není ošetřena, opět je ošetřeno pouze kdyby žádný takový uzel neexistoval). Nakonec do volající metody (tj. nějakých vnitřností komponenty JTable) vrátíme obsah onoho prvního elementu.

    public void setValueAt(Object value, int row, int col) {
        Element it = ((Element)doc.getDocumentElement().getElementsByTagName("person").item(row));
        if (it==null) return;
        Element el = (Element)it.getElementsByTagName(tags[col]).item(0);
        if (el==null) return;
        Text newText = doc.createTextNode(value.toString());
        while (el.getFirstChild()!=null){
            el.removeChild(el.getFirstChild());
        }
        el.appendChild(newText);
    }

Metoda pro změnu obsahu buňky je nápadně podobná předchozí, středem je též nalezení odpovídajícího elementu, se kterým budeme manipulovat, tentokrát ovšem data nečteme, ale přepisujeme. Nejprve si vytvoříme nový textový uzel reprezentující novou hodnotu buňky (Není nejmenší důvod, proč toto dělat jako první krok, ale zdrojový kód přecejenom takto vypadá poněkud uhlazeněji.). Poté v cyklu smažeme všechny dceřiné uzly našeho elementu (je docela škoda, že autoři DOMu na toto nevyhradili speciální metodu). Nakonec vložíme nový obsah, tj. textový uzel, který jsme si dříve vytvořili.

Naše ukázka však není příliš optimální, bylo by vhodné v metodě setValueAt() vytvářet případné neexistující elementy (tj. <first-name />, <surname />, <phone /> a <email />) například nějak takto:

    public void setValueAt(Object value, int row, int col) {
        Element it = ((Element)doc.getDocumentElement().getElementsByTagName("person").item(row));
        if (it==null) return;
        Element el = (Element)it.getElementsByTagName(tags[col]).item(0);

        if (el==null) {
            el = doc.createElement(tags[col]);
            it.appendChild(el);
        };
        Text newText = doc.createTextNode(value.toString());
        while (el.getFirstChild()!=null){
            el.removeChild(el.getFirstChild());
        }
        el.appendChild(newText);
    }

Toto řešení by nám případně umožnilo odstranit vytváření těchto elementů z metody addItem(), na kterou se podíváme v dalším díle.

Další jistě užitečnou optimalizaci by představovalo umístění instance seznamu uzlů vraceného často používanou konstrukcí doc.getElementsByTagName("person") mezi chráněné proměnné spolu s dokumentem doc a výše uvedené volání provádět jen tehdy, je-li potřeba. Pravdou ovšem je, že toto by naší ukázku dost znepřehlednilo, ale zato ještě výrazněji zrychlilo, zvláště pokud bychom zpracovávali větší objemy dat.

Příště rozbor naší ukázky uzavřeme čtyřmi metodami implementujícími funkcionalitu čtyř tlačítek "Add", "Delete", "Move up" a "Move down" u dolní (jižní ^_~) hrany okna naší aplikace.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář

16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář

18.6.2018 0:43 /František Kučera
Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.
Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze