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.
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