olá pessoal …
criei o seguinte codigo para validar horas digitadas num jformattedtextfield …
jFormattedTextField4 = new JFormattedTextField(mascara);
jFormattedTextField4.setVisible(true);
jFormattedTextField4.setEditable(true);
jFormattedTextField4.setBounds(650, 230, 50, 25);
jFormattedTextField4.setToolTipText( "Informe a hora de saída (digite apenas números)" );
jFormattedTextField4.setFocusLostBehavior(JFormattedTextField.COMMIT);
jFormattedTextField4.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent e) {
String pega = "" ;
String hora = null;
String minuto = null ;
int conta_pega = 0;
int conta_hora = 0;
int conta_minuto = 0;
pega = jFormattedTextField4.getText();
pega = pega.trim();
if ( pega.equals(":")) {
JOptionPane.showMessageDialog(null, "Digite a hora" ,"Operador",JOptionPane.ERROR_MESSAGE);
jFormattedTextField4.setValue("");
return;
}
conta_pega = pega.length();
if ( conta_pega < 5 ) {
JOptionPane.showMessageDialog(null, "Digite a hora" ,"Operador",JOptionPane.ERROR_MESSAGE);
jFormattedTextField4.setValue("");
return;
}
hora = pega.substring(0,2);
minuto = pega.substring(3,5);
conta_hora = Integer.parseInt(hora);
conta_minuto = Integer.parseInt(minuto);
if(conta_hora > 23) {
JOptionPane.showMessageDialog(null, "Hora digitada inválida" ,"Operador",JOptionPane.ERROR_MESSAGE);
jFormattedTextField4.setValue("");
return;
}
if(conta_minuto > 59) {
JOptionPane.showMessageDialog(null, "Hora digitada inválida" ,"Operador",JOptionPane.ERROR_MESSAGE);
jFormattedTextField4.setValue("");
return;
}
}
});
ele funciona legal, certinho, mas o problema eh que vou ter varias horas para digitar, sao uns 10 jformattedtextfield + ou - …
entao para nao fazer 10 vezes a mesma coisa, gostaria de criar uma classe com essa validacao, e nos jformattedtextfield apenas chamá-la …
crio essa classe como um document ??
e como faco a chamada nos jformattedtextfield ??
1 - Nao faça validacao de campos com FocusLost… isso vai te dar uma dor de cabeca terrivel qdo vc perceber que a JOptionPane é exibida umas 4 vezes =P
2 - Crie uma classe que extenda InputVerifier… nela coloque as validacoes pros seus campos, sobrescrevendo o metodo verify()…
esse método, que retorna um boolean, faz com q seu campo perca o foco apenas se ele retornar true…
ai nos seus inputs, vc simplesmente faz:
seuInput.setInputVerifier( new SeuInputVerifier() );
vou postar um codigo de uma verificacao de data… tem q ser bastante melhorado, pra nao funcionar apenas pra datas…
package adm.util.componentes;
import java.sql.Timestamp;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import adm.util.Util;
public class SpdInputVerifier extends InputVerifier {
private JTextField textfield;
private boolean aceitaDataPosteriorAtual;
private boolean result = true;
public SpdInputVerifier(JTextField textfield) {
this(textfield, false);
}
public SpdInputVerifier(JTextField textfield, boolean aceitaDataPosteriorAtual) {
this.textfield = textfield;
this.aceitaDataPosteriorAtual = aceitaDataPosteriorAtual;
}
@Override
public boolean verify(JComponent arg0) {
result = true;
String data = this.textfield.getText().trim();
boolean badFormat = false;
if (data != null && data.length() > 0) {
if (data.length() == 8) {
if ( !(data.substring(2, 3).equals("/") || data.substring(5, 6).equals("/")) ) {
data = data.substring(0, 2) + "/" + data.substring(2, 4) + "/" + data.substring(4);
this.textfield.setText(data);
} else {
badFormat = true;
}
} else if (data.length() == 10) {
if (!(data.substring(2, 3).equals("/") && data.substring(5, 6).equals("/"))) {
badFormat = true;
}
} else {
badFormat = true;
}
}
if ( badFormat ) {
JOptionPane.showMessageDialog(null,
"Digite a data no formato DD/MM/AAAA", "Erro",
JOptionPane.ERROR_MESSAGE);
result = false;
} else if ( data.length() > 0 ) {
if (!Util.isDateValid(data)) {
JOptionPane.showMessageDialog(null, "Data inválida.", "Erro",
JOptionPane.ERROR_MESSAGE);
result = false;
} else if (!aceitaDataPosteriorAtual) {
try {
Timestamp dataDigitada = Util.formataStringToDate(data);
Timestamp dataAtual = Util.dataAtual();
if (dataDigitada.after(dataAtual)) {
JOptionPane.showMessageDialog(null,
"Data não pode ser superior à data atual.", "Erro",
JOptionPane.ERROR_MESSAGE);
result = false;
}
} catch (Exception exc) {
exc.printStackTrace();
}
}
}
return result;
}
}