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

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ů

28.11.2018 23:56 /František Kučera

Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.


Komentářů: 1

12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář

6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář

18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business. Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář

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

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

> Poslední diskuze

2.12.2018 23:56 / František Kučera
Sraz

5.10.2018 17:12 / Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?

20.9.2018 10:04 / Jan Ober
Jaký kurz a software by jste doporučili pro začínajcího kodéra?

20.9.2018 10:00 / Jan Ober
Re: Gimp

20.2.2018 18:48 / Ivan Majer
portal

Více ...

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