Foros del Web » Programación para mayores de 30 ;) » Java »

Duda con eventos

Estas en el tema de Duda con eventos en el foro de Java en Foros del Web. Hola a todos Estoy haciendo un curso online de Java SE y la verdad es que me está dejando muchas dudas. Lo esencial se hacerlo ...
  #1 (permalink)  
Antiguo 31/07/2012, 19:55
 
Fecha de Ingreso: julio-2012
Mensajes: 4
Antigüedad: 11 años, 9 meses
Puntos: 0
Duda con eventos

Hola a todos

Estoy haciendo un curso online de Java SE y la verdad es que me está dejando muchas dudas. Lo esencial se hacerlo (típicos comandos de if, else, for, while e incluso interfaz gráfica con menus, textos y tal), pero cuando se trata de eventos, amigos, la cosa falla xD

Tengo un ejemplo en los apuntes que ejecuta un programa que te indica la tecla pulsada del teclado. Obviamente es un ejemplo que NO es correcto, ya que la clase principal NO está definida como abstracta, ya que implementa KeyListener. El problema está en que tengo que instanciar la clase principal pero no puedo porque es abstracta.

El código es el siguiente:

Código Java:
Ver original
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. /**
  5.  *
  6.  * @author Pepe
  7.  */
  8. public class EjemploEventos implements KeyListener{
  9.    
  10.     private static String labelPrefix = "La tecla pulsada es: ";
  11.     JLabel etiqueta;
  12.    
  13.     public Component crearComponentes (){
  14.     //El primer componente será una etiqueta
  15.     etiqueta = new JLabel (labelPrefix + "      ");
  16.    
  17.     //El segundo componente será un cuadro de texto
  18.     JTextField texto = new JTextField();
  19.    
  20.     //Creamos un contenedor en el que agruparemos al botón y a la etiqueta
  21.     JPanel panel= new JPanel();
  22.    
  23.     //Le añadimos un borde de dimensiones 30 x 50 x 10 x 50
  24.     panel.setBorder(BorderFactory.createEmptyBorder(30,50,10,50));
  25.    
  26.     //Los componentes se distribuirán por columnas
  27.     panel.setLayout(new GridLayout(0,1));
  28.    
  29.     //Añadimos el campo de texto y la etiqueta al contenedor
  30.     panel.add (texto);
  31.     panel.add (etiqueta);
  32.    
  33.     return panel;
  34.     }
  35.    
  36.     public static void main (String[] args)
  37.     {
  38.     try {
  39.     //Indicar Look & Feel
  40.         UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
  41.     } catch (Exception e) {}
  42.    
  43.     //Creamos el contenedor de alto nivel JFrame y le damos un nombre
  44.    
  45.     JFrame caja = new JFrame("Ejemplo de eventos");
  46.     caja.setSize(350, 250);
  47.     EjemploEventos app = new EjemploEventos();
  48.    
  49.     //Creamos los componentes y los añadimos al contenedor principal
  50.     Component componentes = app.crearComponentes();
  51.     caja.getContentPane().add(componentes, BorderLayout.CENTER);    
  52.      
  53.     caja.pack();
  54.     caja.setVisible(true);
  55.     }
  56.    
  57.     //Implementamos los métodos de la interfaz KewyListener. Sólo nos interesa
  58.     //el que trata el evento de pulsar una tecla, por lo tanto dejamos vacíos los demás
  59.    
  60.    
  61.     public void keyTiped (KeyEvent e)
  62.     {
  63.     etiqueta.setText(labelPrefix + e.getKeyChar());
  64.     }
  65.    
  66.     public void keyPressed (KeyEvent e) {}
  67.     public void keyReleased (KeyEvent e) {}
  68.    
  69. }

