Presionar un jButton con la tecla Enter

Java Agregar comentario

Por lo general en los sistemas de gestión es requisito fundamental que todas(o la gran mayoría) de las acciones sean posibles a través del teclado.Ahora bién, uno podría pensar que el problema ya esta solucionado por netbeans, ya que este me permite por defecto accionar un botón presionando la tecla Espacio cuando éste se encuentra en foco. Pero si hacemos un estudio del comportamiento de los usuarios frente a una aplicación del tipo gestión se puede observar que para ellos es natural aceptar una acción mediante la tecla Enter y no Espacio.
Para solucionar este problema podemos seguir cualquiera de las siguientes métdos:

1ºMétodo: definir un nuevo InputMap
Para definir un nuevo inputMap lo primero que tenemos que hacer es importar la librerias necesarias:

import java.awt.event.KeyEvent;
import javax.swing.InputMap;
import javax.swing.KeyStroke;

Ahora supongamos que queremos que el botón btnAceptar se presione con la tecla Enter cuando esté en foco, entonces hacemos lo siguiente:

InputMap map = new InputMap();
 
map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "pressed");
map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "released");
 
btnAceptar.setInputMap(0, map);

2ºMétodo:agregar un escuchador de teclas
Primero, importamos las librerías necesarias:

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

Segundo, definimos una subclase dentro de la clase principal que herede de keyAdapter y que al detectar que se presionó la tecla Enter haga lo mismo que hace el botón btnAceptar cuando se hace click en el mismo. Para ello hacemos lo siguiente:

public class PresionarTecla extends KeyAdapter {
 
      public void keyPressed(KeyEvent ke) {
          if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
              btnAceptarActionPerformed(null);
          }
      }
}

Tercero y último, agregamos un escuchador de teclas al botón en cuestión(btnAceptar para el ejemplo).
Observación: lo siguiente lo hacemos en el constructor de la clase principal.

btnAceptar.addKeyListener(new PresionarTecla());

10 Comentarios en “Presionar un jButton con la tecla Enter”

  1. Moik2007 Dice:

    Si funciona pero hay que poner el foco en el boton primero…….necesito algo que sin tener el foco en el boton y al presionar enter me presione el boton

  2. Cristian Dice:

    donde definis el constructor en el metodo II?
    No se si podes tener una subclass public che.
    No me sale ninguno de los dos, pero no entiendo porque mierda.

  3. hernan Dice:

    Cristian: Hay 2 clases, la principal que puede ser el main y la subclase PresionarTecla.
    La clase principal tiene su respectivo constructor, mientras que la subclase no necesita constructor ya que esta heredando de otra clase y lo único que hace esta subclase es sobrecargar la función KeyPressed.
    Por lo tanto, la última linea de código la tenes que agregar al constructor de la clase principal, no de la subclase.
    Espero haberte ayudado, pero si todavía te quedan dudas, esta tarde subo los ejemplos funcionando en netbeans. Saludos.

  4. Cristian Dice:

    Hernan:
    Aplique el metodo I y tengo la misma inquietud de Moik sobre como hacer para que funcione sin poner el foco en el boton.
    Estuve probando los eventos del Jframe que utilizo en Netbeans pero no esta dando resultados.
    Al final puse el codigo que implementa el InputMap dentro del constructor del Jframe.
    Voy a mirar lo que hiciste en Netbeans… ahora mismo y luego te cuento.
    Gracias por la ayuda.

  5. hernan Dice:

    Cristian y Moik2007: para asignar un botón por defecto lo que hay que hacer es:
    miJFrame.rootPane.setDefaultButton(miJButton);

    donde miJFrame es la ventana a la cual le querés asignar el botón por defecto(si estas dentro del JFrame, en vez de esto pones this) y miJButton el botón que queres que sea el por defecto ;) .
    Saludos.

  6. elhu2 Dice:

    Exelente.
    tenia la misma duda que cristian y miik2007, y se soluciono con esa simple linea muchas gracias.

  7. hernan Dice:

    elhu2: De nada!, gracias a vos por comentar. Saludos.

  8. pedro Dice:

    Hola Hernan.

    respecto a la línea que pusiste: miJFrame.rootPane.setDefaultButton(miJButton);

    después de un rato luchando, la he hecho funcionar, muchas gracias.

    pd: por supuesto que los 3 métodos que colocaste al inicio son de gran utilidad, y me las estudiaré :)

  9. hernan Dice:

    Pedro: Que bueno que te sirvió, aunque hayas tenido que luchar un poco.. pero así se aprende ;) . Gracias por tu comment. Saludos!

  10. alternado Dice:

    hola Hernan usualmente yo no dejo comentarios pero esperando que me respondas me arriesgo.
    Weno mi duda consiste en que a pesar de haber visto y provado tus metodos ,si funcionan por cierto, yo kiero asignar teclas a diferentes botones es decir quiero que apretando escape se cierre la ventana “this.dispose()” y apretando la tecla enter me salga un mensaje,etc; ambos botones deben funcionarme sin necesidad de ponerlos en foco y en cualquier momento.
    Desde ya , gracias .
    psdt:si es posible quisiera que me enviaras tu ejemplo

Deja un Comentario

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