Hace un tiempo, realizando un proyecto me vi en la necesidad, con propósito de evitar errores a la hora de introducir parametros en una base de datos, de limitar un campo de texto (JTextField) a determinado número de elementos, por ejemplo, a la hora de introducir un código postal, necesitaba que fuera de 5 digitos, y solo número ya que el campo dentro de la base de datos era de tipo entero, así mismo quise evitar eso de estar enviando mensajes molestos al usuario para que introdujera bien los datos o también el manejo de try catch cuando quizá no era tan necesario, y en fin, me di a la tarea de realizar, primero un componente que sustituyera al JTextField, al principio con algunos problemas obviamente por no usar el componente por default, después, debugeando, me di cuenta de que no era necesario reescribir el componente, sino que con solo el hecho de jugar con los keylisteners podía llegar al resultado esperado, es por eso que hoy, quiero compartirles la primera versión de una pequeña librería que realice en este proyecto.
¿De que se trata?
Simplemente es una pequeña librería que permite limitar el número de elementos en un JTextField, para tener un mejor control sobre el componente, pero no solo esto, así mismo, también permite el hecho de indicarle al componente que solo se le puedan introducir ya sea texto, o números.
Bien, pero ¿Como funciona?, es sencillo, primero que nada, descarguemos la librería del siguiente enlace:
Una vez hecho esto, deberemos agregarla a nuestro proyecto dando clic derecho en libraries y seleccionando Add JAR/Folder:
Con esto ya tendremos la librería en nuestro proyecto, ahora, solo nos queda importarla para poderla utilizar:
import Atxy2k.CustomTextField.RestrictedTextField;
Una vez hecho esto estamos listos para utilizarla, vamos a crear una instancia de la clase RestrictedTextField:
RestrictedTextField restricted = new RestrictedTextField(tujtextfield);
Claro, sustituyendo «tujtextfield» por el JTextField que quieres restringir, ahora bien, limitarlo es muy sencillo, vamos a suponer que queremos limitar el JTextField a 5 caracteres, lo harémos con el método setLimit, enviandole el número maximo de caracteres que deseamos aceptar:
restricted.setLimit(5);
Y listo, podrán observar que su componente ya no dejará que escriban mas de 5 caracteres, ahora bien, he incluido algunos métodos mas que a lo mejor les interese, por ejemplo:
restricted.setOnlyNums(true);
Este método activa la opcion de «solo números» es decir, el JTextField solo aceptara entradas de números, esto me ha servido bastante cuando se trata de códigos de barras, etc.
restricted.setOnlyText(true);
Este, obviamente, restringirá el JTextField a solo la entrada de texto.
restricted.restore();
Este método, restablecerá las propiedades del JTextField conservando solo el limite establecido.
Y listo, es una librería muy sencilla en realidad, de todos modos, cualquier idea para mejorarla o cualquier problema que tengan con ella estan en toda la libertad de decirme. Un saludo. 😉
Actualización 06/05/2014
Que tal, pues bien, a petición de muchas personas por faceboook, twitter, e incluso en los comentarios del blog, me e tomado un poco de tiempo para agregarle algunas funcionalidades a la libreria que incluso a ustedes se les ocurrieron y me parecieron excelentes, los cambios que tiene esta nueva versión son los siguientes:
- Se a agregado un nuevo método llamado setAcceptSpace: Que permitirá indicar si son permitidos los espacios en blancos, indistintamente de que se le haya restringido al elemento que acepte solo números o texto. Este valor por defecto se encuentra en false.
- Contamos con la nueva funcionalidad setOnlyAlphanumeric: Esta permite la inclusión en el campo de texto de cualquier caracter alfanumérico.
- Contamos con la nueva funcionalidad setOnlyCustomCharacters: Esta función es un poco distinta a las demas pero les permitirá manejar de mejor manera el control que van a tener sobre el JTextField, para esto tendrán que hacer lo siguiente:
- Cuando se cree el objeto, tendremos que pasar al constructor un segundo parámetro, que será una cadena de texto con todos los caracteres permitidos en el campo de texto, por ejemplo «abcdef», y con esto, el JTextField solo permitirá que sean ingresados estos caracteres, también se puede activar esta funcionalidad con el método setOnlyCustomCharacters(true), pero para esto, tendrán que enviar una cadena de texto con el método setAcceptCharacters , si no se lo envían, no les dejará escribir nada, ya que esta cadena por defecto se crea vacía. Ejemplo:
public class PruebaRestrictedTextField extends JFrame{ JTextField campoTexto; RestrictedTextField r1; public PruebaRestrictedTextField() { Container contain = getContentPane(); contain.setLayout(new FlowLayout()); campoTexto = new JTextField(10); contain.add(campoTexto); //Inicializando el RestrictedTextField r1 = new RestrictedTextField(campoTexto, "abcde"); r1.setLimit(10); } public static void main(String[] args) { PruebaRestrictedTextField window = new PruebaRestrictedTextField(); window.setSize(new Dimension(300, 200)); window.setVisible(true); } }
El codigo anterior nos daria un resultado como el siguiente:
Como se podra observar, despues de presionar alocadamente el teclado, solo permite una cadena de caracteres entre los que le mande en la cadena «abcde», espero que hasta ahora les sea de utilidad, espero posteriormente implementar algunos métodos que me sugirieron con anterioridad que por falta de tiempo no se pudieron implementar, saludos.