© 2013 All rights reserved.
0

Java: JFormatedTextField pomocí MaskFormatter

A aplikacích psaných v javě často potřebujeme vytvářet textové pole, které bude obsahovat přesný formát řetězce. Pomocí MaskFormatter můžeme snadno vytvořit masku pro takový řetězec a implementovat ji do JFormatedTextField.

Možná jste již narazily na problém, kdy potřebujete daný JTextFieldu vytvořit tak, aby do něj šel zapsat pouze určitý formát textu. Mám na mysli striktně dané formáty jako jsou například telefonní čísla, PSČ, rodné čísla, nebo libovolný vámi vytvořený formát řetězce.

maskformatter

Takový problém lze řešit například přidáním FocusListeneru a kontrolou ve focusLost(FocusEvent i), ovšem tímto způsobem kontrolujete řetězec až po jeho napsání a uživateli je umožněno v průběhu psaní dělat nesmyslné překlepy.

Takováto základní pravidla pro řetězce umožňuje vytvářet java pomocí MaskFormatteru, ve kterém můžete přímo pro každé místo v řetězci určit o jaký se může jednat znak a který znak bude na daném místě povolený.

Nejprve se podívejte na tabulku, ve které je určeno kterými znaky můžete zastupovat pravidla ve vašem řetězci a vytvářet tak masky:

Znak   Význam Povoleno
# Libovolné číslo. 0-9
U Libovolný znak. Po napsání bude převeden na velké písmeno a-z, A-Z
L Libovolný znak. Po napsání bude převeden na malé písmeno a-z, A-Z
A Libovolný znak abecedy nebo číslo. 0-9, a-z, A-Z
? Libovolné písmeno. a-z, A-Z
* Libovolný znak Cokoli
H Hexadecimární čísla 0-9, a-f, A-F

Pomocí těchto speciálních znaků můžeme vytvářet masky, do kterých bude uživatel nucen psát pouze námi dané znaky.

Jednoduchá maska například pro rodné číslo by mohla vypadat následovně:

Nejprve si vytvoříme MaskFormatter, a ten přidáme do JFormattedTextFieldu. Takto vytvořený JFormattedTextField bude na první pohled vypadat podobně jako klasický JTextField, jenom s tím rozdílem, že do něj nebude možné psát písmena, ale pouze čísla.

Navíc bude obsahovat lomítko, které jsme do masky přidali. Po napsání prvních 6 číslic se kurzor automaticky přesune za lomítko a zde bude psaní pokračovat dalšími 4 číslicemi.

Pomocí speciálních znaků tak můžete přehledně vytvořit libovolnou masku a uživatele donutit dodržovat přesný formát.

Ještě uvedu dve užitečné funkce, které se vám budou hodit při úpravě formátu textového pole a pro upřesnění masky:

SetPlaceholderCharacter

Funkce SetPlaceholderCharacter určuje, kterým znakem budou vyplněna volné místa namísto znaků po načtení formuláře.

Pomocí této funkce můžeme například určit, aby nevyplněné pole obsahovalo namísto prázdných mezer podtržítka. Použití je velmi jednoduché:

setValidCharacters

Pomocí setValidCharacters můžeme přímo určit, které znaky budou povolené. Takže kdybychom například věděli že v zadávaném rodném čísle, pro které jsme si připravili masku se nebude vyskytovat nula, a tím pádem bychom nechtěli aby ji bylo možné zadat, mohli bychom masku upravit takovýmto způsobem:

Tím určíme, že bude možné zadat pouze čísla od 1 do 9 a nikoli 0.

Závěrem

Použití MaskFormatteru je jednoduché a výsledná efekt je velmi pozitivní. Jeho použitím si můžete ušetřit základní kontroly formulářových textových polí a uživatele vyvarujete zbytečných překlepů a následných oprav.

Závěrem ještě uvedu ukázkový zdrojový kód, ve kterém jsou připraveny dvě masky a implementovány do dvou JFormattedTextFieldu včetně nastavení velikosti textového pole:

Comments are closed for this page

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836