TextField REstricted 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: Descargar Una vez hecho esto, deberemos agregarla a nuestro proyecto dando clic derecho en libraries y seleccionando Add JAR/Folder: AddLibrary Con esto ya tendremos la librería en nuestro proyecto, ahora, solo nos queda importarla para poderla utilizar: Una vez hecho esto estamos listos para utilizarla, vamos a crear una instancia de la clase RestrictedTextField: 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: 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: 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. Este, obviamente, restringirá el JTextField a solo la entrada de texto. 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:
El codigo anterior nos daria un resultado como el siguiente: Captura 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.

Quizá también te interese

Utilizando ES6 en tus aplicaciones Node
Creando dialogos personalizados en Java con JDIalog
Creando dialogos personalizados en Java con JDIalog
ECMAScript 6, lo nuevo.
Bower, un administrador de paquetes para la web
  • anonymouse

    ¿Por qué cuando lo descargo me cambia el formato a .zip?

    ¿Lo has subido en .jar o en .zip?

  • .

    .

  • Alumno

    ¿Lo has subido con la extensión .zip o .jar?

    Perdón por los anteriores mensajes, pero es que no se pueden borrar 🙁
    Gracias por compartir esta libreria que funciona a la perfección 🙂

    Para los novatos, para usar una librería como esta, a parte de cambiar la extension de .zip a .jar, hay que copiarla tal cual dentro del proyecto, luego hay que hacer click derecho sobre el proyecto. Hay que elegir la opción “Build Path” luego hay que escoger la opción “Configure Build Path”.
    Más tarde hay que ir a la pestaña Libreries darle a “Add JARs” y seleccionar la libreria que la tendremos dentro del proyecto, etc

    • atxy2k

      Que tal, es raro, por que la subi como archivo rar y veo que al descargar hace lo mismo, pero me alegra que te haya funcionado a la perfección, cualquier duda o sugerencia a sus ordenes, saludos.

      • Alumno

        Ya veo que has modificado el formato de la librería.

        Compartí tu librería con el resto de mis compañeros de clase.
        Gracias amigo
        😉

        • Alumno

          atxy2k borra el mensaje de veo que has modificado… + este.
          Gracias, vi que no lo habías modificado después de enviar el mensaje 😉

  • kike56699

    Funciona perfectamente, lo que yo modificaria y agregaria seria lo siguiente:

    1.-Cambiar nombres como los de setOnlyText por setText y setOnlyNum por setNum,es un poco mas rapido por ser mas corto.

    2.-Agregar funciones de conversion a mayusculas y conversion a minusculas

    3.-Agregar funcion de alfanumerico, osea que no acepte otros tipos de caracteres,solo numeros y letras

    • Alumno

      Me gusta más onlyText() y onlyNum() :p

    • atxy2k

      Me gusto mucho tu sugerencia, la tomare en cuenta para modificar la libreria, gracias, lo de alfanuméricos me gusto bastante, me tomare el tiempo para modificarla, gracias a ambos.

      • Alumno

        Me acabo de fijar, ya que he vuelto a usar tu librería en otra práctica de la escuela ºoº, de que cuando uso valores de tipo int me salta la excepción “NumberFormatException”,
        <b¿podrías poner de fábrica el límite a 9, ya que todo el mundo usa int? esque con 10 salta la excepción.
        Gracias 🙂 =)

        • Alumno

          podrías poner el limite a 9, esque con 10 salta la excepcion.
          Todo el mundo usa int

          Gracias 🙂 =)

          Creo que la mitad de mi anterior comentario no se ve con claridad debido, CREO, al simbolo de interrogacion 🙁

          • atxy2k

            El limite es ajustable Alumno de hecho sin ningún problema, con un setLimit(9); no tendrias que pasar por eso.

          • Alumno

            Pero, por lo menos para hacer ejercicios en la escuela, se usan variables númericas de tipo int 🙁

            Eso del limit ya lo hago, no digo que no funcione, solo que es un coñazo 😉

    • atxy2k

      La alfanumerica ya se encuentra implementada kike56699

  • atxy2k

    Por que como soy usuario de Linux no hay un muy buen software para administrar Google Drive, jajaja mas que nada por eso, utilizo mas Dropbox pero luego se me olvida y borro las carpetas, en cambio en un hosting una vez arriba ya no lo toco. xD

  • Axel Rene Linares Hernandez

    hola buenas, soy nuevo en esto, veras yo ya importe la libreria que subiste a mi programa que estoy haciendo pero nose donde poner el codigo el de:

    RestrictedTextField restricted = new RestrictedTextField(text);

    restricted.setLimit(5);

    lo trate de poner en el performed de mi caja de texto y nada , y trato de ponerla afuera y me sale error , porfa ayudame

    • Axel Rene Linares Hernandez

      y lo puse en mouseclicked y solo me sale el limite cuando pongo 5, si pongo 1 o 10 no me limita la caja de texto pero cuando le doy 5 si me limita ayuda

      • Alumno

        Tienes que ponerlo justo después de inicializar tu JTextField.

        Ejemplo:
        // Inicializar JTextField
        JTextField cajaDeTexto = new JTextField();

        // Inicializar Restricted

        RestrictedTextField restricted = new RestrictedTextField(cajaDeTexto);
        restricted.setLimit(5);

        • Axel Rene Linares Hernandez

          no entiendo, osea que tengo q inicializar a parte mi caja de texto es decir afura de todo y ahi hacerlo o donde? lo puse abajo de donde acaba el actionperfomed de la caja de texto y me sale error

          • Axel Rene Linares Hernandez

            haber si te entiendo, debo de poner lo de jtexfield cajadetexto= new jtexfield():
            restrictedtexfield(caja); eso lo tengo que poner afura y lo de :
            restricted.setLimit(5); lo debo de poner en el actionperfomed o mouseclicked de la caja de texto?

          • Alumno

            A ver si nos entendemos.

            Para esta respuesta mi JTextField se llamará cajaDeTexto, y mi restricted se llamará restricted.

            Aclarado esto, continuo con la explicación 😉

            Tienes que declarar
            private JTextField cajaDeTexto;
            debajo de class tuNombreDeLaClase, es decir, tienes que declarar tu JTextField de manera global.
            De manera que puedas usar el JTextField en cualquier método de tu aplicación.
            El Restricted lo tienes que inicializar
            RestrictedTextField restricted = new RestrictedTextField(cajaDeTexto);
            después de inicializar tu JTextField.

            El código de la gui, quedaría así:
            cajaDeTexto = new JTextField();
            RestrictedTextField restricted = new RestrictedTextField(cajaDeTexto);

            El código que te acabo de decir, lo tienes que implementar en el método que inicialice el resto de componentes gráficos (botones, labels, tablas, paneles,…).
            🙂 =) 😉

          • Alumno

            Con esta librería no tienes que usar actionperfomed ni mouseclicked.

            El mozo que ha compartido ESTO fue el que programaría esos métodos, se supone que es una ayuda para que nosotros no tengamos que escribir tanto.

            Aclaración, librerías, jar:

            Las librerías o jar son trozos de código organizados en métodos public y static (si se prefiere) con los cuales nos ahorramos escribir una y otra vez dichos métodos.

          • Axel Rene Linares Hernandez

            mmmm bueno ya declare o mas bien inicialize el textfield abajo de mi class donde inicia todo quedo asi:

            public class recarga extends javax.swing.JFrame {

            private JTextField cajaDeTexto;

            RestrictedTextField restricted = new RestrictedTextField(cajaDeTexto);

            y no me marca ni un error pero ahora donde pongo el codigo q me dijiste o mas bien donde agrego el numero de digitos que qiero es q veras o quiero un programa q tenga un textfiel que metas tu numero de 10 digitos no mas y que al darle en el boton “abonar” el numero me salga en un label1 , donde debo de poner el codigo q dices? (perdon por no entenderte es q comparado con todos ustedes yo soy novato)

          • Alumno

            ¡Hay dios mio!

            ¿Has leído el post, has leído mis comentarios?

            Tienes que inicializar EL JTextField donde inicializas tus labels, botones, textfields.

            Si te siguen quedando dudas, postea el código de tu constructor, o TODO, en respuesta a este comentario.

          • Alumno

            Si quieres te doy mi correo basura y te ayudo con más calma 😉

            Y por si no te has dado cuenta, mi nombre en este post es “Alumno”, yo soy novato :p

      • Mxrck

        No se si ya has logrado solucionarlo, pero sino bueno aquí te va paso por paso.

        1.- Debes inicializar tu JTextField
        2.- Debes inicializar el RestrictedTextField pasándole como argumento / parámetro / variable el JTextField que creaste ( ya debe estar inicializado ).
        3.- Ya solo lo configuras el Restricted como necesites.

        Como sugerencia te puedo decir, hazlo en el constructor de tu clase, usando como variables globales ambos ( TextField y Restricted ).

        Un saludo y recordar que todos fuimos novatos XD

        • atxy2k

          Olvide comentar Mxrck, ya le resolvi su duda al muchacho, pero se comnunico conmigo por facebook, lo e estado ayudando en algunos detallitos que tenia, gracias por el comment, que te encuentres excelentemente bien, saludos y exito en todo. xD

          • Brito Alan LA

            ey we solo quiero que un JTF acepte 3 letras y si es diferente de esas tres letras la borre como le hago?

          • atxy2k

            Esa función no la tiene implementada amigo.

          • atxy2k

            La funcionalidad que deseas ya ha sido implementada Brito Alan LA

    • feria19

      Hola, he utilizado la libreria para limitar el numero de caracteres y he encontrado un detallito cuando a tu jtextfield le mandas a poner una cadena. Ej: lo limitas a 40 caracteres y le mandas a poner con setText(“HOLAMUNDO”), lo que hace es que cuenta el numero de caracteres de HOLAMUNDO que serian 9 y este numero de caracteres es las veces que pone esta cadena, osea que asigna 9 veces la cadena HOLAMUNDO concatenada; a alguien mas le ha pasado esto?.

    • feria19

      Sorry axel, mi anterior msj no iba aqui, una disculpa

  • JJ Arroyo

    señor con todo su respeto le solicito que modificare su codigo por ende nesecito su nombre para referenciarlo.. de que el codigo es suyo

    • atxy2k

      Que tal arroyo, ya me comunique contigo por facebook, agradezco tu etica profesional, saludos, estamos al pendiente.

  • feria19

    Hola, he utilizado la libreria para limitar el numero de caracteres y he
    encontrado un detallito cuando a tu jtextfield le mandas a poner una
    cadena. Ej: lo limitas a 40 caracteres y le mandas a poner con
    setText(“HOLAMUNDO”), lo que hace es que cuenta el numero de caracteres
    de HOLAMUNDO que serian 9 y este numero de caracteres es las veces que
    pone esta cadena, osea que asigna 9 veces la cadena HOLAMUNDO
    concatenada; a alguien mas le ha pasado esto?

    • atxy2k

      Feria que tal, excelente día, en una ocasión me sucedio, creo que en windows pero no me volvio a pasar, dejame echarle un ojo a la librería para localizar bugs. Una disculpa.

  • David

    hola tienes alguna solucion para cuando cargas por settext se repite varias veces la cadena

  • Israel Aguirre

    Y como puedo restringir varios JtextField, ya que he intentado pero no logro hacer optimo

    • Desafortunadamente en este momento tienes que crear una instancia del restrictedTextField para cada textField, pero te aseguro que en la proxima version tratare de implementar esta funcionalidad.

      • Ronny Ochoa

        Es fácil, para restringir varios o todos los que quieras a la vez. creas una clase, con un método sin parámetros. de esta manera:

        public class restriccion {
        public JTextField prueba;

        public void PruebaRestrictedTextField()
        {
        RestrictedTextField restricted = new RestrictedTextField(prueba);
        restricted = new RestrictedTextField(prueba);
        restricted.setLimit(6);
        }
        }

        Luego en el formulario donde lo usaras instancias como publico asi:

        public restriccion res = new restriccion();

        y en en el Txt donde lo usaras le tiras los siguientes parametros cuando gane el focus o en el evento que tu desees. asi:

        res.prueba = TxtFrmExaEsfOd;
        res.PruebaRestrictedTextField();

        diciendole que esa variable que antes declaraste es igual a este TXt

        te ahorras algo de codigo, y lo puedes usar muchas veces.

        nota: oye algo que no me cuadra. cuando le fijo alguna propiedad como setOnlyTExt o Set OnlyNum me borra la info que coloque visible en el txt al arrancar. checa esto.

        }

  • Jhon J Toloza

    hola gracias por la librería y compartir pero tengo un problema cuando quiero hacer un settText() a un campo setOnlyNums(true) , este numero que le paso se repite 4 veces
    alguna idea ??

    • atxy2k

      Desafortunadamente por cuestiones laborales no e tenido la oportunidad de corregir ese bug, pero esta en la mira ntp… gracias por el comentario

  • Andres

    Que tal sirve para ingreso de letras son en mayusculas o me puenden ayudar con aquello

    • atxy2k

      Desafortunadamente actualmente no cuenta con esa funcionalidad, aunque se podría implementar

  • Eduardo

    En verdad muchas gracias…

    • atxy2k

      De nada, saludos.

  • Eduardo

    Probablemente puedas agregarle que acepte datos tipo DATE o TIME que podría ser de ayuda para bases de datos… Muchas Gracias y es una excelente ayuda.

    • atxy2k

      Gracias por el comentario, tendrémos pendiente eso para una proxima actualización.

  • Rick Hunter

    Hola sirve para validar en JPA?? si es asi cual seria el procedimiento?

    • Que tal Rick, desafortunadamente no e tenido la oportunidad de probar JPA, pero te comento que la libreria se basa aplicando eventos proporcionados por Swing, si es de ayuda, y es que lo llegas a probar, con todo gusto agradecermos tus resultados, asi mismo, ya hay una nueva version de la libreria que desafortunadamente no e podido bloguear pero se encuentra en el repositorio de Github: https://github.com/atxy2k/RestrictedTextField saludos

  • Jose Seas

    Muchas gracias por la libreria me ha servido de mucho.

    • atxy2k

      De nada, para eso estamos, saludos.

  • Manny

    Estaria bien qie permitieras modificar el texto cuando esta seleccionado y al limite de caracteres permitidos.

  • Federico

    Esta herramienta me facilitó todo mi programa; muchísimas gracias por haber creado y compartido esta librería!

    Muchísimas gracias de verdad!

  • erod

    Hola Ivan, que buen aporte tu librería y mucho mejor que la hagas publica, la he implementado y funciona perfectamente, sin embargo note una brecha en el método setlimit(numero) la cual es que si copias una cadena de mas de el limite asignado y la pegas permite hacerlo, esta permite hacerlo, estoy buscando la manera de hacer que se valide eso, estaré pendiente de el tema, muchas gracias;

    • Que tal buen día, perdona el retraso, estoy al tanto del bug, trataré de solucionarlo en la proxima versión. 🙂

  • Gustavo

    Excelente muy buena aportación, funciona de maravilla!
    Muchas gracias

  • Baudelio Andalon

    Eres la ostia tio, he querido contactarlos pero la opcion de contacto esta deshabilitada, me aparece solo como si fuera texto uso Google Chrome

    • Que tal, buen día, muchas gracias por tu comentario, tienes toda la razón, no nos habiamos fijado, ya lo activamos, si ves algunos errores de estilos, es por que el tema que tenemos actualmente es viejo, proximamente renovaremos el sitio. 🙂

  • Hans

    hola Ivan Alvarado Dias existe alguna forma de que mi jtextfield se pueda colocar un fondo descriptivo(comentario dentro del cuadro de texto). help :C

  • Mario Enrique Zuñiga Cano

    genial tu aporte hombre muy útil y muy simple … solo seria genial q agregues los docs de cada método… pero por lo demás es un 10 😀

  • Alberto Franco

    Hola, me parece excelente tu librería, la primera versión que subiste en mediafire me da errores al querer usar el alphanumeric, por lo que vi que la tienes actualizada en github.

    me puedes explicar como usarla? veo que está en ZIP y no en JAR, y al ver ambos archivos comprimidos veo que la estructura es distinta, solo debo de cambiar la extensión a JAR?

    Estoy trabajándola con Netbeans, si me pudieras echar una mano con ello te lo agradeceré mucho.

    Saludos.

    • Alberto que tal, gracias por tu comentario, pues te explico, la librería que está en github es el proyecto completo de la libreria, basicamente puedes clonarlo con git sin problemas, abrirlo con netbeans, y al compilarlo, te generará un .jar, que será el que ya podrás usar sin problema, igual si encuentras errores puedes corregirlos, hacer algún pullrequest, o agregarle funciones.

  • André Tanaka

    textFieldEntradaCpf.addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
    super.keyTyped(e);
    if(textFieldEntradaCpf != null && textFieldEntradaCpf.getText() != null && textFieldEntradaCpf.getText().length() >= 9){
    e.setKeyChar((char) KeyEvent.VK_CLEAR);
    }
    }
    });

  • Leslie Sinchiguano

    Buenas disculpe, la libreria acepta un array de objetos? lo que pasa que se tiene muchos JTextField y no se si permita restringir a multiples objetos con una sola instancia o hay que instanciar a la libreria varias veces ssegún la cantidad de los objetos tipos JTextfield?

    • Hola que tal, desafortunadamente la librería no cuenta por el momento con ésta funcionalidad, pero sin bienvenidos pull request.

  • Leslie Sinchiguano

    Puede añadir un constructor que acepte un array tipo JTextfield o de objetos para asi poder hacer multiples limitaciones