Limitar caracteres en un JTextfield

Java Agregar comentario

Por diversas razones tenemos la necesidad de evitar que un usuario ingrese ya sea números, letras, ciertos caracteres especiales o más de un número máximo de caracteres.
Para lograr estos objetivos voy a mostrar algunos de ejemplos de clases que implementan algun tipo de limitación en los datos ingresados.

Primer ejemplo: Limitar el jTextField a solo letras y espacios.
Nombre de la clase: LimitadorSoloLetras.java

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
 
/**
* @author Hernán
*/
public class LimitadorSoloLetras extends PlainDocument{
 public void insertString(int arg0, String arg1, AttributeSet arg2) throws BadLocationException
 {
     for (int i=0;i<arg1.length();i++)
        if (!Character.isLetter(arg1.charAt(i)) && !Character.isSpaceChar(arg1.charAt(i)))
           return;
     super.insertString(arg0, arg1, arg2);
 }
}

Modo de uso: supongamos que tenemos un JTextField llamado txtNombres, entonces lo que tenemos que hacer es:

txtNombres.setDocument(new LimitadorSoloLetras());

Segundo Ejemplo: Limitar el jTextField a solo números.
Nombre de la clase: LimitadorSoloNumeros.java

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
 
/**
* @author Hernán
*/
public class LimitadorSoloNumeros extends PlainDocument{
 public void insertString(int arg0, String arg1, AttributeSet arg2) throws BadLocationException
 {
     for (int i=0;i<arg1.length();i++)
        if (!Character.isDigit(arg1.charAt(i)))
           return;
     super.insertString(arg0, arg1, arg2);
 }
}

Modo de uso: supongamos que tenemos un JTextField llamado txtDNI, entonces lo que tenemos que hacer es:

txtDNI.setDocument(new LimitadorSoloNumeros());

Tercer Ejemplo: Limitar el jTextField a solo letras y espacios y además limitar la cantidad de caracteres ingresados.
Nombre de la clase: LimitadorSoloLetrasNroMax.java

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
 
/**
* @author Hernán
*/
public class LimitadorSoloLetrasNroMax extends PlainDocument{
 
  private JTextField miJTextField;
  private int nroMaxCaracteres;
  public LimitadorSoloLetrasNroMax(JTextField mijtext, int nroMaxCaract){
      miJTextField=mijtext;
      nroMaxCaracteres=nroMaxCaract;
  }
 public void insertString(int arg0, String arg1, AttributeSet arg2) throws BadLocationException
 {
     for (int i=0;i<arg1.length();i++)
        if ((!Character.isLetter(arg1.charAt(i)) && !Character.isSpaceChar(arg1.charAt(i)))||(miJTextField.getText().length()+arg1.length())>nroMaxCaracteres)
           return;
     super.insertString(arg0, arg1, arg2);
 }
}

Modo de uso: supongamos que tenemos un JTextField llamado txtApellidos, entonces lo que tenemos que hacer es:

txtApellidos.setDocument(new LimitadorSoloLetrasNroMax(txtApellidos,30));

Cuarto Ejemplo (a pedido de trancelex): Limitar el jTextField a solo letras y espacios, y además cuando se llegue al número maximo pasar al próximo campo.
Nombre de la clase: LimitadorSoloLetrasNroMaxV2.java

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
 
/**
* @author Hernán
*/
public class LimitadorSoloLetrasNroMaxV2 extends PlainDocument{
 
  private JTextField miJTextField;
  private int nroMaxCaracteres;
  public LimitadorSoloLetrasNroMaxV2(JTextField mijtext, int nroMaxCaract){
    miJTextField=mijtext;
    nroMaxCaracteres=nroMaxCaract;
  }
  public void insertString(int arg0, String arg1, AttributeSet arg2) throws BadLocationException{
    for (int i=0;i<arg1.length();i++){
      if ((miJTextField.getText().length()+arg1.length())>nroMaxCaracteres){
        miJTextField.transferFocus();
        return;
      }else if (!Character.isLetter(arg1.charAt(i)) && !Character.isSpaceChar(arg1.charAt(i)))
        return;
    }
    super.insertString(arg0, arg1, arg2);
  }
}

Modo de uso: supongamos que tenemos un JTextField llamado txtApellidos, entonces lo que tenemos que hacer es:

txtApellidos.setDocument(new LimitadorSoloLetrasNroMaxV2(txtApellidos,30));

