5. diel - Uloženie objektov do CSV v Jave časť 2
V minulej lekcii, Uloženie objektov do CSV v Jave , sme načal databázu užívateľov pomocou CSV súborov. Teraz aplikáciu dokončíme a doladíme.
Načítanie používateľov z CSV súboru
Uloženie nám funguje, zostáva vedieť dáta opätovne načítať. Súbor
budeme čítať riadok po riadku, každý riadok rozdelíme metódou
split()
a následne do kolekcie pridáme objekt s príslušnými
hodnotami. Pred načítaním si kolekciu vyprázdnime, aby v nej neboli aj
užívatelia načítanie niekedy skôr (keby sa aplikácia niekedy
rozširovala).
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); } } }
Trieda databázy je teda kompletná. Teraz sa zameriame na formulárovom časť.
Prezentačná vrstva aplikácie
Ako prvý si pripravíme nové formulárové prvky (komponenty z ToolBox).
Pridáme tlačidlo načítať, ďalej JList
listUzivatelu
. V Properties prepneme do záložky Code a nastavíme
Type Parametters
na <User>
. Ďalej
JTextField
na meno nového používateľa, JSpinner
na
jeho vek a JFormattedTextField
na dátum registrácie. Ku
komponentom pridáme aj nejaké labely. Tieto prvky môžeme zoskupiť do
panelu. V ďalšom paneli budú 3 labely na detail užívateľa, tie pomenujeme
jmenoJLabel
, vekJLabel
a
registrovanJLabel
. Ďalšie 3 labely pridáme ako ich popisok.
Nakoniec pridáme tlačidlo na pridanie používateľa. Ak to bolo moc rýchle,
nezúfajte, tu je obrázok výsledného formulára:
V reáli by bolo pridanie používateľov pravdepodobne prítomné v ďalšom formulári, ktorý by sa zobrazoval ako dialóg, ale nám to bude v tutoriálu stačiť takto.
Z tlačidla "Uložiť" odstránime vytvorenie testovacích používateľov.
Samotné uloženie teraz vložíme do try
- catch
bloku. Vieme totiž, že finally
(teda TWR blok v našej databáze)
výnimky nepohlcuje, čo tiež chceme a budeme na ne reagovať vo formulárové
časti, kam reakcie logicky patrí. Upozornenie na chybu, teda komunikácia s
užívateľom, priamo v triede Databaze
by bolo zle. Po zachytení
výnimky zobrazíme JOptionPane
s chybou. Metóda tlačidla bude
teda vyzerať 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."); } }
Obdobne naklikne metódu tlačidla "Načítať". V reáli by sa načítanie vykonalo asi automaticky po spustení aplikácie a uloženie po ukončení, pre názornosť si to však ponecháme na tlačidlách. Metóda tlačidla "Načítať" teda vyzerá 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."); } }
Teraz spracujeme kliknutie na listUzivatelu
, ktoré vykoná
zobrazenie detailu užívateľa do pripravených labelov:
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 sme opodmínkovali pre prípad, že by nebol žiadny užívateľ vybraný (list by bol prázdny).
Posledné tlačidlo bez metódy je Pridanie nového používateľa. Rozkliknite ho teda, vloženie bude veľmi jednoduché. Stačí užívateľa pridať do databázy a tá sa o všetko 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); }
Skúsime pridať nového používateľa:
Podobne by sme si mohli napísať aj mazanie užívateľov, ale to už nechám na vás.
Teraz musíme databázu nabindovať na list používateľov, aby sa s každou
zmenou databázy aktualizoval. To urobíme dodaním nasledujúce riadky do
konstruktoru MainJFrame
:
listUzivatelu.setModel(databaze.getModel());
Naša aplikácia je takmer hotová, ešte sa zamyslíme nad tým, čo sa
stane, keď niekto do mena vloží bodkočiarka. Aplikácia sa rozbije. Preto
budeme v metóde uloz()
bodkočiarkami z mena odstraňovať. Keby
sme robili aplikáciu, kde by sme ich potrebovali (čo sa nestáva príliš
často), môžeme vybrať iný zástupný znak. Ak by sme chceli byť dokonalí,
vložíme takú hodnotu sa bodkočiarkou do úvodzoviek. Potom sa však už
nejde o jednoduché CSV a metóda split()
nám prestane stačiť.
Ďalej by sa to samozrejme dalo riešiť iným formátom. My si teda
bodkočiarkami iba odstráňme, presnejšie ich nahradíme medzerami zmenou
jediného riadku v metóde uloz()
:
String[] hodnoty = {u.getJmeno().replace(";", " "), String.valueOf(u.getVek()), u.getRegistrovan().toString()};
A sme hotoví. Ak vám niečo nešlo úplne hladko, hotový projekt máte ako vždy v prílohe aj so zdrojovým kódom. V budúcej lekcii, Riešené úlohy k 1.-5. lekciu práca so súbormi v Jave , sa pozrieme na formát XML.
V nasledujúcom cvičení, Riešené úlohy k 1.-5. lekciu práca so súbormi v Jave, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 160x (9.47 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java