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:

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

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í.
Měla jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 86x (39.45 kB)
Aplikace je včetně zdrojových kódů v jazyce java
Komentáře


Zobrazeno 7 zpráv z 7.