5. diel - PRIPOMIENKOVÉ narodenín v Java Swing - Logická vrstva
V minulom dieli seriálu tutoriálov o tvorbe formulárových aplikácií v Java Swing sme navrhli kompletne formuláre pre našu aplikáciu. V tomto dieli sa budeme zaoberať návrhom logické vrstvy, teda tried, ktoré obsahujú logiku aplikácie.
Dátum
Keďže práca s dátumom a časom je v Jave pomerne nepohodlná, pridajme si k projektu kratučkú statickú triedu, ktorá nám uľahčí prácu.
public class Datum { private static DateTimeFormatter formatData = DateTimeFormatter.ofPattern("d'.'M'.'y"); public static String zformatuj(LocalDateTime datum) { return datum.format(formatData); } public static LocalDate naparsuj(String datumText) throws ParseException { return LocalDate.parse(datumText, formatData); } }
Trieda obsahuje definíciu formátu dátumu. Ďalej disponuje dvoma metódami pre prevod medzi dátumom a jeho textovú podobou. Dátum môžeme načítať z textu (ako ho používateľ zadal) a alebo ho ako text napr. Vypísať.
Osoba
V našej aplikácii budú celkom iste figurovať osoby, vytvorme im teda triedu.
Vlastnosti
Osoba bude mať 2 vlastnosti: meno a narodeniny. Meno bude String, narodeniny budú typu LOCALDATE. Obe vlastnosti implementujeme ako privátne atribúty a vygenerujeme k nim Getter:
public class Osoba { private String jmeno; private LocalDate narozeniny; public String getJmeno() { return jmeno; } public LocalDate getNarozeniny() { return narozeniny; } }
Metódy
Osoba bude mať niekoľko metód, teraz sa však obmedzme iba na jej konštruktor, aby sme našu aplikáciu čo najskôr dostali do spustiteľné podoby. Neskôr ju doplníme. Do triedy teda pridáme parametrický konštruktor.
Konštruktor
Okrem nastavenia vlastností inštancie bude mať konštruktor tiež za úlohu tieto vlastnosti zvalidovat. Ukážme si jeho kód:
public Osoba(String jmeno, LocalDate narozeniny) throws IllegalArgumentException { if (jmeno.length() < 3) { throw new IllegalArgumentException("Jméno je příliš krátké"); } if (narozeniny.isAfter(LocalDate.now())) { throw new IllegalArgumentException("Datum narození nesmí být v budoucnosti"); } this.jmeno = jmeno; this.narozeniny = narozeniny; }
Najprv overíme, či nie je meno príliš krátke alebo či nie sú zadané narodeniny v budúcnosti. Ak niektorá zo situácií nastane, vyhodíme výnimku IllegalArgumentException a do jej konstruktoru vložíme správu pre používateľov.
Ak ste s výnimkami ešte nepracovali, vôbec to nevadí. Stačí vám vedieť, že je to spôsob, akým sa v objektových aplikáciách pracuje s chybami, najmä tými, ktoré sú spôsobené zadaním zlé hodnoty od užívateľa alebo ktoré vznikli pri práci so súbormi. Vyvolanie výnimky metódu okamžite ukončí. Ako na výnimku reagovať si ukážeme ďalej v seriáli. Výnimky budeme vždy vyhadzovať v logických triedach.
ToString ()
Keďže budeme osoby vypisovať, prepíšeme metódu toString () tak, aby vracala meno osoby:
@Override public String toString() { return jmeno; }
Práve táto metóda je neskôr použitá JListem k výpisu jeho položiek.
Správca osôb
Posledné logickú komponentom aplikácia bude správca osôb. Trieda sa bude starať o osoby, bude ich vedieť pridávať, odoberať a ich zoznam ukladať do súboru a opätovne načítať. Konečne bude vedieť medzi osobami vyhľadať tú, ktorá má najbližšie narodeniny.
Pridajte si k projektu teda triedu SpravceOsob.
Atribúty
Jedinou vlastnosťou triedy je zoznam osôb. Zoznam je typu DefaultListModel. S touto kolekciou sme sa v seriáli ešte nestretli. Ide o špeciálny typ kolekcie, ktorý možno nastaviť ako zdroj údajov formulárovým komponentom. ListModel na sebe vie vyvolať udalosť zmeny v prípade, že sa zmení jeho obsah. Vďaka tomuto mechanizmu sa automaticky obnoví všetky komponenty na formulári, ktoré majú nastavený ako zdroj údajov práve tento ListModel. Asi si dokážete predstaviť, že obnovovať ručne desiatky komponentov na formulári v prípade zmeny môže byť veľmi neprehľadné. Akonáhle v našej aplikácii pridáme novú osobu, bude ihneď vidieť v zozname osôb bez toho aby sme ho obnovovali, obnoví sa sám. K DefaultListModelu vygenerujeme getter, ktorý premenujeme na getModel ():
Trieda zatiaľ vyzerá takto:
public class SpravceOsob { private DefaultListModel<Osoba> osoby = new DefaultListModel<>(); public ListModel getModel() { return osoby; } }
Metódy
Opäť do triedy vložme zatiaľ len tie najdôležitejšie metódy.
Pridajme () a odober ()
Metódy pre pridanie a odobratie osoby sú úplne triviálne:
public void pridej(Osoba osoba) { osoby.addElement(osoba); } public void odeber(Osoba osoba) { osoby.removeElement(osoba); }
GetOsoby ()
Keďže DefaultListModel postráda veľa dôležitých metód, pridáme správcovi metódu getOsoby (), ktorá vráti osoby v obyčajnom Liste. Môžeme teda získať ako model, tak list. Model na List prevedieme pomocou statickej triedy Collections.
public List<Osoba> getOsoby() { return Collections.list(osoby.elements()); }
Základ logické vrstvy máme hotový. Nabudúce si ukážeme, ako prepojiť logiku s formulárom a celú aplikáciu sprevádzkujeme.
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é 451x (19.58 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java