Campos com máscara

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

Voce ja leu o tutorial do GUJ sobre o assunto?

Rafael

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

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

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]

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

[quote=“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[/quote]

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…

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

Fallow

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

Fallow[/quote]

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

[quote=“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…[/quote]

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

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

Testa ai que funciona!!!

Fallow

[quote=“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[/quote]

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

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

flw

Hwoarang

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

[quote=“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 ???[/quote]

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

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

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.

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?