53 Comentarios en “Limitar caracteres en un JTextfield”

  1. Muy bueno Dice:

    Si los conociera dejaría un comentario en este mismisimo lugar…

    Muy buena la página, sigan agregando cosas asi crece.

  2. Henry Dice:

    me sirvio bastante los codigos
    muchas gracias

    por cierto encontre un pequenio error en el codigo de :
    LimitadorSoloLetrasNroMax

    su codigo constructor esta cn el nombre de
    LimitadorSoloLetras
    deberia ser : LimitadorSoloLetrasNroMax

    solo eso ! ^^!
    y gracias nuevament x el code ^^!

  3. hernan Dice:

    Tenés razón Henry, ya lo corregí. Gracias por comentar.

  4. Porfirio Dice:

    xD a la…. se la rifaron…. soy un programador en java con algo de experiencia pero hasta ahorita no habia tenido la necesidad de limitar directamente las entradas de lso usuairos, y realemnte andaba “pariendo cuates” porque no veia por donde epro realemnte su pagina me ayudo una enormidad a superar ese problema

    Gracias!

  5. edgar Dice:

    me ha alivianado bastante tu codigo. agregaré tu página a mis favoritos. gracias.

  6. edgar Dice:

    estas clases me han ahorrado mucho tiempo en un proyecto de java+oracle que ando realizando, pues han resuelto mucha de la parte dificil de la validación antes de meterlo a la base de datos para no dejar para no permitir al usuario meter basura. otra vez gracias.

  7. hernan Dice:

    Me alegro que les haya servido. Gracias Porfirio y Edgar por comentar. Saludos.

  8. harold velosa Dice:

    hola genial tu codigo justo lo que buscaba gracias por tu aporte

  9. trancelex Dice:

    muy buen ejemplo, pero me podrias decir como hacer para que llegue al maximo del limite, me mande a otro campo de texto el cursor.

  10. hernan Dice:

    harold velosa: me alegro que te haya servido. Saludos
    trancelex: para poder hacer lo que tu quieres debes agregar una nueva condicion que evalúe: que si se llego al límite entonces cambie el foco al próximo campo.
    Para que lo puedas ver más claro he agregado un cuarto ejemplo. Espero que te sirva.
    Saludos y disculpa la demora.

  11. Daniel Dice:

    Muuuuuuy buenoooooooo excelente trabajo!!!! me ahorraste mucho trabajo gracias!!!

  12. hernan Dice:

    Hola Daniel, es bueno saber que te fue útil.
    Gracias por comentar. Saludos.

  13. Minnie Dice:

    Hola
    Alguien puede ayudarme con el siguiente problema? tengo una base de datos en oracle, los registros de las tablas contienen datos entre ellos caracteres como signos de mas, asteriscos, ampersan, signo de numero, etc. El detalle está en que cuando leo un registro y quiero obtener informacion de éste por medio de un substring, la cadena se trunca en la posicion donde encontro el simbolos especial, alguien me puede indicar como puedo evitar que se trunque? gracias por el apoyo. Saludos.

  14. Minnie Dice:

    me falto comentar que estoy trabajando con java.

  15. Minne Dice:

    Hola

    He encontrado la solución al problema planteado por mi misma.
    Resulta que al realizar una consulta a una tabla de oracle, dejaba el resultado en un objeto de tipo String, el cual enviaba como parámetro en una url para dirigirme a otro jsp; como el objeto String contenia caracteres especiales tales como el &, ?, etc. Y como el separador de parametros de la url son justamente el signo ? y el & era lo que estaba generando el conflicto.

    Hernán “misión cumplida” jaja.

    Saludos.

  16. hernan Dice:

    Hola Minnie, me alegro que hayas podido resolver tu problema.
    Gracias por comentar la solución, ya que es una buena forma de ayudar a otros que se encuentren con la misma dificultad. Saludos.

  17. Melina Dice:

    qué tal? estoy trabajando con java y ¿Alguien sabe cómo validar una cadena contra un lay-out? ejemplo: [A-Z,Ñ]{3,4}[0-9]{2}[0-3]{2}[0-9]{2} es decir, que revise que solo haya 3 o 4 caracteres de la A a la Z, 2 numeros del 0 al 9; 2 numeros del 0 al 3 y dos numeros del 0 al 9. Me urge, por favor alguien que me ayude.

  18. hernan Dice:

    Hola Melina, lo primero que debes hacer es poner la librería Pattern(que sirve para comprobar patrones) dentro de tu archivo java, para ello escribes lo siguiente:
    import java.util.regex.Pattern;

    y luego mediante una condición compruebas la validez de tu patrón con la expresión que quieras:
    String strExpresion=ABC890145;
    if(Pattern.matches(”[A-Z,Ñ]{3,4}\\d{2}[0-3]{2}\\d{2}”, strExpresion))
    System.out.println(”Expresión Válida”);
    else
    System.out.println(”Expresión Inválida”);

    Espero que te haya sido útil. Saludos.

  19. Melina Dice:

    Qué tal Hernán? gracias por la información, lo integraré a mi aplicación. Otra vez Graaciiaaaas!!!!!!!!!!!!!

  20. hernan Dice:

    Hola Melina, que bueno que te haya servido!.
    Gracias a ti por comentar. Saludos.

  21. Maximalito Dice:

    Saludos \"hernan\" Gracias, por estos ejemplos que me han ayudado mucho…, estaba buscando algo mo esto, Super Genial los ejemplos, saludos y grax!!!

  22. Marios Dice:

    MUY BUENOS EJEMPLOS, TUS CODIGOS ME SALVARON LA VIDA MUCHAS GRACIAS…

  23. hernan Dice:

    Maximalito: gracias por comentar, me alegro que te hayan servido los ejemplos. Saludos.
    Marios: de nada! gracias por comentar. Saludos.

  24. ol Dice:

    Hola tu codigo me ayudo bastante, pero como podria hacer para que ademas de letras y espacios me acepte el punto. Y como haria para validar un textfield con doubles.

  25. jonatan Dice:

    buuuu, mañana es mi final de java de primer ciclo y no estudie naaa, buuuu

  26. Sergio Dice:

    Hernan, estoy trabajando en NetBeans 6.7.1 y tengo un JTextField generado automáticamente por uno de los asistentes (el de master/detail).
    Primero que al crear la clase LimitadorSoloLetras me arroja un error en la última línea sobre “arg2″. Me dice “Cannot find symbol” sugiere que convierta a “(javax.swing.text.AttributeSet) arg2″. Haciendo esto, se va el error.
    Pero luego, cuando quiero implementar la case, coloco “nombreField.setDocument(new LimitadorSoloLetras());” debajo de “nombreField = new javax.swing.JTextField();” pero no pasa nada… no me valida el contenido del textfield.
    Alguna sugerencia?

  27. hernan Dice:

    Hola Sergio, recién lo estuve probando al código en el Netbeans 6.7.1 y funciona correctamente. Fijate de haber importado todas las librerías que necesitas y haber extendido tu clase Limitadora de PlainDocument. Si seguís con problemas avísame y voy a ver de subir el proyecto en Netbeans. Saludos.

  28. Sergio Dice:

    Disculpame la molestia Hernan, pero sabes que pruebo y no me funciona, si bien no me da ningun error ahora, no me limita los caracteres.

    Estas rutinas, te validan el texto despues que lo escribiste y saliste del textfield o mientras lo estas escribiendo (como un JFormattedTextField con máscara) ?

    Te animas a mandarme tu proyecto?

    Muchas gracias

    Y otro pedido, podes poner un posto sobre como relacionar un combobox con un determinado campo de una tabla usando NetBeans…

    Gracias nuevamente.

  29. hernan Dice:

    Hola Sergio, ahí te paso un ejemplo de como usar el LimitadorSoloLetras: http://www.mediafire.com/file/zmykynin2mz/EjemploLimitador.rar

    Espero que te sirva y puedas solucionar tu problema, y no es ninguna molestia ;) .
    Por cierto respecto a tu pedido, te refieres a cargar datos de un campo de una base de datos en un combobox?

    Saludos!.

  30. Sergio Dice:

    Yo estoy creando formularios usando la plantilla master/detail de NetBeans y en determinados forms tengo datos que son por ejemplo, nombres de localidades que tienen que cargarse desde una tabla de la base de datos… entonces no me queda claro como hacer para que el combobox me muestre los nombres de las localidades pero me devuelva un valor númerico correspondiente al ID de la localidad porque eso es lo que quiero guardar en mi tabla.

    Nuevamente, muchas gracias y voy a probar lo que me colgaste…

  31. jose Dice:

    EXELENTE APORTE ME FUNCIONA PARA NETBEANS ,MUCHISIMAS GRACIAS——

  32. hernan Dice:

    De nada Jose! y gracias a vos por comentar… Saludos!

  33. jose Dice:

    TENIA UNA DUDA PERO YA LA RESOLVI:
    necesitaba validar una cadena de numeros pero decimales y tenia problemas con el metodo LimitadorSoloNumeros pero ahora ya la resolvi ,lo que hice fue
    Aqui te van aparecer todos lo eventos que se le pueden agregar a un jtexfield
    en Eventos->key->key Released

    private void preKeyReleased(java.awt.event.Key… evt) {
    if(!pre . getText() . matches(”[0-9]+[.]?[0-9]*”) ) {
    pre.setText(”");
    }
    }

    ESTA PAGINA ME FUE DE GRAN AYUDA GRACIAS, AQUI LES DEJO ESTO POR SI LO LLEGASEN A NECESITAR

  34. Helard Dice:

    Hola, yo tengo un problemilla… trabajo con Frame, pero cuando pongo el setDocument() no me lo reconoce, que es lo q pasa? ayudame por favor

    public New_Trab() {
    initComponents();
    txtcod.requestFocus();
    setSize(750, 700);
    txtcod.setDocument(new ValidarNumero());
    }
    me aparece como metodo no reconocido… que puedo hacer?

  35. Juan Dice:

    Hola, muchisimas gracias por estos codigos, ya hace tiempo andaba buscando algo para limitar a jtextfield y que solo el usuario ingresara letras o numeros, tu codigo me ha servido bastante, te fecilito y de antemano un agradecimiento total

  36. Natalia Elizabeth Dice:

    Hola Her, me re re sirvió lo de los limitadores!! Muchas gracias!!!! :) ­Aprovecho q veo q sabés del tema y te cuento: Estoy haciendo una aplicación de escritorio y quería saber si podía usar ejb (que todos los ejemplos que he visto son para aplicaciones web) o si tengo que usar otra cosa (como Spring) para que los clientes (aplicación de escritorio) accedan al programa del servidor (que también es una aplicación de escritorio) Muchas gracias otra vez !!!!

  37. Hector Serrano Dice:

    Hola Hernan, Thanks a lot.

  38. isabel Dice:

    Hola Buenos dias

    He intentado resolver un ejercicio y por mas que he intentado no he logrado tener la solucion y necesito pressentarlo como tarea ya estoy baastante desesperada y por eso pido su ayuda, le adjunto el ejercicio

    1. Escriba una aplicación java que muestre los siguientes patrones uno debajo de otro. Use ciclos for para generar los patrones, cada asterisco debe imprimirse con una instrucción System.out.print(“*”). Puede utilizar una instrucción System.out.println(), para posicionarse en la línea siguiente y puede utilizarse una instrucción como System.out.print(“ “), para mostrar un espacio en blanco para los últimos patrones.

    * ********** ********** *

    ** ********* ********* **

    *** ******** ******** ***

    **** ******* ******* ****

    ***** ****** ****** *****

    ****** ***** ***** ******

    ******* **** **** *******

    ******** *** *** ********

    ********* ** ** *********

    ********** * * **********

    Muchas gracias por la ayuda

  39. hernan Dice:

    Natalia: la verdad nunca usé ejb o spring, asi que no te podría decir. Saludos!
    Hector: de nada!. Gracias por comentar!
    Isabel: la idea que se me ocurre en este momento sería la siguiente: anidar 2 for’s y luego utilizar condicionales para decidir si imprimo un asterisco o un espacio, pero no se si te dejan usar condicionales. De cualquier modo te dejo mi solución y me avisas si te sirvió. Saludos!

    int n=10;
    int m=25;
    for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
    if((j==i+1)||(j==m-i-2)||(j==m/2))
    System.out.print(" ");
    else
    System.out.print("*");
    }
    System.out.println();
    }

  40. Diego Dice:

    Buenas, muchas gracias por el aporte, siempre hay algo constructivo que aprender, pero la verdad tengo una duda puesto que siempre que trato de ejecutar el programa, usando el jcreator, me pide que seleccione un método :\The system couldn´t find a suitable main method, Do you want to select a main method or continue?\ al dar continuar, el programa se ejecuta, pero sale
    Usage: java [-options] class [args...]
    (to execute a class)
    or java [-options] -jar jarfile [args...]
    (to execute a jar file)

    where options include:
    -client to select the \client\ VM
    -server to select the \server\ VM
    -hotspot is a synonym for the \client\ VM [deprecated]
    The default VM is client.

    -cp

  41. Diego Dice:

    Por otro lado, tratando de no usar el throws, escrbio el siguiente código, y tambien presenta problemas por el metodo main.

    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;
    public class limitesletras extends PlainDocument{
    public void insertString(int arg0, String arg1, AttributeSet arg2)
    {
    try
    {
    for (int i=0;i<arg1.length();i++)
    if (!Character.isLetter(arg1.charAt(i)) && !Character.isSpaceChar(arg1.charAt(i)))
    {return;
    super.insertString(arg0, arg1, arg2);
    }
    catch(BadLocationException e) {
    System.out.println("ADVERTENCIA SOLO SE PERMITEN LETRAS Y ESPACIOS ");
    System.out.println(" \n " + e.toString());}
    }
    }

    No llevo mucho tiempo trabajando en java, asi que espero entienda mi inocencia, le agradezco cualquier aporte.

  42. Carlos Botello Dice:

    estimado ese fue un gran aporte de verdad q esta bien chevere y esta perfecto muchas gracias

  43. Jor-G Dice:

    que buenos ejempos….la verdad me sirvieron de mucho……gracias por tomarte la molestia y el tiempo para subir estos ejemplos

  44. alex Dice:

    Gracias men me atudo mucho tus codigos no se como agradecerte

  45. hernan Dice:

    Gracias Carlos, Jor-G y alex por comentar el post.. es bueno saber que les sirvió. Saludos!

  46. santo Dice:

    gracias por el aporte

  47. Vane Dice:

    Hola hernan gracias por esos ejemplos me fueron de gran ayuda. saludos

  48. Fernando Dice:

    Excelente aporte amigos, muy detallado en verdad me ha sido muy util, aca les dejo un pequeño aporte q es mi validacion de jtxtfield a solo letras:
    suponiendo q tenemos un jtxtfield llamado nombre

    private void nombreKeyPressed(java.awt.event.KeyEvent evt) {
    String valor=”";
    valor=nombres.getText();
    // obtenemos el contenido del jtxtfield.
    valor.replace(” “, “”);
    //Se eliminan los espacios en blanco.
    if( evt.VK_ENTER == evt.getKeyCode() ) {
    //Tomndo el valor de la tecla presionada igual a “ENTER”
    if(Pattern.matches(”[a-zA-Z]“, valor)){
    //verificamos con patetern.maches si solo son letras
    apellidos.requestFocus();
    //pasamos el enfoque al siguiente txtfield
    }else{
    JOptionPane.showMessageDialog (null, “Este campo solo acepta digitos tipo letra”);}
    } // sino contiene solo letras lanzamos un mensaje

  49. Fernando Dice:

    El siguiente valida solo letras y espacios:

    @SuppressWarnings(”static-access”)
    private void apellidosKeyPressed(java.awt.event.KeyEvent evt) {
    String entrada = “”;
    entrada=apellidos.getText();
    Pattern patron = Pattern.compile(”[^A-Za-z ]“);
    Matcher encaja = patron.matcher(entrada);
    if( evt.VK_ENTER == evt.getKeyCode() ) {
    if(!encaja.find()){
    contacto.requestFocus();
    }else{
    JOptionPane.showMessageDialog (null, “Solo ingrese letras!!!”);
    }
    }
    }

  50. david.principiante Dice:

    Excelente aporte señores !!, sigan asi!!! le recomende la pagina a quien pude…

  51. david.principiante Dice:

    tengo una duda, si es posible me regalaran el codigo de la esfera – menu de su página,y cómo implementarla en netbeans.
    De antemano mis sinceras gracias!

  52. Henry Reyes Dice:

    Por favor envieme un limitador solo numero Listo para ejecutar en java swing.
    gracias compañero…. Espero mi solucion

  53. El jim Dice:

    Hola Hernan, los codigos estan exelentes pero el problemas es que cuando comienzo a escribir en el TextField automaticamente desaparece el caracter o numero que ingresé, como hago para que los caracteres se queden dentro de el jTextField

Deja un Comentario

WP Theme & Icons by N.Design Studio
Posts en RSS Comentarios en RSS Iniciar sesión