26 octubre 2005

Captura de teclas en un JTextField de java

Para limitar el tipo de caracteres o la entrada en un JTexField, tenemos muchas posibles soluciones.

En http://members.lycos.co.uk/chuidiang/ejemplos/JTextField/limita_caracteres.html hay una en la que se usa un Document.

Otra solución de más bajo nivel consiste en capturar las teclas según se pulsan y decidir si se aceptan o no para escribir en el JTextField. Por ejemplo, podemos capturar la tecla y escribirla en el JTextField sólo si es un número y rechazarla si es una letra.

Para ello, tenemos que añadir un KeyListener a nuestro JTextField. Cada vez que se pulse una tecla, se avisará al método keyTyped(KeyEvent e) de nuestro KeyListener. Del KeyEvent que nos pasan como parámetro podemos obtener qué tecla se ha pulsado (qué caracter) y rechazarla o no según nos convenga.

Por ejemplo, para aceptar sólo números, el código sería este:

JTextField textField = new JTextField(10);
textField.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent e)
{
char caracter = e.getKeyChar();
if(((caracter < '0') ||
(caracter > '9')) &&
(caracter != KeyEvent.VK_BACK_SPACE))
{
e.consume();
}
}
});

Además de comprobar si caracter no está entre 0 y 9, comprobamos también que se admita la tecla VK_BACK_SPACE, porque si no, no podremos borrar lo que escribamos.

El método e.consume() hace que esa pulsación de tecla se rechace y el JTextField no la trate. El resultado es que cualquier cosa que no sea una cifra o el backspace se rechaza. Si queremos meter decimales, deberíamos aceptar también el punto decimal.

Este método tiene sin embargo una pega respecto al Document. Si en otro lugar copiamos un cacho de texto y lo pegamos sobre nuestro JTextField, eso no es equivalente a pulsar las teclas del texto copiado de una en una, sino que simplemente habremos pulsado Ctrl-V (en windows). Este control el JTextField lo trata directamente y pega el texto dentro del JTextField, sin ningún tipo de comprobación de si es o no un número.

Por este motivo, salvo que queramos algún "efecto especial" como hacer "beep" cada vez que se pulse una tecla que no se debe, es mejor usar el Document, o bien, debemos hacer un tratamiento algo más complejo de las teclas a pulsar.

8 comentarios:

Anónimo dijo...

Hola:

Probe un programa parecido a e este, resulta que al probaralo con JTextField el métodp evt.consume(), no hace nada. Cambie por TextFeld y así funcionó. Que pasará, por no funciona con JTextField

Alex dijo...

Si funciona con JTextField :

El JTextField se llama txtRaiz en su evento KeyTyped le pones el codigo y funciona:

private void txtRaizKeyTyped(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
char caracter = evt.getKeyChar();
if(((caracter < '0') ||
(caracter > '9')) &&
(caracter != evt.VK_BACK_SPACE))
{
evt.consume();
}
}

Gracias por el codigo original.

chuidiang dijo...

Hola:

Este mismo código, más otros mecanismos alternativos para lo mismo, están en editor que sólo admite digitos

Sed buenos.

Anónimo dijo...

hola, como le puedo hacer para meter el mismo dato varias veces en un textfield??? por ejemplo un 1

JOSÉ 100% dijo...

Hola me llamo josé, quisiera saber como puedo hacer para validar un Jtextfield de tal manera que solo pueda teclear no mas de 5 numeros... de antemado gracias.

Anónimo dijo...

-------------------------------------
char caracter = evt.getKeyChar();
if (jtcanti.getText().length() >= 8) {
evt.setKeyChar('\0');

}
------------------------------

JOSÉ 100% dijo...
Hola me llamo josé, quisiera saber como puedo hacer para validar un Jtextfield de tal manera que solo pueda teclear no mas de 5 numeros... de antemado gracias.

Anónimo dijo...

hola alex gracias por la codificacion si resulto, ahora tengo un problema quiero saber el metodo para que al momento que selecciono el JTextField se seleccione todo el texto. gracias

Anónimo dijo...

que bien amigo...si funciona...muuuuuuchisimas gracia...llevaba un buen buscandolo.