Vamos a hacer un ejemplo muy simple teniendo en cuenta que ya sabemos lo que es un evento (si no lo sabes, revisa el articulo anterior)..... en el ejemplo escribiremos en un área de texto y mediante eventos del teclado identificaremos y contaremos la cantidad de vocales escritas...
Este ejemplo es muy similar al anterior ya que también es necesario implementar una interface, en este caso la elegida es la KeyListener, que nos provee los métodos para controlar los eventos del teclado...
Al implementar la interface debemos implementar también los métodos que la componen, veamos cuales son y su funcionamiento básico:
keyPressed(KeyEvent e): Se ejecuta cuando el usuario presiona una tecla.keyReleased(KeyEvent e): Se ejecuta cuando el usuario libera una teclakeyTyped(KeyEvent e): Se ejecuta cuando el usuario presiona una tecla, pero solo cuando la tecla corresponde a caracteres, teclas especiales como F1, F2 entre otras no son identificadas.
Por lo regular el uso de estos métodos es muy especifico todo depende de lo que necesitemos ya que el evento de presionar y soltar pasa muy rápido y casi nunca nos damos cuenta cual evento se ejecutó, estos métodos son usados básicamente cuando queremos controlar al detalle lo que queremos que suceda si se hace una u otra acción...... mas abajo veremos esto en el ejemplo.....bueno ahora si a lo que vinimos.....El Ejemplo.
public class Aplicacion {Clase Ventana.Esta clase corresponde a la interface grafica de nuestro sistema...veamos
public static void main(String args[]) {
Ventana ventana;
ventana = new Ventana();
ventana.setVisible(true);
}
}
class Ventana extends JFrame implements KeyListener {Vamos a centrarnos en los métodos keyPressed(KeyEvent e) y keyReleased(KeyEvent e)...En keyPressed validamos cuando se presionan las vocales para ir asignando los valores correspondientes al área de texto y a la variable que las cuenta......
JLabel labelTitulo;
JLabel labelAreaEntrada;
JLabel labelAreaSalida;
JLabel labelSalida;
JLabel labelContadorVocales;
JTextArea areaEntradaDeTexto;
JScrollPane scrollPaneAreaEntrada;
JTextArea areaSalidaDeTexto;
JScrollPane scrollPaneAreaSalida;
int cantidadVocales=0;
String vocales="";
public Ventana() {
setLayout(null);
iniciaComponentes();
//Asigna un titulo a la barra de titulo
setTitle("CoDejaVu : Ventana Eventos del Teclado");
//tamaño de la ventana
setSize(550,350);
//pone la ventana en el Centro de la pantalla
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void iniciaComponentes() {
labelTitulo= new JLabel();
labelTitulo.setFont(new java.awt.Font("Comic Sans MS", 0, 28));
labelTitulo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
labelTitulo.setText("Eventos del Teclado");
labelTitulo.setBorder(javax.swing.BorderFactory.
createBevelBorder(javax.swing.border.BevelBorder.RAISED));
labelTitulo.setBounds(110, 20, 300, 40);
labelAreaEntrada= new JLabel();
labelAreaEntrada.setBounds(10, 70, 180, 40);
labelAreaEntrada.setText("Area Entrada de Texto");
areaEntradaDeTexto = new JTextArea();
areaEntradaDeTexto.setLineWrap(true);
areaEntradaDeTexto.addKeyListener(this);
scrollPaneAreaEntrada = new JScrollPane();
scrollPaneAreaEntrada.setBounds(10, 100, 513, 70);
scrollPaneAreaEntrada.setViewportView(areaEntradaDeTexto);
labelAreaSalida= new JLabel();
labelAreaSalida.setBounds(10, 170, 180, 40);
labelAreaSalida.setText("Area Salida de Texto");
areaSalidaDeTexto = new JTextArea();
areaSalidaDeTexto.setLineWrap(true);
areaSalidaDeTexto.addKeyListener(this);
scrollPaneAreaSalida = new JScrollPane();
scrollPaneAreaSalida.setBounds(10, 200, 513, 70);
scrollPaneAreaSalida.setViewportView(areaSalidaDeTexto);
labelContadorVocales = new JLabel();
labelContadorVocales.setBounds(380, 280, 190, 20);
labelSalida = new JLabel();
labelSalida.setText("Para salir presione la tecla Escape");
labelSalida.setBounds(10, 280, 210, 20);
add(labelTitulo);
add(labelSalida);
add(labelContadorVocales);
add(labelAreaEntrada);
add(labelAreaSalida);
add(scrollPaneAreaEntrada);
add(scrollPaneAreaSalida);
}
/**Este metodo se ejecuta cuando se presiona una tecla*/
@Override
public void keyPressed(KeyEvent e) {
if (e.getSource()==areaEntradaDeTexto)
{
if (e.VK_A==e.getKeyCode())
{
vocales+="a ";
cantidadVocales++;
}
if (e.VK_E==e.getKeyCode())
{
vocales+="e ";
cantidadVocales++;
}
if (e.VK_I==e.getKeyCode())
{
vocales+="i ";
cantidadVocales++;
}
if (e.VK_O==e.getKeyCode())
{
vocales+="o ";
cantidadVocales++;
}
if (e.VK_U==e.getKeyCode())
{
vocales+="u ";
cantidadVocales++;
}
}
areaSalidaDeTexto.setText(vocales);
labelContadorVocales.setText("Numero Vocales: "+cantidadVocales);
}
/**Este metodo se ejecuta cuando se suelta una tecla*/
@Override
public void keyReleased(KeyEvent e) {
System.out.println("Soltó la tecla: "+e.getKeyText(e.getKeyCode()));
if (e.getSource()==areaEntradaDeTexto)
{
if (e.VK_ESCAPE==e.getKeyCode())
{
int respuesta = JOptionPane.showConfirmDialog(this,
"Esta seguro que desea salir?", "Confirmación",
JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_NO_OPTION)
{
System.exit(0);
}
}
}
}
/**Este metodo funcionará solo cuando se presionan caracteres,
*si se presionan teclas como F1, F2, inicio etc no ejecutará
*ningun evento*/
@Override
public void keyTyped(KeyEvent e) {
}
}
En KeyReleased lo que hacemos es validar el evento cuando se presiona la tecla Escape para salir del sistema, al presionar la tecla se carga el mensaje....
Simplemente lo hicimos ahí para ver el ejemplo del que hablamos al principio..... cual método usar depende básicamente de lo que necesitemos.... los eventos suceden muy rápido pero en este caso, como queremos imprimir que tecla se liberó.... si hubiéramos puesto la validación de la tecla Escape al presionar el botón, entonces se cargaría el dialogo de confirmación y si es afirmativo se cerraría la aplicación, sin darnos tiempo de ver en consola que la tecla Escape fue liberada.... mientras que en el KeyReleased si alcanzamos a ver en consola que el escape se presionó....... en este caso no es algo tan grave, pero supongamos que eso sea algo muy importante y que no solo es mostrarse en consola sino almacenarse esa información en un archivo de texto siendo necesaria toda la información posible......
También es importante saber que aunque no utilicemos el método keyTyped, se debe dejar enunciado, ya que es un principio del trabajo con interfaces y debemos implementar todos los métodos de esta.... si no sabes a que me refiero te invito a leer esta entrada sobre interfaces...
Y listo aquí termina nuestro ejemplo, espero que les pueda servir y sea de fácil entendimiento...
También te podría Interesar.
- Imagenes en Java
- Componentes de Texto.
- Componentes Atomicos Java Swing
- Componentes Java Swing
- Que es Java Swing?
- Clases Abstractas.
- Herencia en Java.
- ¿ String Vrs StringBuffer Vrs StringBuilder ?
- Comparando Fechas En Java
- Tutorial Aplicaciones Web con Jboss Seam
¿Hay algo que quieras anexar o comentar sobre esta entrada? no dudes en hacerlo.....y si te gustó...... te invito a compartir y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)