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));
8/10/08 a las 6:05 pm
Si los conociera dejaría un comentario en este mismisimo lugar…
Muy buena la página, sigan agregando cosas asi crece.
21/10/08 a las 9:11 am
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 ^^!
26/10/08 a las 7:54 pm
Tenés razón Henry, ya lo corregí. Gracias por comentar.
18/11/08 a las 2:18 am
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!
19/11/08 a las 5:10 am
me ha alivianado bastante tu codigo. agregaré tu página a mis favoritos. gracias.
19/11/08 a las 5:59 am
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.
19/11/08 a las 11:28 pm
Me alegro que les haya servido. Gracias Porfirio y Edgar por comentar. Saludos.
24/2/09 a las 6:01 pm
hola genial tu codigo justo lo que buscaba gracias por tu aporte
9/3/09 a las 6:50 pm
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.
12/3/09 a las 2:28 am
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.
17/3/09 a las 5:45 am
Muuuuuuy buenoooooooo excelente trabajo!!!! me ahorraste mucho trabajo gracias!!!
17/3/09 a las 7:25 pm
Hola Daniel, es bueno saber que te fue útil.
Gracias por comentar. Saludos.
24/3/09 a las 6:36 pm
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.
24/3/09 a las 6:37 pm
me falto comentar que estoy trabajando con java.
28/3/09 a las 12:40 am
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.
28/3/09 a las 1:06 am
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.
31/3/09 a las 4:19 pm
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.
1/4/09 a las 12:37 pm
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.
1/4/09 a las 3:01 pm
Qué tal Hernán? gracias por la información, lo integraré a mi aplicación. Otra vez Graaciiaaaas!!!!!!!!!!!!!
2/4/09 a las 12:40 am
Hola Melina, que bueno que te haya servido!.
Gracias a ti por comentar. Saludos.
28/7/09 a las 7:57 pm
Saludos \"hernan\" Gracias, por estos ejemplos que me han ayudado mucho…, estaba buscando algo mo esto, Super Genial los ejemplos, saludos y grax!!!
29/7/09 a las 5:18 am
MUY BUENOS EJEMPLOS, TUS CODIGOS ME SALVARON LA VIDA MUCHAS GRACIAS…
30/7/09 a las 6:15 pm
Maximalito: gracias por comentar, me alegro que te hayan servido los ejemplos. Saludos.
Marios: de nada! gracias por comentar. Saludos.
18/8/09 a las 10:01 pm
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.
17/9/09 a las 12:41 am
buuuu, mañana es mi final de java de primer ciclo y no estudie naaa, buuuu
12/11/09 a las 9:32 pm
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?
13/11/09 a las 2:08 pm
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.
13/11/09 a las 2:25 pm
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.
13/11/09 a las 4:27 pm
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!.
13/11/09 a las 4:30 pm
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…
15/11/09 a las 9:10 pm
EXELENTE APORTE ME FUNCIONA PARA NETBEANS ,MUCHISIMAS GRACIAS——
17/11/09 a las 1:17 am
De nada Jose! y gracias a vos por comentar… Saludos!
18/11/09 a las 9:13 am
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
19/11/09 a las 2:20 am
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?
26/11/09 a las 2:53 am
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
25/1/10 a las 7:19 pm
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 !!!!
14/3/10 a las 10:57 pm
Hola Hernan, Thanks a lot.
17/3/10 a las 2:41 pm
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
18/3/10 a las 12:16 am
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();
}
20/3/10 a las 1:11 pm
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
20/3/10 a las 1:15 pm
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.
12/4/10 a las 6:46 pm
estimado ese fue un gran aporte de verdad q esta bien chevere y esta perfecto muchas gracias
15/4/10 a las 2:21 pm
que buenos ejempos….la verdad me sirvieron de mucho……gracias por tomarte la molestia y el tiempo para subir estos ejemplos
30/5/10 a las 1:00 am
Gracias men me atudo mucho tus codigos no se como agradecerte
30/5/10 a las 9:28 pm
Gracias Carlos, Jor-G y alex por comentar el post.. es bueno saber que les sirvió. Saludos!
7/6/10 a las 4:43 am
gracias por el aporte
9/6/10 a las 7:27 pm
Hola hernan gracias por esos ejemplos me fueron de gran ayuda. saludos
15/6/10 a las 1:41 am
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
15/6/10 a las 3:54 am
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!!!”);
}
}
}
27/6/10 a las 10:33 pm
Excelente aporte señores !!, sigan asi!!! le recomende la pagina a quien pude…
27/6/10 a las 10:38 pm
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!
6/7/10 a las 4:51 pm
Por favor envieme un limitador solo numero Listo para ejecutar en java swing.
gracias compañero…. Espero mi solucion
6/8/10 a las 9:42 pm
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