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!!!
se alguem tiver alguma ideia de como posso fazer…
Obrigado!!!
- 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.
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.
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.
Não sabia, dica furada então… shausuahs.
Abraço.
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.
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.
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!!!
public void validaCamposPreenchidos() {
int j;
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
}
}
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.
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?
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:
[code]nomeField.setInputVerifier(new BlankVerifier(“NOME”));
class BlankVerifier extends InputVerifier {
private String fieldName;
public BlankVerifier(String fieldName) {
this.fieldName = fieldName;
}
public boolean verify(JComponent input) {
JTextComponent txtField = (JTextField) JTextComponent;
if (txtField.getText().length() <= 0) {
JOptionPane.showMessageDialog(SeuFrame.this, "Informe o campo " + fieldName + “!”,
“Erro de validação!”, JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}
[/code]
Tinha um exemplo detalhado e funcional no link que postei.
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.
Vini tem algum exemplo bem legal ai pra o uso do InputVerifier???
att!!!
Não serve os do link, ou os que eu dei? :shock:
To tentando testar com esse exemplo aki as n ta rodando n
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;
}
}
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!
Acabei de ver que vc fechou um parênteses a mais depois do new InputVerifier()
Eh fechei mas n era esse o problema…
esta em toda a lnha
Cara, diz a mensagem de erro, senão fica exotérico demais para corrigir.
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;
}
});