BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Lekce 5 - Uložení objektů do CSV v Javě část 2

V minulé lekci, Uložení objektů do CSV v Javě, jsme načali databázi uživatelů pomocí CSV souborů.

Nyní aplikaci dokončíme a doladíme.

Načtení uživatelů z CSV souboru

Uložení nám funguje, zbývá umět data opětovně načíst. Soubor budeme číst řádek po řádku, každý řádek rozdělíme metodou split() a následně do kolekce přidáme objekt s příslušnými hodnotami. Před načtením si kolekci vyprázdníme, aby v ní nebyli i uživatelé načtení někdy dříve (kdyby se aplikace někdy rozšiřovala).

public void nacti() throws IOException {
    uzivatele.clear();
    // Otevře soubor pro čteni
    try (BufferedReader br = new BufferedReader(new FileReader(soubor))) {
        String s;
        // Čteme řádek po řádku
        while ((s = br.readLine()) != null) {
            // Rozdělí řetězec řádku podle středníků
            String[] rozdeleno = s.split(";");
            String jmeno = rozdeleno[0];
            int vek = Integer.parseInt(rozdeleno[1]);
            LocalDate registrovan = LocalDate.parse(rozdeleno[2]);
            // Přidá uživatele s danými hodnotami
            pridejUzivatele(jmeno, vek, registrovan);
        }
    }
}

Třída databáze je tedy kompletní. Nyní se zaměříme na formulářovou část.

Prezentační vrstva aplikace

Jako první si připravíme nové formulářové prvky (komponenty z ToolBoxu). Přidáme tlačítko načíst, dále JList listUzivatelu. V Properties přepneme do záložky Code a nastavíme Type Parametters na <User>. Dále JTextField na jméno nového uživatele, JSpinner na jeho věk a JFormattedTextField na datum registrace. Ke komponentám přidáme i nějaké labely. Tyto prvky můžeme seskupit do panelu. V dalším panelu budou 3 labely na detail uživatele, ty pojmenujeme jmenoJLabel, vekJLabel a registrovanJLabel. Další 3 labely přidáme jako jejich popisek. Nakonec přidáme tlačítko k přidání uživatele. Pokud to bylo moc rychlé, nezoufejte, tady je obrázek výsledného formuláře:

Formulář databáze uživatelů v CSV

V reálu by bylo přidání uživatelů pravděpodobně přítomno v dalším formuláři, který by se zobrazoval jako dialog, ale nám to bude v tutoriálu stačit takto.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Z tlačítka "Uložit" odstraníme vytvoření testovacích uživatelů. Samotné uložení nyní vložíme do try-catch bloku. Víme totiž, že finally (tedy TWR blok v naší databázi) výjimky nepohlcuje, což také chceme a budeme na ně reagovat ve formulářové části, kam reakce logicky patří. Upozornění na chybu, tedy komunikace s uživatelem, přímo ve třídě Databaze by bylo špatně. Po zachycení výjimky zobrazíme JOptionPane s chybou. Metoda tlačítka bude tedy vypadat takto:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        databaze.uloz();
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Databázi se nepodařilo uložit, zkontrolujte přístupová práva k souboru.");
    }
}

Obdobně naklikneme metodu tlačítka "Načíst". V reálu by se načtení vykonalo asi automaticky po spuštění aplikace a uložení po ukončení, pro názornost si to však ponecháme na tlačítkách. Metoda tlačítka "Načíst" tedy vypadá takto:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        databaze.nacti();
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Databázi se nepodařilo načíst, soubor zřejmě neexisituje.");
    }
}

Nyní zpracujeme kliknutí na listUzivatelu, které provede zobrazení detailu uživatele do připravených labelů:

private void listUzivateluValueChanged(javax.swing.event.ListSelectionEvent evt) {
    Uzivatel uzivatel = listUzivatelu.getSelectedValue();
    if (uzivatel != null) {
        jmenoJLabel.setText(uzivatel.getJmeno());
        vekJLabel.setText(String.valueOf(uzivatel.getVek()));
        registrovanJLabel.setText(uzivatel.getRegistrovan().toString());
    }
}

