JFormattedTextField
Na maioria das aplicações é necessário que os campos sejam restritos a valores, numero de caracteres e/ou formatos específicos. Como fazer com que ao digitar uma data, o usuário complete o campo com as barras, ou em um campo de telefone, como obrigar o usuário da aplicação a informar todos os numeros no formato “(##) ####-####” ou qualquer outro desejado?
A resposta é simples: Usando JFormattedTextField.
Para exeplificar o uso desse componete iremos desenvolver uma mini aplicação que possui dois campos, cada um com uma mascara diferente.
>Primeiro vamos contruir um JFrame que vai conter os nossos campos.
>Ok! Agora que já temos um JFrame, vamos declarar os atributos da classe:
acabamos de criar quatro atributos sendo que cada campo tem o seu MaskFormatter correspondente. É importante observar que é possível usar o mesmo MaskFormatter para vários campos.
>Agora vamos ao construtor
Repare que as primeiras linhas estam inicializando os atributos. É importante passar os formatadores dos campos no construtor de cada um, caso contrario o texto não será formatado.
As linhas:
dizem quais são os caracter válidos para casa MaskFormatter.
As demais linhas saem do escopo deste tutorial (pressupõe-se que você já saiba as suas funções no código)
Para testar o código temos o método main a seguir:
[/list]
[b]Leia também:[/b]
[url=http://javafree.uol.com.br/artigo/871500/Criando-uma-Janela-Swing.html]Criando uma Janela Swing[/url]
[url=http://javafree.uol.com.br/artigo/871501/Mergulhando-no-SwingX.html]Mergulhando no SwingX[/url]
[url=http://javafree.uol.com.br/artigo/872280/NetBeans-65-jtree-treeModel-e-defaultMutableTreeNode.html]NetBeans 6.5, jtree - treeModel e defaultMutableTreeNode[/url]
[url=http://javafree.uol.com.br/artigo/5792/Tudo-sobre-o-GridBagLayout.html]Tudo sobre o GridBagLayout.[/url]
import javax.swing.JFrame;
public class TextFieldComMascara extends JFrame {
}import javax.swing.JFrame;
import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;
private JFormattedTextField telefone;//campo para telefone
private JFormattedTextField data;//campo para data
private MaskFormatter ftmTelefone;//Atributo formatador para telefone
private MaskFormatter ftmData;//Atributo formatador para data
public class TextFieldComMascara extends JFrame {
}
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;
import java.text.ParseException;
private JFormattedTextField telefone;//campo para telefone
private JFormattedTextField data;//campo para data
private MaskFormatter ftmTelefone;//Atributo formatador para telefone
private MaskFormatter ftmData;//Atributo formatador para data
public class TextFieldComMascara extends JFrame {
public TextFieldComMascara()throws ParseException{
ftmTelefone = new MaskFormatter("####-####");
ftmData = new MaskFormatter("##/##/####");
telefone = new JFormattedTextField(ftmTelefone);
data = new JFormattedTextField(ftmData);
ftmTelefone.setValidCharacters("0123456789");
ftmData.setValidCharacters("0123456789");
telefone.setColumns(6);
data.setColumns(6);
add(telefone);
add(data);
setLayout(new FlowLayout());
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(200, 200);
setVisible(true);
}
}ftmTelefone.setValidCharacters("0123456789");
ftmData.setValidCharacters("0123456789");public static void main(String[] args) {
try {
TextFieldComMascara teste = new TextFieldComMascara();
}catch (ParseException e) {
e.printStackTrace();
}
}João Silva
Curtidas 0
Respostas
José Moreira
09/04/2009
muito bom mesmo esse tutorial. Simples e didático.
Só a linha add(imprime) que não existe né... :!:
GOSTEI 0
João Silva
09/04/2009
Corrigido, ficou da faze de testes hehhe, obrigado pelo comentario
GOSTEI 0
Luiz Neri
09/04/2009
Quando for apenas caracteres, considerando os 3 casos: apenas minúsculas, apenas maiúsculas, ou ambos. Eu devo sair especificando abcde...uvxzABCDE...UVXZ no método setValidCharacters()? ou existe uma maneira mais simples de se fazer isso?
Muito bom o tutorial btw.
GOSTEI 0
João Silva
09/04/2009
No caso de ser, somente letras maiusculas use:
No caso de ser, somente letras minusculas use:
Nos dois casos anteriores não declare os caractere válidos
No caso de ser, somente letras minusculas ou maiusculas use: mas atenção, neste ultimo caso o campo tb aceita numeros, se precisar que isso não aconteça, diga quais são os numeros que não podem ser digitados, por exemplo:
new MaskFormatter("UUUUUUU");new MaskFormatter("LLLLLLLL");new MaskFormatter("AAAAAAAA");fmt.setInvalidCharacters("0123456789");GOSTEI 0
João Silva
09/04/2009
qualquer outra duvida eu vou respondendo, na medida do possivel
GOSTEI 0
João Massan
09/04/2009
Como eu faria pra obter os números de um campo JFormattedTextField sem a máscara?
Por exemplo, um campo CPF formatado seria:
Como eu devo proceder para recuperar somente:
???
123.456.789.10
12345678910
GOSTEI 0
João Silva
09/04/2009
Recupere a String do campo e use o método replace(".", "")
EX:
String strSemPontos = seuCampo.getText().replace(".", "")
GOSTEI 0
João Massan
09/04/2009
[quote="kikostyle"]Recupere a String do campo e use o método replace(".", "")
EX:
Mas o JFormattedTextField (ou alguma outra classe) não oferece nenhum método que retorne o valor sem a máscara?
Porque no caso do CPF é fácil, já que o único caracter diferente é o ".". Porém, e se o campo fosse, por exemplo, o telefone, em que atuariam caracteres como "(" ")" (barras), "-" (hífens) e " " (espaços em branco), como ficaria?
String strSemPontos = seuCampo.getText().replace(".", "")
GOSTEI 0
João Silva
09/04/2009
Vc também pode usar o método setValueContainsLiteralCharacters do seu MaskFormater
Ex:
seuObjetoFormatador.setValueContainsLiteralCharacters(false);
GOSTEI 0
Paduan
09/04/2009
Muito bom o tutorial, mas tenho uma dúvida: Como faço para converter o valor obtido desse campo telefone - por exemplo - que utiliza o jformattedtextfield para int? Estou desenvolvendo uma aplicação e esbarrei nesse problema...
Obrigado e []´s!
GOSTEI 0
João Massan
09/04/2009
[quote="paduan"]Muito bom o tutorial, mas tenho uma dúvida: Como faço para converter o valor obtido desse campo telefone - por exemplo - que utiliza o jformattedtextfield para int? Estou desenvolvendo uma aplicação e esbarrei nesse problema...
Obrigado e []´s!
Bem, eu ainda acho que deve existir uma classe com métodos que permitam resgatar somente os valores de um JFormattedTextField sem as máscaras. Mas, enquanto não descobrirmos, para resolver o seu problema, você pode fazer o seguinte:
1. Crie uma String e atribua a ela o valor do JFormattedTextField (String aux = formattedTextField.getText())
2. Retire os caracteres especiais da String, como pontos, vírgulas, hífens, parenteses, etc. (use a dica que o cara deu acima, com o método replace, enquanto não descobrimos uma forma melhor)
3. Converta a String para int: int i = Integer.parseInt(String);
GOSTEI 0
Alessandro
09/04/2009
Jaumzera,
A classe java.lang.String possui o método split() e usa espressão regular. É bem fácil e interessante.
Exemplo tirado da revista Mundo Java, 24.
Depois é só montar a string como quiser. Tem várias maneiras para isso.
Vlw!
String text = "A&Revista57Mundo#Java@é.nota_10-";
String[] values = text.split("[1-9-&_.:#@]+");
GOSTEI 0
João Massan
09/04/2009
[quote="Wrapper"]Jaumzera,
A classe java.lang.String possui o método split() e usa espressão regular. É bem fácil e interessante.
Exemplo tirado da revista Mundo Java, 24.
Depois é só montar a string como quiser. Tem várias maneiras para isso.
Vlw!
Opa!
Aí sim hein!?
Valeu cara! =)
String text = "A&Revista57Mundo#Java@é.nota_10-";
String[] values = text.split("[1-9-&_.:#@]+");
GOSTEI 0
Rodrigo Silva
09/04/2009
olá!
no caso de números, qual seria a forma correta de um jformattedfield?
tipo, um campo onde pode ser inserido 10, 500, 1.500, 1.598.000...
sempre que o valor passar de 1.000, ele colocasse o ponto separador de milhar!
como fazer? :smile:
GOSTEI 0
Diogo Souza
09/04/2009
http://javafree.uol.com.br/topic-14582-JTextField-p-numeros.html
vlew:!:
GOSTEI 0
Tales Nascimento
09/04/2009
Se eu criar um JFormattedTextField para armazenar placas de carros, como eu posso definir que os 3 primeiros caracteres serão letras e os 4 últimos serão números?
GOSTEI 0
Luiz Gustavo
09/04/2009
Ótimo tutorial.
GOSTEI 0