[ RESOLVIDO ] Problema com JFormattedTextField

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!

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

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!

alguém aí pra ajudar?

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 …

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

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

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

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

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

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

Aconselho ler os tutoriais da sun…

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

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

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

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

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.

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

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.

Olá

Porque não usa o JCalendar?

Veja exemplos Aqui:


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

Té mais…

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!

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

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

[code]
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);
}
}); [/code]
Agradeço a ajuda.

Grato,

Arthur.