Kód jsme opodmínkovali pro případ, že by nebyl žádný uživatel vybrán (list by byl prázdný).

Poslední tlačítko bez metody je Přidání nového uživatele. Rozklikneme ho tedy, vložení bude velmi jednoduché. Stačí uživatele přidat do databáze a ta se o vše postará:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    String jmeno = jmenoJTextField.getText();
    int vek = (int) vekJSpinner.getModel().getValue();
    LocalDate registrovan = LocalDate.parse(
            registrovanJFormattedTextField.getText(),
            DateTimeFormatter.ofPattern("d'.'M'.'y"));
    databaze.pridejUzivatele(jmeno, vek, registrovan);
}

Zkusíme přidat nového uživatele:

Formulář databáze uživatelů v CSV

Podobně bychom si mohli napsat i mazání uživatelů, ale to již nechám na vás.

Nyní musíme databázi nabindovat na list uživatelů, aby se s každou změnou databáze aktualizoval. To uděláme dodáním následující řádky do konstruktoru MainJFrame:

listUzivatelu.setModel(databaze.getModel());

Naše aplikace je téměř hotová, ještě se zamyslíme nad tím, co se stane, když někdo do jména vloží středník. Aplikace se rozbije. Proto budeme v metodě uloz() středníky ze jména odstraňovat. Kdybychom dělali aplikaci, kde bychom je potřebovali (což se nestává příliš často), můžeme vybrat jiný zástupný znak. Pokud bychom chtěli být dokonalí, vložíme takovou hodnotu se středníkem do uvozovek. Poté se však již nejedná o jednoduché CSV a metoda split() nám přestane stačit. Dále by se to samozřejmě dalo řešit jiným formátem. My si tedy středníky pouze odstraňme, přesněji je nahradíme mezerami změnou jediného řádku v metodě uloz():

String[] hodnoty = {u.getJmeno().replace(";", " "), String.valueOf(u.getVek()), u.getRegistrovan().toString()};

A jsme hotoví. Pokud vám něco nešlo úplně hladce, hotový projekt máte jako vždy v příloze i se zdrojovým kódem.

V následujícím cvičení, Řešené úlohy k 1.-5. lekci práce se soubory v Javě, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 56x (39.45 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

Předchozí článek
Uložení objektů do CSV v Javě
Všechny články v sekci
Soubory a síť v Javě
Článek pro vás napsal Ing. Petr Štechmüller
Avatar
Jak se ti líbí článek?
1 hlasů
Autor se věnuje primárně programování v Jave, ale nebojí se ani webových technologií.
Aktivity (6)

 

 

Komentáře

Avatar
Pavol Franek
Člen
Avatar
Pavol Franek:5.5.2019 19:58

Toto ti zaručene nebude fungovať:

String[] hodnoty = { u.jmeno.replace(';',' '), u.vek.toString(), u.registrovan.toString() };

V priloženom programe to máš ale dobre:

String[] hodnoty = {u.getJmeno().replace(";", " "), String.valueOf(u.getVek()), u.getRegistrovan().toString()};
 
Odpovědět
5.5.2019 19:58
Avatar
Odpovídá na Pavol Franek
Ing. Petr Štechmüller:5.5.2019 20:16

Jo díky, nejspíš jsem to zapomněl v článku upravit...

Odpovědět
5.5.2019 20:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Rozbita Zaluzie:30. května 15:45

Potřeboval bych pomoc ohledně JListu.. přepsal jsem Type parameters na <Uzivatel> a do konstruktoru zapsal nastavení modulu ale problém je v tom že vygenerovaný kód z NetBeans je stále

listUzivatelu.setModel(new javax.swing.AbstractListModel<Uzivatel>() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });

nevěděli by jse jak bych to mohl opravit :D

 
Odpovědět
30. května 15:45
Avatar
Odpovídá na Rozbita Zaluzie
Rozbita Zaluzie:30. května 19:11

Aha řešení je v designéru v code úplně dole stačí nastavit Code generation na Serialize

 
Odpovědět
30. května 19:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.