Zadanie dátumu pomocou Kalendára v JavaFX
V minulej lekcii, Grafické hodiny v JavaFX - Návrh formulára , sme navrhli formulár pre analógové hodiny v JavaFX a pripravili si základ logickej triedy na vykreslenie ručičiek na Pane.
Poznámka na úvod: Podstatné meno dátum úmyselne skloňuje nespisovne podľa mužského vzoru, tj. Dátum, dátumu, dátumom, apod. Ide mi vylúčenie prípadnej zámeny so slovom dáta (v zmysle súbor dátových údajov).
Dátum je jeden z najdôležitejších dátových typov používaných pri vývoji a prevádzke aplikácie. Presné a príjemné zadanie posilňuje "positive user feeling".
Možností ako "pokaziť" dátum je celé rad - nesprávny oddeľovač, nesprávna hodnota dňa (závisí na hodnote mesiace - január má 31 dní, február 28 až 29 dní, marec 31 dní, ...), nesprávna hodnota mesiaca, 29. februára je len v priestupnom roku, atď.
Kalendár
Výhodnejšie je vybrať požadovaný dátum z grafického Kalendáre. To by užívateľovi uľahčilo zadávanie a spríjemnilo prácu. Ak by požadoval zadanie bez pomoci Kalendáre (napríklad účtovná, ktorá raketovým tempom "napcháva" aplikácii novými účtovnými dokladmi), tak bez problémov môže. Len nevyužije ponúkanú možnosť (kontrola na správnosť zadaného dátumu sa vykonáva vždy). Táto možnosť je dnes v aplikáciách veľmi často rozšírená. Ako tento nástroj zakomponovať do Java aplikácie?
Java má od verzie 8 novú triedu pre prácu dátumom: LOCALDATE (o novom API pre prácu s časom si môžete prečítať v tomto článku). Dobre s ňou spolupracuje trieda DataPicker (JavaFX UI Controls - Kalendár je v tejto triede implementovaný). Jej metóda getvalue () vracia užívateľom vybraný dátum typu LOCALDATE. Zodpovedá štandardu ISO-8601 (bez časovej zóny). Jedná sa vlastne o Gregoriánsky kalendár proleptický (definovaný aj pre dátumy pred jeho uvedením roka 1582).
Pre zobrazenie kalendára je nutné mať správne nastavený Locale - trieda pre nastavenie geografických, politických a kultúrnych špecifík regiónu. Nastavenie regiónu môže byť kritickú zložkou vývoja v prípade, že píšete aplikáciu pre medzinárodné prostredie (internationalization of application). Môže ísť napríklad o podnik, kde robotníci a stredné managent sú Česi. Vrcholový manažment sú Američené, Nemci, Francúzi, apod. Ani Číňania už nie sú výnimkou. V týchto prípadoch musíte byť schopní nastaviť aplikáciu tak, aby pre určitý okruh užívateľov pracovala v ich materinskom jazyku. Región sa nastavuje statickou metódou setdefault (newLocale). Regiónu zodpovedá vstupný parameter newLocale. Je možné ho zadať ako konštantu alebo LanguageTag
Konštanta
NetBeans Vám ich po stlačení Ctrl + Space ponúkne celý rad. Uvediem len pár príkladov:
Locale.setDefault (Locale.US);
Locale.setDefault (Locale.UK);
Locale.setDefault (Locale.PRC);
(People Republic China)
U nastavenie Locale.US si dovolím upozorniť na skutočnosť, že v prvý deň týždňa je Nedeľa a posledným Sobota. Druhou odlišnosťou oproti európskym kalendárom (napríklad Locale.UK) je postupnosť ktorou sa dátum číta. Na prvej pozícii je mesiac, náleduje deň a obedňajšiu je rok.
LanguageTag
Použitie jazykového tagu je nutné v prípade, keď požadovaný región nie je v okruhu bežne používaných konštánt, kam patrí aj Čeština. Zoznam všetkých LanguageTags môžete nájsť na oficiálnych webových stránkach
Ľahko zistíme náš LangugeTag: "cz-CS". Nastavenie češtiny je potom:
Locale.setDefault(Locale.forLanguageTag("cs-CZ"));
Výhodou LanguageTag je, že s ním môžeme nastaviť všetky mysliteľné regióny (napr. Aj Vietnam alebo Egypt):
Locale.setDefault (Locale.forLanguageTag ( "vi-VN"));
Locale.setDefault (Locale.forLanguageTag ( "ar-EG"));
Dosť rečí. Najlepšie učebnice programátora je komentovaný zdrojový kód. Uvediem tri príklady:
Príklad 1
Zadanie jedného dátumu cez DatePicker (obrázok 1) a jeho konverzia do reťazca prostredníctvom štyroch "formátovacie" (trieda DateTimeFormatter, viď obrázok 2). Kľúčová je trieda DatePicker. Ku sformátovanie použitej metódy format () - volá sa cez inštanciu triedy LOCALDATE. Nasledujúce 2 obrázky zobrazujú žiadané správanie programového kódu.
Obrázok 1: Zadanie dátumu prostredníctvom Kalendáre
Jednotlivé formáty sa od seba líšia nasledovne. Praktická ukážka je na Obrázku 2
- Short: deň, mesiac: každý 1-2 pozície, rok má 2 pozície
- Medium: deň, mesiac: každý 1-2 pozície, rok má 4 pozície
- Long: navyše mesiac v písomnom tvare
- Full: navyše písomne vyjadrený dňa týždňa
Obrázok 2: Zobrazenie zvoleného dátumu štyrmi formátovacích (short, medium, long, full)
Nižšie uvádzam dve kľúčové sekvencie z programového kódu. Celý zdrojový kód je k stiahnutiu pod článkom.
1. Príklady typu DatePicker a jeji inicializácia aktuálne dátumom:
private DatePicker zadavacDatumu = null; zadavacDatumu = new DatePicker(LocalDate.now());
2. Formátovanie dátumov:
/** přeformátování do String přes metodu format() */ String rtzFull, rtzLong, rtzMedium, rtzShort; LocalDate zadaneDatum = zadavacDatumu.getValue(); // sejmutí hodnoty datumu rtzFull = "FULL:"+zadaneDatum.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)); rtzLong = "LONG:"+zadaneDatum.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)); rtzMedium = "MEDIUM:"+zadaneDatum.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)); rtzShort = "SHORT:"+zadaneDatum.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT));
Príklad 2
Zadanie časového obdobia a vypísanie jeho dĺžky na obrazovke (pozri Obrázok 3). Súčasťou zadania je aj stráženie postupnosti dátumov. Ide o to aby nebola zadaná záporná dĺžka trvania obdobia. Inými slovami: druhý dátum musí mať hodnotu po prvom dátumu (teda vyšší). Inicializačný dĺžka obdobia je týždeň (week, 7 dní).
Obrázok 3: Úvodná obrazovka zadania dĺžky obdobia.
Užívateľ vyberá Začiatok obdobia a Koniec obdobia. Nastavuje tým dĺžku obdobia. Aplikácia stráži, aby užívateľ nemal možnosť zvoliť dátumy, ktoré by vytvorili "zápornú dĺžku trvania" obdobia. Nižšie sú uvedené obrázky znázorňujúce zakázané dátumy (sú podfarbené ružovo) pri výbere počiatočného a koncového dátumu.
Obrázok 4. Vľavo: Zákaz dátumov pred 11.8.2015. Vpravo: Zákaz dátumov po 18.8.2015.
Vylúčenie niektorých dátumov zaisťujú inštancie dayCellFactoryKonec a dayCellFactoryZacatek, ktoré využívajú interface Callback. Kľúčovými sú metódy:
setDisable (true) - "chráni" bunku dátumu pred zvolením od užívateľa setStyle ( "- fx-background-color: # ffc0cb;") - nastavuje ružové podfarbenie "disable" bunky dátumu
Metóda setDayCellFactory () prepája Príklady typu Callback (dayCellFactoryKonec, dayCellFactoryZacatek) s inštanciami typu DatePicker (zadavacDatumuPocatek, zadavacDatumuKonec). Jej vstupným parametrom je výskyt typu CallBack (dayCellFactoryKonec a dayCellFactoryZacatek).
Príklad 3
Tento príklad je najjednoduchšie. Demonštruje, ako sa dá v kaledár zapnúť (vypnúť) zobrazenie čísla týždňa v roku. Túto vlastnosť možno nastaviť metódou setShowWeekNumbers (boolean). Metóda sa volá cez inštanciu triedy DatePicker. V našom prípade:
zadavacDatumu = new DatePicker(LocalDate.now()); zadavacDatumu.setShowWeekNumbers(false); // vypnutí zobrazování čísla týdne zadavacDatumu.setShowWeekNumbers(true); // zapnutí zobrazování čísla týdne
Kalendár pri zapnutom zobrazovaní potom vyzerá nasledovne (čísla týždňov sú v prvom stĺpci modro):
Obrázok 5: Kalendár so zapnutým zobrazovaním čísla týždňa
V článku som využil informácie z dokumentácie pre Java 8.
V budúcej lekcii, Grafické hodiny v JavaFX - Obsluha formulára , dokončíme aplikáciu Grafických hodín. Pridáme digitálnu a kombinovanú formu hodín a naučíme sa medzi nimi prepínať pomocou formulára.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 127x (329.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java