Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 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á 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é 447x (19.58 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
PRIPOMIENKOVÉ narodenín v Java Swing - Návrh formulárov
Všetky články v sekcii
Základy Java Swing
Preskočiť článok
(neodporúčame)
PRIPOMIENKOVÉ narodenín v Java Swing - Prepojenie vrstiev
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti 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