Preguntas:
- ¿Qué puedo hacer para arreglarlo?
- ¿Por qué es necesario instanciar la clase principal?
- ¿Hay otra forma más clara de hacer esto?
Código:
    EjemploEventos app = new EjemploEventos();
    
    //Creamos los componentes y los añadimos al contenedor principal
    Component componentes = app.crearComponentes();
    caja.getContentPane().add(componentes, BorderLayout.CENTER);
Saludos
  #2 (permalink)  
Antiguo 01/08/2012, 08:36
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Duda con eventos

No entiendo muy bien tu problema, pero te faltan cosas.

¿A qué componente quieres asignarle el evento? No veo que uses el método addKeyListener en ningún componente para asignarle el evento.

El problema que veo que tienes es de conceptos y te complicas mucho.

Te dejo un ejemplo de como lo haría yo:

Código Java:
Ver original
  1. public class EjemploEventos extends JFrame{
  2.    
  3.     private static String labelPrefix = "La tecla pulsada es: ";
  4.     private JLabel etiqueta;
  5.     private JPanel panel;
  6.      
  7.      //Constructor
  8.     public EjemploEventos (){
  9.     //El primer componente será una etiqueta
  10.     etiqueta = new JLabel (labelPrefix + "      ");
  11.    
  12.     //El segundo componente será un cuadro de texto
  13.     JTextField texto = new JTextField();
  14.  
  15.     //Usando KeyAdapter no necesitas redefinir todos los métodos y usamos clases anónimas
  16. texto.addKeyListener(new KeyAdapter(){
  17.  
  18.  public void keyTiped (KeyEvent e)
  19.     {
  20.     etiqueta.setText(labelPrefix + e.getKeyChar());
  21.     }
  22. });    
  23.    
  24.     panel = new JPanel();
  25.     //Le añadimos un borde de dimensiones 30 x 50 x 10 x 50
  26.     panel.setBorder(BorderFactory.createEmptyBorder(30,50,10,50));
  27.    
  28.     //Los componentes se distribuirán por columnas
  29.     panel.setLayout(new GridLayout(0,1));
  30.    
  31.     //Añadimos el campo de texto y la etiqueta al contenedor
  32.     panel.add (texto);
  33.     panel.add (etiqueta);
  34.    
  35.     getContentPane().add(panel, BorderLayout.CENTER);
  36.    
  37.     }
  38.    
  39.     public static void main (String[] args)
  40.     {
  41.     try {
  42.     //Indicar Look & Feel
  43.         UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
  44.     } catch (Exception e) {}
  45.      
  46.      
  47.     EjemploEventos app = new EjemploEventos();   
  48.     app.pack();
  49.     app.setVisible(true);
  50.    
  51.    }
  52.    
  53.    
  54. }
  #3 (permalink)  
Antiguo 14/08/2012, 05:41
 
Fecha de Ingreso: julio-2012
Mensajes: 4
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Duda con eventos

Perdón por las molestias, pero he copiado el código que has puesto y sigue sin funcionar. ¿Será porque estoy utilizando una máquina virtual? Me da
OpenGL Warning: VBoxCrHgsmiCreate failed

Un saludo
  #4 (permalink)  
Antiguo 16/08/2012, 03:53
Avatar de jomaruro
Colaborador
 
Fecha de Ingreso: junio-2002
Ubicación: Naboo
Mensajes: 5.442
Antigüedad: 21 años, 10 meses
Puntos: 361
Respuesta: Duda con eventos

Hola:

Cita:
Iniciado por pepe1988 Ver Mensaje
¿Será porque estoy utilizando una máquina virtual? Me da OpenGL Warning: VBoxCrHgsmiCreate failed
Igual meto la pata pero me parece un error de VirtualBox ¿Es esa la máquina virtual que estás usando?

Saludos.

  #5 (permalink)  
Antiguo 17/08/2012, 05:13
 
Fecha de Ingreso: julio-2012
Mensajes: 4
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Duda con eventos

