En algunas ocasiones mientras trabajamos con ventanas en Java es sumamente útil adoptar ciertos comportamientos al presionar las teclas, por ejemplo, que la tecla <<Escape>> cierre la aplicación o que la tecla <<Intro>> (o Enter) haga las veces de tabulador.
Para realizar lo anterior basta implementar un pequeño código en nuestra aplicación de tal manera que, al presionar la tecla que queramos realice el comportamiento que nosotros deseamos, en este caso explicaré cómo hacer que la tecla Enter se comporte como tabulador, es decir, que transmita el foco a los demás objetos de nuestra ventana.
He aquí el código...
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0,false);
Action accion = new AbstractAction() {
public void actionPerformed(ActionEvent e ){
ui.getFocusOwner().transferFocus();
}
}
};
Ahora la explicación...
- Se declara e instancia un objeto Keystroke donde se define (y captura) la tecla que se quiere identificar (por medio de KeyEvent) con la acción determinada.
- Posteriormente se define otro objeto (de la clase Action) con el cual definiremos el comportamiento, al instanciar dicho objeto debemos sobrescribir el método actionPerformed().
- Dentro de actionPerformed() definimos el comportamiento, en este caso por medio de ui.getFocusOwner().transferFocus(); donde
ui = Ventana sobre la que se está trabajando
getFocusOwner() = obtiene el elemento que posee el foco actualmente
transferFocus() = pasa el foco al siguiente elemento 'focusable'.
Ahora, si queremos dar un comportamiento especial dependiendo el tipo de elemento que tiene el foco podemos definir dentro de actionPerformed() algo parecido a lo siguiente:
if(ui.getFocusOwner() instanceof JButton){
Component boton = ui.getFocusOwner();
((JButton)boton).doClick();
}else if(ui.getFocusOwner() instanceof JTextField){
ui.getFocusOwner().transferFocus();
}
En el código anterior simplemente verificamos el tipo de objeto que tiene el foco antes de realizar la acción, si es un botón hacemos la acción definida por el clic sobre el mismo, si es una caja de texto pasamos el foco al siguiente elemento que pueda enfocarse.
Alguna duda o algo qué decir? Deja tu comentario. Saludox.
Muy útil, gracias!
ResponderBorrarHola, estuve intentando usar este codigo, pero no me funcionaba, me parece porque no habia relacion entre "KeyStroke enter" y "Action accion".
ResponderBorrarasi que agregue esto al final y me funciono perfecto.
getRootPane().registerKeyboardAction(accion,"Enter",enter,javax.swing.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Saludos. Gracias.
Torres Ezequiel
Córdoba Argentina.
Hola he querido hacer lo que se menciona en este blog, soy nuevo programando y me gustaria si no fuera mucha molestia que expusieras un pequeño programa con su programa fuente en cada ejemplo que pongas, creeme y hablo por muchos, nos ayudarias mucho. De antemano muchisimas gracias estare al pendiente del ejemplo de este caso en particular, lo necesito, grax.
ResponderBorrarhola, a mi pasa algo q no quiero en mi blogspot
ResponderBorrary cada vez q le doy al enter en una entrada con contenido, me tira el cursor al final de todo.
Como elemino este problema?
Saludos a todos quienes aportan algo de lo que saben....
ResponderBorrarBueno, al igual que un comentario anterior, me gustaría implementar el código aquí expuesto pero no se donde colocarlo, podrían poner un ejemplo un poco más completo?
Les agradezco de antemano su colaboración...
Hola será que pueden decirme donde coloco el código... Gracias!
ResponderBorrar