Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

7. diel - PRIPOMIENKOVÉ narodenín v JavaFX - Prepojenie vrstiev

V minulej lekcii, PRIPOMIENKOVÉ narodenín v JavaFX - Logická vrstva , sme dokončili základ logické vrstvy aplikácie. Dnes ju v Java tutoriálu prepojíme s formulárom a aplikáciu tak sprevádzkujeme.

Prepojenie prezentačné a logické vrstvy

Teraz máme dokončenú tzv. Prezentačné časť aplikácie (formulár) a logickú časť (triedy). Tieto 2 vrstvy sa v aplikácii striktne oddeľujú, pretože inak je kód veľmi neprehľadný. Nikdy by ste nemali vykonávať výpočty, zápisy do súborov, databázy a podobné veci priamo v kontroleru formulára! Vždy si vytvoríme triedu, ktorá poskytuje príslušné metódy a túto triedu z kontroléru iba používame. Logika zostane v triede. Trieda by naopak vôbec nemala vedieť o formulári. Nemala by teda napr. Zobrazovať chybové hlášky, ale iba vyhadzovať v prípade chyby výnimky. Je potom na formulári, aby užívateľovi chybu zobrazil. Práve formulár je tá časť aplikácie, ktorá s užívateľom komunikuje. Žiadna iná to nerobí.

Ak vás napadlo, že naše jednoduchá kalkulačka, ktorú sme vytvorili v prvých dieloch seriálu, bola návrhové zle, máte pravdu. Z dôvodu jednoduchosti sme napísali výpočty rovno do obslužnej metódy tlačidla. Správne by sme mali mať nejakú triedu, ktorá by výsledky počítala a tú by sme z formulára iba volali.

Ukážeme si teda, ako sa to robí správne.

Prepojenie prezentácie a logiky

Prejdeme do kontroléra formulára a triede pridáme privátne atribút typu SpravceOsob, v ktorom rovno vytvoríme inštanciu správcu:

private SpravceOsob spravceOsob = new SpravceOsob();

Inštancie správcu sa vytvorí pri vytvorení formulára a formulár s ňou ďalej bude komunikovať a tak vykonávať úkony, ktoré si želá užívateľ.

V metóde initialize () nastavíme dnesLabel na aktuálny dátum a ListView nastavíme položky na ObservableList zo správcu osôb. Odteraz bude ListView zobrazovať obsah ObservableListu a ak sa do listu niečo pridá, prejaví sa to aj v ListView. Pokiaľ sú v liste nejakej osoby, nastavíme vybranú položku ListView na prvý index.

@Override
public void initialize(URL url, ResourceBundle rb) {
    dnesLabel.setText(Datum.zformatuj(Calendar.getInstance()));
    osobyListView.setItems(spravceOsob.getOsoby());
    if (!spravceOsob.getOsoby().isEmpty())
        osobyListView.getSelectionModel().select(0);
}

Pridávanie a mazanie osôb

Aby sme niečo konečne tiež videli, prejdeme k pridávanie osôb. Prejdeme do pripravenej obslužné metódy dialógu, tá sa nachádza v metóde vytvorObsahDialogu(). Tu sa pokúsime vytvoriť a vrátiť osobu na základe údajov, ktoré užívateľ zadal. Ak sa niečo nepodarí, vypíšeme chybu. Iste ste sa už stretli s konštrukciou try-catch, ktorá umožňuje odchytiť vyvolané výnimky a nejako na tieto chyby reagovať namiesto toho, aby sme nechali aplikáciu spadnúť.

dialog.setResultConverter(new Callback<ButtonType, Osoba>() {
    @Override
    public Osoba call(ButtonType param) {
        try {
            Calendar narozeniny = Datum.naparsuj(datumTextField.getText());
            return new Osoba(jmenoTextField.getText(), narozeniny);
        } catch (ParseException | IllegalArgumentException ex) {
            System.out.println("Chyba: " + ex.getMessage());
            Alert alert = new Alert(AlertType.ERROR, "Osobu se nepodařilo naparsovat!");
            alert.showAndWait();
            return null;
        }
    }
});

