NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Lekce 6 - Upomínač narozenin v JavaFX - Logická vrstva

V předchozím kvízu, Kvíz - Layouty, komponenty a pozicování v JavaFX, jsme si ověřili nabyté zkušenosti z předchozích lekcí.

V tomto díle JavaFX tutoriálu se budeme zabývat návrhem logické vrstvy, tedy tříd, které obsahují logiku aplikace. Vytvoříme si třídu pro práci s datem, která bude obsahovat statické metody pro jeho formátování a parsování. Dále si doplníme dříve založenou třídu Osoba a přidáme třídu SpravceOsob, která bude osoby obsluhovat. Zatím ji implementujeme metody pro přidání dané osoby do seznamu a její odebrání.

Třída Datum

Přidejme si k projektu kratičkou statickou třídu, která nám ulehčí práci s datem:

public class Datum {

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

    public static String zformatuj(LocalDate datum) {
        return datum.format(dtf);
    }

    public static LocalDate naparsuj(String datumText) throws DateTimeParseException {
        return LocalDate.from(dtf.parse(datumText));
    }
}

Třída obsahuje definici formátu data. Dvě statické metody převádí mezi datem a jeho textovou podobou. Datum můžeme načíst z textu, jak ho uživatel zadal, nebo ho můžeme jako text např. vypsat.

Třída Osoba

V naší aplikaci budou zcela jistě figurovat osoby, třídu jsme jim již vytvořili. Pojďme jí dodat implementaci.

Přidání vlastností a getterů

Osoba bude mít dvě vlastnosti: jméno a narozeniny. Vlastnost jmeno bude typu String, narozeniny budou typu LocalDate. Obě vlastnosti implementujeme jako privátní atributy a vygenerujeme k nim gettery:

public class Osoba
{
    private String jmeno;
    private LocalDate narozeniny;

    public String getJmeno() {
        return jmeno;
    }

    public LocalDate getNarozeniny() {
        return narozeniny;
    }

}

Konstruktor třídy Osoba

Osoba bude mít několik metod, nyní se však omezme pouze na její konstruktor, abychom naši aplikaci co nejdříve dostali do spustitelné podoby. Později další metody do třídy doplníme. Nyní jí tedy přidáme pouze parametrický konstruktor. Kromě nastavení vlastností instance, bude mít konstruktor také za úkol tyto vlastnosti zvalidovat. Ukažme si jeho kód, vzápětí si jej popíšeme:

public Osoba(String jmeno, LocalDate narozeniny) {
    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;
}

Nejprve ověříme, zda není jméno příliš krátké a zda nejsou zadané narozeniny v budoucnosti. Pokud některá ze situací nastane, vyhodíme výjimku IllegalArgumentException a do jejího konstruktoru vložíme zprávu pro uživatele.

Pokud jste s výjimkami ještě nepracovali, vůbec to nevadí. Stačí vám vědět, že je to způsob, jakým se v objektových aplikacích pracuje s chybami, zejména těmi, které jsou způsobené zadáním špatné hodnoty od uživatele nebo které vznikly při práci se soubory.

Vyvolání výjimky metodu okamžitě ukončí. Jak na výjimku reagovat si ukážeme dále v seriálu. Výjimky budeme vždy vyhazovat v logických třídách.

Přepis metody toString()

Jelikož budeme osoby vypisovat, přepíšeme metodu toString() tak, aby vracela jméno osoby:

@Override
public String toString()
{
    return jmeno;
}

Právě tuto metodu později použijeme v ListView k výpisu jeho položek.

Správce osob

Poslední logickou komponentou aplikace bude správce osob. Přidejme si k projektu tedy třídu SpravceOsob.

Třída se bude starat o osoby, bude je umět přidávat, odebírat a jejich seznam ukládat do souboru a opětovně načíst. Konečně bude umět mezi osobami vyhledat tu, která má nejbližší narozeniny.

Atributy třídy SpravceOsob

Jedinou vlastností třídy je seznam osob. Seznam je privátní kolekcí typu ObservableList. S touto kolekcí jsme se v seriálu již setkali. Díky tomu, že budeme mít osoby právě v této kolekci, docílíme automatického obnovení všech komponent na formulářích, které s touto kolekcí pracují. Jakmile tedy např. přidáme novou osobu do seznamu typu ObservableList, objeví se i v ListView.

Této technice se říká binding a již víme, že nám ušetří spoustu práce s ručním obnovováním formuláře.

Třída zatím vypadá takto:

public class SpravceOsob {

    private ObservableList<Osoba> osoby = FXCollections.observableArrayList();

    public ObservableList<Osoba> getOsoby() {
        return osoby;
    }
}

Našemu seznamu osoby jsme zároveň doplnili getter.

Metody pridej() a odeber()

Opět do třídy vložme zatím jen ty nejdůležitější metody. Metody pro přidání a odebrání osoby jsou naprosto triviální:

public void pridej(Osoba osoba) {
    osoby.add(osoba);
}

public void odeber(Osoba osoba) {
    osoby.remove(osoba);
}

Tím máme základ logické vrstvy hotový. Pokračovat budeme příště.

V příští lekci, Upomínač narozenin v JavaFX - Propojení vrstev, si ukážeme, jak propojit logiku s formulářem a celou aplikaci zprovozníme.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 339x (10.42 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Kvíz - Layouty, komponenty a pozicování v JavaFX
Všechny články v sekci
Java FX - Okenní aplikace
Přeskočit článek
(nedoporučujeme)
Upomínač narozenin v JavaFX - Propojení vrstev
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
24 hlasů
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 se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity