Para limitar los caracteres en un JTextField (por ejemplo, para que solo admita números o para que admita un número máximo de caracteres), hay muchas soluciones.
Una de ellas, que es la que vamos a ver aquí, consiste en crear un Document y añadírselo al JTextField. Si no queremos complicarnos mucho la vida, lo mejor es heredar de javax.swing.text.PlainDocument, que ya tiene todos los métodos necesarios hechos, y redefinir sólo el que nos interesa.
El método en cuestión es
public void insertString(int arg0, String arg1, AttributeSet arg2) throws BadLocationException
A este método le llamará el JTextField cada vez que queramos insertar en él algún caracter.
La redefinición de nuestro método debe comprobar que podemos añadir los caracteres y si es asi, llamar al mismo método de la clase padre, que se encargará de insertarlos. Si no queremos que se inserten, basta con hacer un return sin llamar a la clase padre.
Por ejemplo, si queremos que nuestro editor sólo admita cifras (números), debemos comprobar que todos los caracteres de arg1 son cifras. Si esto es asi, llamaremos al método de la clase padre.
if (sonCifras(arg1))
super.insertString(arg0, arg1, arg2);
Si queremos comprobar que el total de caracteres no supere un máximo, debemos sumar estos que se quieren insertar con los que ya hay en el editor y comprobar que la suma no excede un máximo
if ( (numeroCaracteresEditor + arg1.length()) > numeroMaximoCaracteres)
return;
super.insertString(arg0, arg1, arg2);
Para este último caso, nuestra clase Document tiene que tener en algún sitio el número de caracteres que ya tiene el editor. Una opción es que tenga guardado el editor y le pida cuantos caracteres tiene en cada caso.
Aquí tienes una implementación concreta de un Document para este último caso
class LimitadorCaracteres extends PlainDocument
{
/**
* El editor del que estamos limitando caracteres.
*/
private JTextField editor;
/**
* Número máximo de caracteres que
deseamos en el editor.
*/
private int numeroMaximoCaracteres;
/**
* Crea una instancia de LimitadorCaracteres.
*
* @param editor Editor en el que se quieren limitar
los caracteres.
* @param numeroMaximoCaracteres Número máximo
de caracteres que queremos
* en el editor.
*/
public LimitadorCaracteres(JTextField editor, int numeroMaximoCaracteres)
{
this.editor=editor;
this.numeroMaximoCaracteres=numeroMaximoCaracteres;
}
/**
* Método al que llama el editor cada vez
que se intenta insertar caracteres.
* El método comprueba que no se sobrepasa
el límite. Si es así, llama al
* método de la clase padre para que se inserten
los caracteres. Si se
* sobrepasa el límite, retorna sin hacer
nada.
*/
public void insertString(int arg0, String arg1, AttributeSet
arg2) throws BadLocationException
{
if ((editor.getText().length()+arg1.length())>this.numeroMaximoCaracteres)
return;
super.insertString(arg0, arg1,
arg2);
}
}
Para usar esto, simplemente hay que instanciarlo y meterlo en el JTextField como un Document
JTextField editor1 = new JTextField();
// Se pone el limitador en el editor a 10
caracteres.
editor1.setDocument(new LimitadorCaracteres(editor1,10));
Con esto es suficiente de momento.