InputVerifier

De ChuWiki

A veces -con bastante frecuencia- queremos validar lo que un usuario introduce en un JTextField. Comprobar que es un número, que está dentro de un rango, que no tiene una longitud excesiva ...

Una forma de hacerlo que permite al usuario escribir lo que quiera, pero que no le deja abandonar el JTextField hasta que haya escrito algo correcto, es el InputVerifier.

El InputVerifier es una clase a la que se le pregunta si se puede o no abandonar el JTextField. Esta clase sólo tiene que comprobar si lo introducido en el JTextField es correcto o no, y devolver true o false, según el caso.

Si devuelve true, se podrá abandonar el JTextField. Si se devuelve false, no se podrá abandonar.

Este mecanismo es más general, no solo vale con JTextField, sino con cualquier componente de SWING (con AWT no funciona). En realidad requiere la colaboración de dos componentes SWING. Cuando uno de ellos -por ejemplo el JTextField- va a perder el foco y otro componente -un JButton por ejemplo- lo va a ganar, este segundo le pregunta al InputVerifier del primero si el primero -el JTextField- puede o no perder el foco. Si el InputVerifier contesta que no -false- el JButton devolverá el foco al JTextField.

Para implementar un InputVerifier sólo tienes que hacer una clase que herede de InputVerifier e implementar el método verify(). Luego hay que meter esta clase en el componente que queramos por medio del método setInputVerifier().

Aquí tienes un ejemplo pensado para ser metido en un JTextField.

package chuidiang.ejemplos.JTextField;



import javax.swing.InputVerifier;

import javax.swing.JComponent;

import javax.swing.JOptionPane;

import javax.swing.JTextField;





public class Verficador extends InputVerifier {



	@Override

	public boolean verify(JComponent editor) {
                // suponemos que JComponent será un JTextField

		if (editor instanceof JTextField)

		{

			String texto = ((JTextField)editor).getText();

			try

			{
                                // Si se puede convertir en entero, está bien

				Integer.parseInt(texto);

				return true;

			}

			catch (Exception e)

			{
                                // Si no se ha podido convertir a entero, mostramos
                                // una ventana de error y devolvemos false

				JOptionPane.showMessageDialog(editor, "No es un número");

				return false;

			}

		}

		return true;

	}



}

Luego sólo queda añadirlo al JTextField

JTextField editor = new JTextField(20);

editor.setInputVerifier(new Verficador());