[ RESOLVIDO ] Problema com JFormattedTextField

21 respostas
V

E ae pessoal, estou com um problema com um campo do tipo JFormattedTextField.

Este campo possui uma máscara para data ( ##/##/#### ). Quando eu digito um valor válido ( que preencha todos os espaços da máscara ) e o apago, no campo volta o valor que eu tinha digitado anteriormente.

Existe algum parâmetro para modificar isso, para que o campo não assumo o último valor válido digitado?

OBS: minha aplicação é desktop!

Vlw!

21 Respostas

L

Eu não entendi muito bem o seu erro, mas preste bastante atenção para ver se não é coisa do navegador…

V

minha aplicação é desktop cara…

O problema é o seguinte… quando eu apago os dados do campo e dou um “TAB” por exemplo, voltam no campo os dados que eu tinha digitado!

V

alguém aí pra ajudar?

L

Bom,
pode ser que o tab esteja acionando alguma coisa que esteja “voltando” o texto … ou seja efetivamente os dados não foram excluídos.
Você consegue capturar a ação do tab com algum keypress?? Se conseguir, você pode limpar o texto forçada mente, já que ele não está sendo …

V

leonardocregis:
Bom,
pode ser que o tab esteja acionando alguma coisa que esteja “voltando” o texto … ou seja efetivamente os dados não foram excluídos.
Você consegue capturar a ação do tab com algum keypress?? Se conseguir, você pode limpar o texto forçada mente, já que ele não está sendo …

Leonardo, o TAB foi só um exemplo, isso acontece sempre que o JFormattedTextField perde o foco…

L

Então veja o evento de perder o foco!!
Talvez ele esteja re-renderizando a tela com algo que já deveria ter sido removido!

V

leonardocregis:
Então veja o evento de perder o foco!!
Talvez ele esteja re-renderizando a tela com algo que já deveria ter sido removido!

Leonardo… testei esses parâmetros:

  • setFocusLostBehavior(JFormattedTextField.COMMIT);
  • setFocusLostBehavior(JFormattedTextField.PERSIST);
  • setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
  • setFocusLostBehavior(JFormattedTextField.REVERT);

mas nem um desses tem o efeito que eu quero, alguns fazem com que o JFormattedTextField aceite que seus campos não estejam totalmente preenchidos, mas realmente não é isso que eu pretendo.

Andei vendo, parece que eu tenho que “sobrescrever” o método stringToValue do classe MaskFormatter… mas não sei como posso fazer isso!

V

achei um tópico parecido, só não sei como implementá-lo com a solução que foi apresentada
http://www.guj.com.br/posts/list/10666.java#702439

L

Para reescrever vc teria que estender o JFormater !! e redefinir o método que faz essa ação!

Aconselho ler os tutoriais da sun…

L

"FormattedTextField.COMMIT Commits the current value. If the value being edited isn’t considered a legal value by the AbstractFormatter that is, a ParseException is thrown, then the value will not change, and then edited value will persist. "

De acordo com o que foi escrito , presumo que se você capturar o erro , então você poderá ver qual foi o valor que foi preenchido de forma a você atualizar da forma que vc acha mais adequada!

R

Eu normalmente faço o seguinte:

formattedTextField.setFocusLostBehavior(javax.swing.JFormattedTextField.PERSIST); formattedTextField.setFormatterFactory(new DefaultFormatterFactory(new MaskFormatter("##/##/####")));

Outra saída completamente diferente é solicitar datas através de um componente especializado, tal como JCalendar:

http://www.toedter.com/en/jcalendar/index.html

V

roger_rf:
Eu normalmente faço o seguinte:

formattedTextField.setFocusLostBehavior(javax.swing.JFormattedTextField.PERSIST); formattedTextField.setFormatterFactory(new DefaultFormatterFactory(new MaskFormatter("##/##/####")));

Outra saída completamente diferente é solicitar datas através de um componente especializado, tal como JCalendar:

http://www.toedter.com/en/jcalendar/index.html

cara, mas o PERSIST faz com que alguns campos do JFormattedTextField, da máscara mais precisamente, possam ficar sem preenchimento.
Exemplo: “1/ / 9”

R

Então acho que a máscara que você precisa é “99/99/999”, não “##/##/####”. De qualquer forma, usar “##/##/####” e ter espaços em branco, como em “1/ / 9”, é perfeitamente aceitável para mim - você pode (in)validar o valor e tomar providências quando o usuário clicar OK para confirmar os dados (é a forma que prefiro) ou quando o JFormattedTextField perder o foco.

V

existe essa máscara “99/99/9999”?

R

Ops, a máscara “99/99/9999” não existe - devia estar com a cabeça em outra linguagem, sinto muito pelo engano. Mas, voltando à discussão principal, você pode ler o texto digitado no JFormattedTextField, extrair com substring().trim() os dados de interesse (dia, mês e ano), validar estes dados, e por fim construir um objeto java.util.Date contendo a data digitada pelo usuário.

F

Olá

Porque não usa o JCalendar?

Veja exemplos Aqui:


http://www.toedter.com/en/jcalendar/demo.html

Té mais…

V

Bem, como na verdade não consegui implementar a idéia inicial, acabei criando outra solução:

Usando o o setFocusLostBehavior(JFormattedTextField.PERSIST) o usuário pode deixar campos em branco, para isso, fiz uma verificação:

Então… se o tamanho do meu campo (retirando os espaços em branco) for menor que 8, não irá passar…

Vou procurar mais coisas e ver se consigo achar algo sobre os JFormattedTextField no sentido principal da minha idéia.

Valeu a todos pela ajuda!

M

vc tem que dar um .setText(null) assim resolve o problema.

M

Matusalem.....

Estou com o mesmo problema que o "vini.franke".... e usei esse o codigo que vc informou e não obtive nenhum sucesso. Não mudou absolutamente nada ! Continua puxando o valor digitado anteriormente.
Tem como me ajudar ?

Adiciono a minha mascara no próprio JTextField do projeto. Exemplo do CEP:

\\\\\\\\\\\\\\CODIGO PERSONALIZADO NETBEANS\\\\\\\\\\\\\\\\\
javax.swing.text.MaskFormatter masktelcel = null;   
try   
{   
masktelcel = new javax.swing.text.MaskFormatter("#####-###");   
masktelcel.setPlaceholderCharacter('_');   
}   
catch (java.text.ParseException exc){}  
CampoCep = new javax.swing.JFormattedTextField(masktelcel);  ;  
  
CampoCep.setEditable(false);  
  
CampoCep.setFocusable(false);  
  
CampoCep.addActionListener(new java.awt.event.ActionListener() {  
    public void actionPerformed(java.awt.event.ActionEvent evt) {  
        CampoCepActionPerformed(evt);  
    }  
});  
CampoCep.addFocusListener(new java.awt.event.FocusAdapter() {  
    public void focusLost(java.awt.event.FocusEvent evt) {  
        CampoCepFocusLost(evt);  
    }  
});  
CampoCep.addKeyListener(new java.awt.event.KeyAdapter() {  
    public void keyTyped(java.awt.event.KeyEvent evt) {  
        CampoCepKeyTyped(evt);  
    }  
});
Agradeço a ajuda.

Grato,

Arthur.

L

Oi,

Crie uma classe teste bem simples com apenas 1 campo formatado e post aqui.

A partir dela poderei ajuda-lo!

Tchauzin!

M

Galera…

Muito obrigado.
Analizando tudo o que fiz… percebi um erro que bloqueava tudo.
Ao invés de usar o “JFormatedTextField” eu estava usando o “JTextField”.
E o campo “JTextField” até aceita as mask, porém não consigo usar os setValue(), ou o setOverWriteMode,… por isso que eu tinha muita dificuldade !

Agradeço a Todos que contribuirão com esse tópico !

Criado 19 de junho de 2009
Ultima resposta 29 de fev. de 2012
Respostas 21
Participantes 7