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

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ů

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

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

> Poslední diskuze

12.8.2016 11:51 / Josef Zapletal
Jak udělat HTML/Javascript swiping gallery do mobilu?

8.8.2016 14:58 / Adams
fairies for hire

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

Více ...

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