Práve riadok:

return new Osoba(jmenoTextField.getText(), narozeniny);

Môže vyvolať výnimku, pretože výnimku priamo vyhadzujeme v konstruktoru osoby v prípade zlých údajov, môžete sa tam pozrieť. Ďalšie výnimku môže vyvolať aj parsovanie datumu, pretože do TextField môže užívateľ napísať prakticky čokoľvek a komponent pre dátum sme nepoužili. Kód, ktorý výnimku vyvoláva, umiestnime do bloku try. V bloku catch potom výnimku odchytíme a zobrazíme jej správu užívateľovi. Ak všetko prebehne hladko, program sa do bloku catch ani nedostane. Výnimky väčšinou vyvolávame v logických triedach a potom ich chytáme vo formulároch. Výnimky sú podrobnejšie opísané v článku Výnimky v Jave.

Chybovú hlášku vypíšeme do konzoly. Používateľovi zobrazíme pekný dialóg s informáciou, že sa osobu nepodarilo vytvoriť.

V tejto metóde sme skončili. Presunieme sa späť do obslužných metód tlačidiel Pridať a Odobrať a doplníme ich kód.

@FXML
public void handlePridatButtonAction(ActionEvent event) {
    Dialog<Osoba> dialog = new Dialog<>();
    dialog.setTitle("Nová osoba");
    dialog.setWidth(350);
    dialog.setHeight(250);

    vytvorObsahDialogu(dialog);
    final Optional<Osoba> vysledek = dialog.showAndWait();
    if (vysledek.isPresent()) {
        Osoba osoba = vysledek.get();
        spravceOsob.pridej(osoba);
    }
}

V obslužné metóde tlačidla pridatButton už vytvárame novú inštanciu dialógu. Osobu z dialógu si teraz aj načítame a ak tam nejaká je (užívateľ dialóg potvrdil tlačidlom OK a neodkřížkoval ho), pridáme osobu do správcu. Pretože používame ObservableList, zobrazí sa osoba ihneď aj v ListView na formulári.

Obslužná metóda tlačidla odebratButton bude vyzerať takto:

@FXML
public void handleOdebratButtonAction(ActionEvent event) {
    Osoba vybrana = osobyListView.getSelectionModel().getSelectedItem();
    if (vybrana != null) {
        spravceOsob.odeber(vybrana);
    }
}

Dôležitá je podmienka, ktorá zisťuje, či je v ListView vybraná nejaká položka. Ako vidíte, k vybranej položke sa dostaneme cez vlastnosť getSelectedItem na SelectionModelu. Túto osobu odovzdáme metóde odober na správcovi, ktorá ďalej vykoná fyzické odobratie z ObservableListu.

Aplikáciu si teraz môžete vyskúšať, už pôjde pridávať a odoberať osoby. Pridanej osoby sa ihneď objaví v ListView vďaka tomu, že používame ObservableList. ListView vždy zobrazuje to, čo vracia metóda toString () objektu. U osôb teda zobrazuje ich meno.

Pridávanie a odoberanie položiek v ListView v JavaFX - Okenné aplikácie v Java FX

V budúcej lekcii, Kvíz - Layouty, komponenty a pozíciovanie v JavaFX , doplníme logickú vrstvu aplikácie o ďalšie metódy a tým ju dokončíme.

V nasledujúcom kvíze, Kvíz - Layouty, komponenty a pozíciovanie v JavaFX, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

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

 

Predchádzajúci článok
PRIPOMIENKOVÉ narodenín v JavaFX - Logická vrstva
Všetky články v sekcii
Okenné aplikácie v Java FX
Preskočiť článok
(neodporúčame)
Kvíz - Layouty, komponenty a pozíciovanie v JavaFX
Č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