Validar hora digitada num jformattedtextfield

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

obrigado

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;
		
	}
	
	
	

}

fiz a seguinte alteracao no meu codigo conforme visto no topico acima …

a chamada ficou assim :

			jFormattedTextField3 = new JFormattedTextField(mascara);
			jFormattedTextField3.setVisible(true);
			jFormattedTextField3.setEditable(true);
			jFormattedTextField3.setBounds(450, 230, 50, 25);
			jFormattedTextField3.setToolTipText( "Informe a hora de entrada (digite apenas números)" );
			jFormattedTextField3.setFocusLostBehavior(JFormattedTextField.COMMIT);
			jFormattedTextField3.setInputVerifier( Validacao.getDocumento2( (jFormattedTextField3.getText()).trim() ) );

e a validacao …


import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import java.text.Format;
import java.text.SimpleDateFormat;

public class Validacao {
    
    public Validacao() {
    }

    public static InputVerifier getDocumento2(String hora) {
        return new valida_hora(hora);
    }
}

class valida_hora extends InputVerifier {
	private static final long serialVersionUID = 1L;
	private String hora = null ;
    public valida_hora(String hora) {
        this.hora = hora;
    }
	@Override
	public boolean verify(JComponent input) {
		// TODO Auto-generated method stub

		System.out.println(hora);

		if ( hora.equals(":")) {
			JOptionPane.showMessageDialog(null, "Digite a hora" ,"Operador",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		
		return true;
	}
	
}

mas ele sempre ta caindo no erro do “hora,equals(”:")" - mascara do campo - independente se eu digitar alguma coisa ou nao no formattedtextfield …

como eu corrigo isso …

parece que ele nao atualiza o que foi digitado no campo antes de validar …