GARANTIR DESCONTO

Fórum JFormattedTextField #566158

09/04/2009

0

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.
import javax.swing.JFrame;

public class TextFieldComMascara extends JFrame {

}
>Ok! Agora que já temos um JFrame, vamos declarar os atributos da classe:
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 {

}
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
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);
	}

}
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:
ftmTelefone.setValidCharacters("0123456789");
ftmData.setValidCharacters("0123456789");
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:
public static void main(String[] args) {
	try {
		TextFieldComMascara teste = new TextFieldComMascara();	
	}catch (ParseException e) {
		e.printStackTrace();
	}
}
[/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]
João Silva

João Silva

Responder

Posts

09/04/2009

José Moreira

muito bom mesmo esse tutorial. Simples e didático. Só a linha add(imprime) que não existe né... :!:
Responder

Gostei + 0

09/04/2009

João Silva

Corrigido, ficou da faze de testes hehhe, obrigado pelo comentario
Responder

Gostei + 0

09/04/2009

Luiz Neri

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

Gostei + 0

09/04/2009

João Silva

No caso de ser, somente letras maiusculas use:
 new MaskFormatter("UUUUUUU");
No caso de ser, somente letras minusculas use:
new MaskFormatter("LLLLLLLL");
Nos dois casos anteriores não declare os caractere válidos No caso de ser, somente letras minusculas ou maiusculas use:
new MaskFormatter("AAAAAAAA");
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:
fmt.setInvalidCharacters("0123456789");
Responder

Gostei + 0

09/04/2009

João Silva

qualquer outra duvida eu vou respondendo, na medida do possivel
Responder

Gostei + 0

09/04/2009

João Massan

Como eu faria pra obter os números de um campo JFormattedTextField sem a máscara? Por exemplo, um campo CPF formatado seria:
123.456.789.10
Como eu devo proceder para recuperar somente:
12345678910
???
Responder

Gostei + 0

09/04/2009

João Silva

Recupere a String do campo e use o método replace(".", "") EX:

String strSemPontos = seuCampo.getText().replace(".", "")

Responder

Gostei + 0

09/04/2009

João Massan

[quote="kikostyle"]Recupere a String do campo e use o método replace(".", "") EX:

String strSemPontos = seuCampo.getText().replace(".", "")

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?
Responder

Gostei + 0

09/04/2009

João Silva

Vc também pode usar o método setValueContainsLiteralCharacters do seu MaskFormater Ex:
seuObjetoFormatador.setValueContainsLiteralCharacters(false);
Responder

Gostei + 0

09/04/2009

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!
Responder

Gostei + 0

09/04/2009

João Massan

[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);
Responder

Gostei + 0

09/04/2009

Alessandro

Jaumzera, A classe java.lang.String possui o método split() e usa espressão regular. É bem fácil e interessante.
String text = "A&Revista57Mundo#Java@é.nota_10-";
String[] values = text.split("[1-9-&_.:#@]+");
Exemplo tirado da revista Mundo Java, 24. Depois é só montar a string como quiser. Tem várias maneiras para isso. Vlw!
Responder

Gostei + 0

09/04/2009

João Massan

[quote="Wrapper"]Jaumzera, A classe java.lang.String possui o método split() e usa espressão regular. É bem fácil e interessante.
String text = "A&Revista57Mundo#Java@é.nota_10-";
String[] values = text.split("[1-9-&_.:#@]+");
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! =)
Responder

Gostei + 0

09/04/2009

Rodrigo Silva

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:
Responder

Gostei + 0

17/01/2010

Diogo Souza

http://javafree.uol.com.br/topic-14582-JTextField-p-numeros.html vlew:!:
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar