Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/07/2012, 19:55
pepe1988
 
Fecha de Ingreso: julio-2012
Mensajes: 4
Antigüedad: 12 años, 5 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