Estoy usando VirtualBox, pero no me funciona el ejemplo que me puso el otro compañero alexg88. He copiado el código y sigue sin funcionar. Es por eso que he preguntado que si me dan warnings relacionados con OpenGL, puede influir en el comportamiento de programas de Java.
  #6 (permalink)  
Antiguo 17/08/2012, 06:54
Avatar de jomaruro
Colaborador
 
Fecha de Ingreso: junio-2002
Ubicación: Naboo
Mensajes: 5.442
Antigüedad: 21 años, 10 meses
Puntos: 361
Respuesta: Duda con eventos

Hola:

Sigo pensando que el problema está en la máquina virtual y no en el código Java.

Saludos.

  #7 (permalink)  
Antiguo 20/08/2012, 18:39
 
Fecha de Ingreso: julio-2012
Mensajes: 4
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Duda con eventos

Cita:
Iniciado por jomaruro Ver Mensaje
Hola:

Sigo pensando que el problema está en la máquina virtual y no en el código Java.

Saludos.

Pues no. Acabo de probar el código en la máquina host y no me funciona. Estoy usando NetBeans
¿Alguna otra solución? ¿Pueden probrar el código y testearlo a ver si funciona?

Un saludo
  #8 (permalink)  
Antiguo 29/08/2012, 08:48
 
Fecha de Ingreso: enero-2011
Mensajes: 26
Antigüedad: 13 años, 3 meses
Puntos: 1
Respuesta: Duda con eventos

¿Alguien más puede ayudarme?
  #9 (permalink)  
Antiguo 29/08/2012, 14:19
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Duda con eventos

Es muy sencillo por lo que no funciona y es porque al utilizar la clase KeyAdapter no he redefinido el método keyTyped, sino que he añadido uno llamado keyTiped (fíjate en la diferencia).

No da ningún error porque todos los métodos de la interfaz KeyListener están ya definidos en KeyAdapter.

El código bien:

Código Java:
Ver original
  1. public class EjemploEventos extends JFrame{
  2.    
  3.     private static String labelPrefix = "La tecla pulsada es: ";
  4.     private JLabel etiqueta;
  5.     private JPanel panel;
  6.      
  7.      //Constructor
  8.     public EjemploEventos (){
  9.     //El primer componente será una etiqueta
  10.     etiqueta = new JLabel (labelPrefix + "      ");
  11.    
  12.     //El segundo componente será un cuadro de texto
  13.     JTextField texto = new JTextField();
  14.  
  15.     //Usando KeyAdapter no necesitas redefinir todos los métodos y usamos clases anónimas
  16. texto.addKeyListener(new KeyAdapter(){
  17.  @Override
  18.  public void keyTyped (KeyEvent e)
  19.     {
  20.     etiqueta.setText(labelPrefix + e.getKeyChar());
  21.     }
  22. });    
  23.    
  24.     panel = new JPanel();
  25.     //Le añadimos un borde de dimensiones 30 x 50 x 10 x 50
  26.     panel.setBorder(BorderFactory.createEmptyBorder(30,50,10,50));
  27.    
  28.     //Los componentes se distribuirán por columnas
  29.     panel.setLayout(new GridLayout(0,1));
  30.    
  31.     //Añadimos el campo de texto y la etiqueta al contenedor
  32.     panel.add (texto);
  33.     panel.add (etiqueta);
  34.    
  35.     getContentPane().add(panel, BorderLayout.CENTER);
  36.    
  37.     }
  38.    
  39.     public static void main (String[] args)
  40.     {
  41.     try {
  42.     //Indicar Look & Feel
  43.         UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
  44.     } catch (Exception e) {}
  45.      
  46.      
  47.     EjemploEventos app = new EjemploEventos();    
  48.     app.pack();
  49.     app.setVisible(true);
  50.    
  51.    }    
  52.    
  53. }

Fíjate en la anotación @Override en el método keyTyped. En netbeans aparece un triangulo amarillo para indicar que es conveniente ponerla.

Un saludo.

Etiquetas: eventos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:58.