2012-02-17 9 views
6
public class MyPanel extends JPanel implements KeyListener { 
    private char c = 'e'; 
    public MyPanel() { 
     this.setPreferredSize(new Dimension(500,500)); 
     addKeyListener(this); 
    } 
    public void paintComponent(Graphics g) { 
     super.repaint(); 
     g.drawString("the key that pressed is" + c, 250,250); 
    } 

    public void keyPressed(KeyEvent e) { 
     c=e.getKeyChar(); 
     repaint(); 

    } 

    public void keyReleased(KeyEvent e) { 
    } 


    public void keyTyped(KeyEvent e) { 
     c=e.getKeyChar(); 
     repaint(); 
    } 

    public static void main(String[] s) { 
     JFrame f=new JFrame(); 
     f.getContentPane().add(new MyPanel()); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

Intenté leer this pero no pude entender cómo simplemente implementar KeyListener. Entonces, ¿qué necesito cambiar para que esto funcione?cómo simplemente implementar KeyListener?

+0

¿Qué comportamiento esperaría de un programa en funcionamiento? Si desea cambiar la cadena en la pantalla cada vez que el usuario presiona una tecla, una simple llamada a 'repaint()' después de cada modificación a 'c' debería hacer el truco. –

+0

Sí, me olvidé de agregarlo, pero no funciona de todos modos ... –

Respuesta

9

Estas son las razones por las que no funciona:

  1. El JPanel no tiene el foco del teclado. (El marco lo tiene). Probablemente desee requestFocus cuando el panel se agrega a la pantalla.

  2. Debe llamar al repaint cuando el gráfico cambie.

  3. No debe llamar al repaint en el método paintComponent.

  4. Debe borrar el área de dibujo antes de volver a dibujar la cadena (de lo contrario, todos los caracteres terminarán uno encima del otro).

Aquí está un ejemplo de trabajo completo:

class MyPanel extends JPanel implements KeyListener { 
    private char c = 'e'; 

    public MyPanel() { 
     this.setPreferredSize(new Dimension(500, 500)); 
     addKeyListener(this); 
    } 

    public void addNotify() { 
     super.addNotify(); 
     requestFocus(); 
    } 

    public void paintComponent(Graphics g) { 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.drawString("the key that pressed is " + c, 250, 250); 
    } 

    public void keyPressed(KeyEvent e) { } 
    public void keyReleased(KeyEvent e) { } 
    public void keyTyped(KeyEvent e) { 
     c = e.getKeyChar(); 
     repaint(); 
    } 

    public static void main(String[] s) { 
     JFrame f = new JFrame(); 
     f.getContentPane().add(new MyPanel()); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

Ah, y es posible que desee añadir f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) para hacer la aplicación termina cuando se cierra la ventana. :-)

+2

addNotify() es lo que me faltaba! ¡¡¡Gracias!!! –

+1

¡Esto es lo que llamo un gran ejemplo! – Yster

Cuestiones relacionadas