2012-02-17 12 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); 
    } 
} 

Ho provato a leggere this ma non ha mange per capire come implementare semplicemente un KeyListener. quindi cosa devo cambiare perché funzioni?come implementare semplicemente un KeyListener?

+0

Quale comportamento ti aspetti da un programma funzionante? Se vuoi cambiare la stringa su schermo ogni volta che l'utente preme un tasto, una semplice chiamata a 'ridi()' dopo ogni modifica a 'c' dovrebbe fare il trucco. –

+0

sì ho dimenticato di aggiungerlo, ma non funziona comunque ... –

risposta

9

Ecco i motivi per cui non funziona:

  1. Il JPanel non ha il focus della tastiera. (Il frame ce l'ha.) Probabilmente vuoi requestFocus quando il pannello viene aggiunto allo schermo.

  2. È necessario chiamare repaint quando l'immagine deve cambiare.

  3. Non è necessario chiamare repaint nel metodo paintComponent.

  4. È necessario deselezionare l'area di disegno prima di disegnare nuovamente la stringa (altrimenti tutti i caratteri finiranno l'uno sopra l'altro).

Ecco un esempio di lavoro 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); 
    } 
} 

Oh, e si consiglia di aggiungere f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) per rendere l'applicazione termina quando si chiude la finestra. :-)

+2

addNotify() è quello che mi mancava! Grazie!!! –

+1

Questo è quello che chiamo un grande esempio !! – Yster

Problemi correlati