Campos com máscara

17 respostas
M

Olá,

Estou desenvolvendo uma aplicação com SWING e tenho tido dificuldades em oferecer um campo para entrada de valores pré-formatados ( datas, cep, valores monetários etc … ) . Estou tentando usar JFormattedTextField , mas tenho achado bastante trabalhoso.

Alguém tem alguma dica que possa me ajudar ??? Vale apena tentar em SWT ???

Obrigado,

Márcio

17 Respostas

R

Voce ja leu o tutorial do GUJ sobre o assunto?

Rafael

M

Rafael ,

Obrigado pela dica, mas o tutorial não ensina a criar campos com máscara. Gostaria de colocar um campo CEP com máscara igual a “#####-###”.

De qualquer forma obrigado,

Márcio

T

O código para um JFormattedTextField poderia ser assim:

MaskFormatter format = new MaskFormatter("#####-###");
JFormattedTextField field = new JFormattedTextField(format);

Esse é o básico e resolve a maioria dos casos…

Fallow

F

Cara eu faço assim,

Tem uma função só para formatar:

public static MaskFormatter formatoMascaraCampo(int intTpMascara) {

    // Declaraçao e Inicializaçao de Variáveis
    MaskFormatter formato = new MaskFormatter();

    try{
      switch (intTpMascara){
      case 1:
        //Formato data
        formato.setMask("##/##/####");
        formato.setPlaceholderCharacter('_');
        break;
      case 2:
        //Formato da data mostrada ao usuário
        //Tem um local onde o usuário me diz qual é o formato
        //de data que ele quer visualizar no sistema.
        formato.setMask("UU/UU/UUUU");
        formato.setPlaceholderCharacter('_');
        formato.setValidCharacters("DMY");
        break;
      case 3:
        //Formato de hora
        formato.setMask("##:##:##");
        formato.setPlaceholderCharacter('_');
        break;
      }

    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
    return formato;
  }

e na hora de criar o campo dentro do JFrame eu só faço chamar a função:

txtDataSaida = new JFormattedTextField(Funcoes.formatoMascaraCampo(1)); txtDataSaida.setValue(""); txtDataSaida.setBounds(new Rectangle(308, 159, 80, 20)); [/img]

H

Olá galera… :!: :!:
aproveitando o post…
é já pesquisei um monte sobre formatação de TextField aqui mas acredito que não encontrei o que realmente preciso…
formatar cep, cpf, data tá tudo beleza…
mas se eu quero formatar o campo para incluir zeros à esquerda, como faço? :?: :?:
por exemplo, ao digitar 118 ou 15 quero que o campo fique com o formato 0118 ou 0015, por exemplo…

agradeço qualquer ajuda aí…

valeu
Hwoarang

H

“Hwoarang”:
Olá galera… :!: :!:
aproveitando o post…
é já pesquisei um monte sobre formatação de TextField aqui mas acredito que não encontrei o que realmente preciso…
formatar cep, cpf, data tá tudo beleza…
mas se eu quero formatar o campo para incluir zeros à esquerda, como faço? :?: :?:
por exemplo, ao digitar 118 ou 15 quero que o campo fique com o formato 0118 ou 0015, por exemplo…

agradeço qualquer ajuda aí…

valeu
Hwoarang

as vezes vc tem de fazer seu proprio Document caso não ache nenhum pronto…
de uma olhada nesse post… e ve se vc tira uma ideia de como fazer o seu
http://www.guj.com.br/forum/viewtopic.php?t=7696&highlight=jformattedtextfield

olhando na API sobre PlainDocument ajuda muito tbm…

ah… comece pelo tutorial do guj…

T

Você ja tentou usar na mask o seguinte: “0000” ao invés de “####”

Fallow

H

“TedLoprao”:
Você ja tentou usar na mask o seguinte: “0000” ao invés de “####”

Fallow

aí Rodrigo,

na verdade eu não estava usando Mask… e Mask não aceita “0000”, só #, ', U, L, A, ?, *, H… pelo menos é o que eu aprendi em http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html

pensei que houvesse um método que poderia fazer isso, mas como não achei, fiz eu mesmo um do while aqui, concatenando os zeros a esquerda do número…

só que ganhei outro problema…
como estava querendo limitar a quantidade de numeros digitados pelo usuário, criei a máscara “####” e tudo ficou beleza…
só que agora o ActionPerformed do campo não é executado quando digito apenas 2 números e dou ENTER…

sem a máscara o ActionPerformed é chamado e eu consigo colocar os zeros à esquerda, mas usando Mask não consigo…

alguém tem alguma idéia ?

obrigado.

Hwoarang

H

“Hempx”:

as vezes vc tem de fazer seu proprio Document caso não ache nenhum pronto…
de uma olhada nesse post… e ve se vc tira uma ideia de como fazer o seu
http://www.guj.com.br/forum/viewtopic.php?t=7696&highlight=jformattedtextfield

olhando na API sobre PlainDocument ajuda muito tbm…

ah… comece pelo tutorial do guj…

valeu Hempx…
enquando eu postava minha resposta vc colocou a sua…
já dei uma rápida olhada lá, mas acredito que conseguirei resolver meu problema…

obrigado!!

Hwoarang

T

Sorry, o q eu quis dizer foi usar um DecimalFormat ao invés de um MaskFormatter… Confundi as classes…

Testa ai que funciona!!!

Fallow

H

“TedLoprao”:
Sorry, o q eu quis dizer foi usar um DecimalFormat ao invés de um MaskFormatter… Confundi as classes…

Testa ai que funciona!!!

Fallow

ahh sim… com DecimalFormat eu resolvo… mas… ganhei outro problema:
o campo só aceita o formato “0000” se eu pressionar TAB… não com ENTER

estou apanhando aqui pq não consigo entender pq quando eu uso máscaras (seja com MaskFormatter ou DecimalFormat) não consigo validar o campo com ENTER (o código do ActionPerformed do campo não dispara…)

alguma idéia ?

Hwoarang

H

só pra esclarecer, usando uma máscara “0000” o ActionPerformed não dispara somente quando digito menos que 4 dígitos…

flw

Hwoarang

E

Ola a todos!

Também estou com problemas de validação / formatação no SWING. O fato é que sou desenvolvedor WEB e somente agora estou usando GUI.
Sei que na WEB (JSP) temos um frame work de validação muito bom (o Struts-Validator) e se não existir algo assim no GUI estou pensando em desenvolver.

Minha ideia é extender a classe JtextField para criar uma propriedade mask (getMask, setMask), assim vou poder usa-la direto na ferramenta de editar formulários do NetBeans.

Oque voces acham ???

H

“Evangelista”:
Ola a todos!

Também estou com problemas de validação / formatação no SWING. O fato é que sou desenvolvedor WEB e somente agora estou usando GUI.
Sei que na WEB (JSP) temos um frame work de validação muito bom (o Struts-Validator) e se não existir algo assim no GUI estou pensando em desenvolver.

Minha ideia é extender a classe JtextField para criar uma propriedade mask (getMask, setMask), assim vou poder usa-la direto na ferramenta de editar formulários do NetBeans.

Oque voces acham ???

Nunca usei esse Struts-Validator, mas em swing existe JFormattedTextField. Mas mesmo assim talvez seja uma boa idéia porque como pode ver nesse topico mesmo ele deixa muito a desejar…

veja tbm:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/MaskFormatter.html

E

Uma última pergunta: Onde posso publicar os resultados obtidos para que a galera do GUJ tome conhecimento? Sabe, isso ajudaria as pessoas que tem os mesmos problemas que eu, e por outro lado, também evita que eu re-invente a roda !!!

Estou iniciando os trabalhos e pretendo seguir os seguintes tópicos:

1 - Separar filtro de entrada, validação na perda do foco e validação na conclusão.

1.1 Filtro de Entrada - Devemos filtrar os caracters válidos de acordo com a posição dentro do campo. Se for necessário construir uma validação para um número inteiro o “-” só é um caracter válido na primeira posição, nas demais temos “0-9” e o “.” ou a “,” dependendo da nacionalização.

1.2 Validação Na Perda do Foco - Voltando ao exemplo do inteiro, o “-” ná primeira posição é uma entrada válida, mas só o “-” não é necessáriamente um número inteiro válido. Assimm quando o campo perder o foco uma nova validação deve ser realizada.

1.3 Validação Na Conclusão - Como o usuário tem o “poder do mouse” ele pode preencher campos em ordem invertida, dessaforma regras de validação que envolvam dois ou mais camos, devem ser checadas após o preenchimento de todo o formulário.

2 - Permitir aseparação entre oformato de armazenagem e o formato de exibição.

3 - Dar flexibilidade ao projeto para que novas regras de validação sejam inseridas facilmente.

4 - Permitir que as ferramentas de validação sejam acessíveis de uma RAD (perdão a galera do eclipse mas eu tenho uzado NetBeans com grande sucesso na montagem de formulários Swing).

Mais uma vez obrigado a todos !!!

H

acho que caso precise da ajuda de pessoas do GUJ ou de fora, hospede seu projeto num sourceforce ou java.net ou portais desse tipo. Como o codigo fonte da API do java é aberto… olhe como jformattedtextfield e MaskFormatter funcionam… como vc mesmo disse… não vá inventar a roda. E outra… qd estiver pronto acho que é só fazer um pequeno artigo ensinando como funciona… e conversa com algum moderador aqui do GUJ que com certeza eles teram de prazer de postar o artigo.
Ah e faça tudo muito bem documentado.
Precisando de ajuda estou aqui tbm… =))
qq coisa mande PM… o ruim que estou sem internet em casa por enguanto… ae qd mexo na net é aqui no serviço e geralmente não posso ficar mexendo muito na internet auqi do serviço.

T

criei uma classe que extende plain document… tá funcionando normal… mas, qual o metodo da plaindocument que serve para eu adicionar um item a uma combo box?

Criado 6 de março de 2004
Ultima resposta 18 de mai. de 2005
Respostas 17
Participantes 8