Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP
Discount week - April - 30

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

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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 IllegalArgumen­tException 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.


 

Mala 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é 331x (179.33 kB)
Aplikácia je vrátane zdrojových kódov v jazyku java

 

Predchádzajúci článok
PRIPOMIENKOVÉ narodenín v JavaFX - Formuláre druhýkrát
Všetky články v sekcii
Okenné aplikácie v Java FX
Článok pre vás napísal David Čápka
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity (1)

 

 

Komentáre

Avatar
David J.
Člen
Avatar
David J.:16.9.2017 15:11

Chtěl bych se zeptat, bude tutoriál aktualizovaný na používání třídy LocalDateTime, která byla doporučena v OOP tutoriálu?

 
Odpovedať
16.9.2017 15:11
Avatar
Adam Bucher
Člen
Avatar
Odpovedá na David J.
Adam Bucher:19.9.2017 19:05

To zvládneš sám :). Já, když si teď tento tutoriál procházím, místo Calendar používám LocalDate (doufám, že se tam někde nebude pracovat i s časem, to bych to musel celé předělávat na LocalDateTime :D).

 
Odpovedať
19.9.2017 19:05
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Mirka Baranová:5.3.2018 21:06

Třída Datum s využitím LocalDate může vypadat takto:

private static DateTimeFormatter zformatovany = DateTimeFormatter.ofPattern("d.M.yyyy");

public static String zformatuj(LocalDate datum) {
    String datumText = datum.format(zformatovany);
    return datumText;
}

public static LocalDate naparsuj(String datumText) {
    LocalDate datum = LocalDate.parse(datumText, zformatovany);
    return datum;
}

A konstruktor ve třídě Osoba takto:

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("Narozeniny nesmí být v budoucnosti.");
        }

        this.jmeno = jmeno;
        this.narozeniny = narozeniny;
    }

Úprava dalších částí z Calendar na LocalDate je určitě jasná.

Odpovedať
5.3.2018 21:06
Pro člověka, který je plný touhy, není nic nemožné.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 3 správy z 3.