6. diel - PRIPOMIENKOVÉ narodenín v JavaFX - Logická vrstva
V minulej lekcii, PRIPOMIENKOVÉ narodenín v JavaFX - Formuláre druhýkrát , sme navrhli formulár pre našu aplikáciu. V tomto tutoriále 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 DateFormat formatData = new SimpleDateFormat("d.M.yyyy"); public static void nastavPulnoc(Calendar datum) { datum.set(Calendar.HOUR_OF_DAY, 0); datum.set(Calendar.MINUTE, 0); datum.set(Calendar.SECOND, 0); datum.set(Calendar.MILLISECOND, 0); } public static String zformatuj(Calendar datum) { String datumText = formatData.format(datum.getTime()); return datumText; } public static Calendar naparsuj(String datumText) throws ParseException { Calendar datum = Calendar.getInstance(); datum.setTime(formatData.parse(datumText)); return datum; } }
Trieda obsahuje definíciu formátu dátumu. Ďalej vie určitý dátum nastaviť na polnoc (teda vynulovať čas a dátum ponechať). To sa nám veľmi hodí pri výpočtoch, pretože často budeme chcieť počítať s celými dňami a čas by nám mohol výpočty rohodit).
Ďalšie dve metódy prevádza 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, triedu sme im už vytvorili. Poďme jej dodať implementáciu.
Vlastnosti
Osoba bude mať 2 vlastnosti: meno a narodeniny. Meno bude String, narodeniny budú typu Calendar. Obe vlastnosti implementujeme ako privátne atribúty a vygenerujeme k nim Getter:
public class Osoba { private String jmeno; private Calendar narozeniny; public String getJmeno() { return jmeno; } public Calendar 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, Calendar narozeniny) throws IllegalArgumentException { Datum.nastavPulnoc(narozeniny); if (jmeno.length() < 3) throw new IllegalArgumentException("Jméno je příliš krátké"); if (narozeniny.after(Calendar.getInstance())) throw new IllegalArgumentException("Datum narození nesmí být v budoucnosti"); this.jmeno = jmeno; this.narozeniny = narozeniny; }
Najprv vynulujeme čas narodenín, aby nám nerobil pri výpočtoch problémy, pracovať budeme iba s celými dňami. Následne 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á ListView 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 ObservableList. S touto kolekciou sme sa v seriáli už stretli. Vďaka tomu, že budeme mať osoby práve v tejto kolekcii, docielime automatického obnovenia všetkých komponentov na formulári, ktoré s touto kolekciou pracujú. Akonáhle teda napr. Pridáme novú osobu do ObservableListu, objaví sa aj v ListView. Tejto technike sa hovorí binding a už vieme, že nám ušetrí veľa práce s ručným obnovovaním formulára. K ObservableListu vygenerujeme getter:
Trieda zatiaľ vyzerá takto:
public class SpravceOsob { private ObservableList<Osoba> osoby = FXCollections.observableArrayList(); public ObservableList<Osoba> getOsoby() { 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.add(osoba); } public void odeber(Osoba osoba) { osoby.remove(osoba); }
Základ logické vrstvy máme hotový. V budúcej lekcii, PRIPOMIENKOVÉ narodenín v JavaFX - Prepojenie vrstiev , 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é 339x (10.42 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java