Galera to tentando fazer uma validação aki para uma aplicação minha onde tento fazer com que a cada campo que n esteja correto como por exemplo nome em branco ele me alerte to erro, mas não qnd eu for salvar o formulário e sim fazer a validação qnd eu tirar o foco do local ou qnd for fazer um preenchimento que eh obrigatório e não esta na seqüencia.
estou fazendo aki usando JTabbedPane, para separa o formulario da Jtable com os dados vindos do banco!!!
Use o JFormattedTextField para os textos com formatação (numéricos, por exemplo);
Use um InputVerifier para os textos sem formato fixo, mas com regras;
No JTable, impeça que seu TableModel aceite valores inválidos. Basta não confirma-los no setValueAt. Outra possibilidade é definir CellEditors personalizados para facilitar a entrada;
JComboBoxes e JLists são chatas de tratar. Você precisará lidar com eventos.
Eu ainda acho a validação no botão de save muito melhor. O usuário pode inserir dados mais rapidamente no formulário, o código fica mais coeso, fácil de manter e não depende tanto do mecanismo de eventos. Pode ser disparado em outras situações, como ao fechar a janela e responder “sim” a perguntas como “você não salvou, deseja salvar agora?”.
Ao invés de dar erro e impedir sair do campo, uma boa alternativa é só pintá-lo de vermelho quando o usuário sair do componente. Isso faz com que a digitação ainda permaneça rápida.
FabioQuintana
como você quer fazer a validação no momento que o componente perder o foco… use o “focusLost”…
Com codigo do tipo:
private void jTextField1FocusLost(java.awt.event.FocusEvent evt) {
/* verifica se o campos esta vazio */
if (jTextField1.getText().equals("")){
/* seta o background para vermelho */
jTextField1.setBackground(Color.RED);
} else {
/* seta o background para branco */
jTextField1.setBackground(Color.WHITE);
}
}
Que verifica se o campo esta vazio, e se verdadeiro pinta o BG de vermelho…
ainda existe a possibilidade de você definir um JLabel ao lado do seu edit, e alterar
o setIcon dele a metida que a inserção eh vista como certa ou errada… lembrando
validação Ajax (web) …
fica a ideia,
Abraço.
ViniGodoy
O focusLost não é adequado para JTextFields, mas pode ser usado para JList e JCombobox, que citei ali. Para o JTextField, use o InputVerifier, que foi criado justamente pq o focusLost apresentava muitos problemas.
FabioQuintana
Não sabia, dica furada então… shausuahs.
Abraço.
ViniGodoy
Ela serve para colorir o JTextField, como você fez, só não serve para “cancelar” a saída do JTextField.
Era aí que o evento falhava.
Sem falar que sua dica também serve para outros componentes.
FabioQuintana
Normalmente eu uso esse tipo de validação nas minhas aplicações, mas de fato não prendo o usuário no campo…
só faço “brincadeiras” de trocar cor, aviso textual dentro do campo, ou usando um label para exibir imagens de erro…
prender (obrigar) o preenchimento me parece meio chato… para isso você pode fazer o teste ao entrar no componente que
tem alguma dependência, e nesse momento verificar se os componentes necessarios estao preenchidos, se não…
troca o foco para os pre-requisitos…
ideia… ^^
Abraço.
habinovich
Fiz dessa forma e mesclando com a forma q o fabio falo… mas so q qnd coloco no focus ele fica meio q em loop pelo fato da mensagem tirar o foco!!!
publicvoidvalidaCamposPreenchidos(){intj;if(nomeField.getText().length()<=0){Object[]options={"OK"};j=JOptionPane.showOptionDialog(null,"Informe o Campo NOME","Erro de validação",JOptionPane.ERROR_MESSAGE,JOptionPane.QUESTION_MESSAGE,null,options,options[0]);if(j==JOptionPane.ERROR_MESSAGE){nomeField.setBackground(Color.RED);jTabbedPane1.setSelectedIndex(1);nomeField.requestFocus();}}else{//Tratamento}}
ViniGodoy
Viu só como se você quiser manter o foco no JTextField não dá para usar o evento?
Use o InputVerifier, que eu citei ali em cima.
FabioQuintana
E se você deixar;
if (nomeField.getText().length() <= 0) {
nomeField.setBackground(Color.RED);
} else {
//Tratamento
}
no lost do nomeField e;
if (nomeField.getText().length() <= 0) {
Object[] options = {"OK"};
j = JOptionPane.showOptionDialog(null, "Informe o Campo NOME", "Erro de validação",
JOptionPane.ERROR_MESSAGE, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
if (j == JOptionPane.ERROR_MESSAGE) {
jTabbedPane1.setSelectedIndex(1);
nomeField.requestFocus();
}
} else {
//Tratamento
}
no gained de quem depende do nome?
e como usar o InputVerifier vini?
ViniGodoy
Você pode fazer inline assim:
nomeField.setInputVerifier(new InputVerifier() {
public boolean verify(JComponent input) {
JTextField txtNome = (JTextField) input;
if (txtNome.getText().length() <= 0) {
JOptionPane.showMessageDialog(SeuFrame.this, "Informe o campo NOME!", "Erro de validação!", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
});
Ou, como no caso vai ser comum verificar por coisas em branco, é melhor criar uma classe:
nomeField.setInputVerifier(newBlankVerifier("NOME"));classBlankVerifierextendsInputVerifier{privateStringfieldName;publicBlankVerifier(StringfieldName){this.fieldName=fieldName;}publicbooleanverify(JComponentinput){JTextComponenttxtField=(JTextField)JTextComponent;if(txtField.getText().length()<=0){JOptionPane.showMessageDialog(SeuFrame.this,"Informe o campo "+fieldName+"!","Erro de validação!",JOptionPane.ERROR_MESSAGE);returnfalse;}returntrue;}}
Tinha um exemplo detalhado e funcional no link que postei.
ViniGodoy
Vejam que com o inputVerifier nem sequer é necessário chamar o requestFocus().
Ele mesmo proíbe o JTextField de perder o foco, caso o método verify() retorne false.
Sem falar que é mais simples do que o tratamento no evento.
habinovich
Vini tem algum exemplo bem legal ai pra o uso do InputVerifier???
att!!!
ViniGodoy
Não serve os do link, ou os que eu dei? :shock:
habinovich
To tentando testar com esse exemplo aki as n ta rodando n
nomeField.setInputVerifier(newInputVerifier()){publicbooleanverify(JComponentinput){JTextFieldtxtNome=(JTextField)input;if(txtNome.getText().length()<=0){JOptionPane.showMessageDialog(SeuFrame.this,"Informe o campo NOME!","Erro de validação!",JOptionPane.ERROR_MESSAGE);returnfalse;}returntrue;}}
ViniGodoy
E dá algum erro?
Você tentou corrigir? Eu não tenho o netbeans aqui para testar, então faço o código mais ou menos, vc tem que arrumar!
ViniGodoy
Acabei de ver que vc fechou um parênteses a mais depois do new InputVerifier()
habinovich
Eh fechei mas n era esse o problema…
esta em toda a lnha
ViniGodoy
Cara, diz a mensagem de erro, senão fica exotérico demais para corrigir.
ViniGodoy
Teste aí:
nomeField.setInputVerifier(new InputVerifier() {
public boolean verify(JComponent input) {
JTextField txtNome = (JTextField) input;
if (txtNome.getText().length() <= 0) {
JOptionPane.showMessageDialog(null, "Informe o campo NOME!", "Erro de validação!", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
});
habinovich
Deu certo pra ver o erro, mas agora ele passa pelo JTextField... e coloquei ele em um evento keypressed e fica dando o erro qnd tiro o foco com o TAB ou ate msm qnd clik em algum outro local da tela ai fica sem ação so com o erro mostrando...
publicvoidvalidaCamposPreenchidos(){nomeField.setInputVerifier(newInputVerifier(){publicbooleanverify(JComponentinput){JTextFieldtxtNome=(JTextField)input;if(txtNome.getText().equals("")){JOptionPane.showMessageDialog(null,"Informe o campo NOME!","Erro de validação!",JOptionPane.ERROR_MESSAGE);//nomeField.requestFocus();setBackground(Color.yellow);returnfalse;}returntrue;}});}
L
lokits5
“vini”
então como eu poderia validar todos meu campos txt , qq existir algum campo vazio aparecer ele em vermelho
o manu deu esse exemplo mas não deu muito certo!
como poderia fazer isso para todos em vez de digitar todos os txt …
private void jTextField1FocusLost(java.awt.event.FocusEvent evt) {
/* verifica se o campos esta vazio */
if (jTextField1.getText().equals("")){
/* seta o background para vermelho */
jTextField1.setBackground(Color.RED);
} else {
/* seta o background para branco */
jTextField1.setBackground(Color.WHITE);
}
}
habinovich
cara como o vini falo com focus sempre gera alguns problema ele sugeriu usar InputVerifier, Logo acima tem um exemplo do codigo q to tentando fazer aki… com cor e mensagem… mas aki qnd da o 1 erro ele fica dando erros em sequencia ao tirar o focu ate mesmo indo cancelar o evento!
ViniGodoy
Cria o listener como uma classe separada, aí é só associar o mesmo listener para vários componentes.
habinovich
mas vini dessa forma ele pode evitar de tipo qnd tem o erro ele mostra o foco para o campo mas qnd vou cancelar ele sai o foco e mostra o erro novamente…
habinovich
viniGodoy da forma vc mostrou ele funcionaria msm qnd teclo TAB ele alertar e focar o erro no campo…
pq coloquei ele em um keypressd e n ta rodando qnd clico TAB
ViniGodoy
habinovich:
viniGodoy da forma vc mostrou ele funcionaria msm qnd teclo TAB ele alertar e focar o erro no campo…
pq coloquei ele em um keypressd e n ta rodando qnd clico TAB
Clique no próximo campo com o mouse.
habinovich
mas tipo eu tenho q por o metodo em algum evento especifico?
FabioQuintana
…
lokit"s pq meu método nao da mto certo?
o que eu propus ele cumpri… e digamos que com simplicidade…
…
habinovich, a melhor solução seria mudar o foco, prender o usuário no campo fere todas regras de heurísticas pra uma avaliação de interface qualquer…
entao, tenta resolver ao longo da execução e nao proibindo ações, e tirando dinamismo… =/
Abraço.
L
lokits5
FabioQuintana
valeu brother mas ja resolvi usei um pouco do seu codigo sim…
flou abrxx
habinovich
habinovich:
mas tipo eu tenho q por o metodo em algum evento especifico?
Vini como eu posso simular o Click do mouse para um JtextField, pq a validação q vc me passo so funciona se clicar com o mouse no campo gostaria de evitar isso e fazer com q ao chamar o formulario ja simule o click do mouse no 1campo para apartir da montar a validação com TAB…
pra evitar o usuaria click em outras partes e alert a validação no campo q o usuario clicou e n no 1 campo… pq o formulario vai validar mas de um campo!
Não se eh possivel isso, mas eh uma duvida!!
att,
ViniGodoy
O que exatamente você quer fazer?
A validação com o InputVerifier funciona sempre que vc tenta sair do campo, seja com o mouse ou não.
habinovich
tipo aki tenho o 1 campo (nome)recebi requestFocus vindo do botao que chama o fomulario no caso esse campo não valida so faz a validação se eu clicar com o mouse nele, tiro o foco dele com o TAB sem usar o mouse no campo ele não faz o teste…
alguma ideia pra mi ajudar!!!
ViniGodoy
Você está definindo o inputVerifier quando? No construtor do seu JFrame?
habinovich
Não, não foi no contrutor q definei ele!
Criei o metodo e coloquei ele para usar no botao salvar para tbm fazer a validação apartir de la!
ViniGodoy
habinovich:
Não, não foi no contrutor q definei ele!
Criei o metodo e coloquei ele para usar no botao salvar para tbm fazer a validação apartir de la!
Coloque no construtor do seu JFrame. O setInputVerifier só configura o verificador do JTextField, não faz a verificação em si.
Se vc deixar em um método, esse método terá que ser chamado pelo menos uma vez para que a verificação comece a ser feita.
habinovich
era por esse o motivo q tava falando do clik do mouse q chamava para o 1 campo
nesse caso agora para validar tbm no salvar tenho q criar outra forma para validar?
ksantannap
Booa noite!!
Galera, estou começando com Java agora e estava na net procurando um tipo de validação simples, somente se ainda não preencheu o campo informar numa JOptionPane e retornar sem realizar nenhuma tarefa e consegui este código aqui, muito simples… Não sei se é uma má pratica ou algo do tipo, como falei no inicio sou novo, se for ruim, favor informar abaixo ae, porque gostaria de aprender da melhor forma.
Este código inseri dentro da ação do botão.
OBS. tfProjeto é o nome da minha JTextField.
if(tfProjeto.getText().equals("")){JOptionPane.showMessageDialog(c,"Preencha o campo Projeto.","Erro de validação",JOptionPane.ERROR_MESSAGE);return;}
Abraço!
ulissesgimenes
Boa tarde, consegui implementar o InputVerifier mas quando quero sair da janela com um botão tipo cancelar a operação, ele nao me deixa sem informar o campo, como posso fazer?
F
FlavioAbranches
Boa tarde a todos, descupe se cometer algum erro ( MINHA PRIMEIRA POSTAGEM)
Acabei de fazer as validaçoes da minha tela. vou tentar passar o codigo .
//Criei um metodo para fazer a gravaçao (gravarAlterar)
// no evento do botão gravar eu declarei uma variavel int com valor zero
e fiz uma condição para validar os campos se alguns deles estiverem fora da condição que preciso altero o valor da variavel para 1 e assim com outra comparação eu consigo controlar se vai gravar ou não.
Desculpe a inexperiencia com blog. Espero ter ajudado…