Lekce 5 - Uložení objektů do CSV v Javě - Dokončení
V minulé lekci, Uložení objektů do CSV v Javě, jsme si vytvořili formulářovou aplikaci s databází uživatelů, která ukládá instance do textových souborů ve formátu CSV.
V dnešním Java tutoriálu implementujeme do naší objektové formulářové aplikace načtení uživatelů z textového souboru ve formátu CSV.
Třída Databaze
Do třídy si přidáme metodu pro načtení uživatelů.
Metoda nacti()
Kód metody je následující:
public void nacti() throws IOException { //nejprve vyprázdníme uzivatele uzivatele.clear(); try { //projdeme všechny řádky v souboru, každý rozdělíme na části podle středníků //rozdělené části pak použijeme pro přidání nového uživatele for (String radek : Files.readAllLines(soubor)) { String[] rozdeleno = radek.split(";"); pridejUzivatele(rozdeleno[0], Integer.parseInt(rozdeleno[1]), LocalDate.parse(rozdeleno[2])); } } catch (IOException ex) { JOptionPane.showMessageDialog(null, "Databázi se nepodařilo načíst, soubor zřejmě neexistuje."); } }
Nejprve kolekci uzivatele
vyprázdníme. Soubor
soubor
budeme číst řádek po řádku v cyklu. Každý řádek
rozdělíme metodou split()
, které předáme oddělovač
;
. Následně do kolekce uzivatele
, pomocí metody
pridejUzivatele()
, přidáme objekt s rozdělenými hodnotami.
Prezentační vrstva aplikace
Jako první si připravíme nové formulářové prvky (komponenty z
ToolBoxu). Tlačítko Uložit už máme, přidáme tlačítko
Načíst pojmenované nacistJButton
, dále
komponentu JList
pojmenovanou listUzivatelu
. V
Properties komponenty JList
se přepneme do
záložky Code a nastavíme Type Parameters
na
<Uzivatel>
.
Dále přidáme:
JTextField
- pro zadání jména nového uživatele,JSpinner
- pro zadání věku uživatele,JTextField
- pro zadání datumu registrace uživatele
Ke komponentám přidáme i patřičné popisné
komponenty JLabel
. Tyto prvky můžeme seskupit do panelu.
V dalším panelu budeme mít tři komponenty JLabel
pro
detail uživatele:
jmenoJLabel
,vekJLabel
,registrovanJLabel
Další tři komponenty JLabel
přidáme jako
jejich popisek.
Nakonec přidáme tlačítko pridatJButton
k přidání
uživatele. Výsledný formulář vypadá takto:

Metoda
ulozitJButtonActionPerformed()
Z tlačítka Uložit odstraníme vytvoření testovacích
uživatelů. Samotné uložení nyní vložíme do
try
-catch
bloku. Jelikož naše databáze výjimky
posílá pomocí throws
dále, budeme na ně reagovat ve
formulářové části. Po zachycení výjimky zobrazíme
JOptionPane
s chybou. Metoda tlačítka bude tedy vypadat
takto:
private void ulozitJButtonActionPerformed(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."); } }
Upozornění na chybu, tedy komunikace s uživatelem, přímo ve
třídě Databaze
by nebylo vhodné.
Metoda
nacistJButtonActionPerformed()
Obdobně naklikneme metodu tlačítka Načíst:
private void nacistJbuttonActionPerformed(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."); } }
V reálné aplikaci 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
listUzivateluValueChanged()
Nyní zpracujeme kliknutí na komponentu 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ý).
Metoda
pridatJButtonActionPerformed()
Posledním tlačítkem je tlačítko Přidat pro přidání nového uživatele:
private void pridatJButtonActionPerformed(java.awt.event.ActionEvent evt) { String jmeno = jmenoJTextField.getText().replace(";", " "); int vek = (int) vekJSpinner.getModel().getValue(); LocalDate registrovan = LocalDate.parse( registrovanJTextField.getText(), DateTimeFormatter.ofPattern("d'.'M'.'y")); databaze.pridejUzivatele(jmeno, vek, registrovan); }
Kdyby nám uživatel vložil do jména středník, aplikaci
by nám rozbil. Proto voláme metodu replace(";", " ")
, která nám
tyto středníky vymění za mezery.
Propojení databáze s
kolekcí listUzivatelu
Nyní musíme databázi nabindovat na list uživatelů, aby se s každou
změnou databáze aktualizoval. To uděláme tak, že v návrháři klikneme
pravým tlačítkem na listUzivatelu
, vybereme Customize
code a řádek, kde se nastavuje model pomocí metody
setModel()
přepneme z default code
na
custom property
a nyní jej můžeme upravit na:
listUzivatelu.setModel(databaze.getModel());

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

Podobně bychom si mohli napsat i mazání uživatelů.
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ěl 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 175x (9.47 kB)
Aplikace je včetně zdrojových kódů v jazyce Java