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

Próbowałem przeczytać this jeszcze nie zrobiłam, aby zrozumieć, jak po prostu wdrożyć KeyListener. więc co muszę zmienić, aby to zadziałało?jak po prostu zaimplementować KeyListener?

+0

Jakie zachowanie można się spodziewać po programie roboczym? Jeśli chcesz zmienić napis na ekranie za każdym naciśnięciem klawisza, proste wywołanie 'repaint()' po każdej modyfikacji do 'c' powinno wystarczyć. –

+0

tak, zapomniałem go dodać, ale i tak to nie działa ... –

Odpowiedz

9

Oto powody dlaczego to nie działa:

  1. JPanel nie ma fokusa klawiatury. (Ramka ma to.) Prawdopodobnie chcesz requestFocus kiedy panel zostanie dodany do ekranu.

  2. Musisz zadzwonić pod numer repaint, kiedy grafika powinna się zmienić.

  3. Nie można wywoływać metody repaint w metodzie paintComponent.

  4. Musisz usunąć obszar rysowania przed ponownym rysowaniem ciągu znaków (w przeciwnym razie wszystkie znaki zostaną ułożone jeden na drugim).

Oto pełna przykład praca:

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); 
    } 
} 

Och, a może chcesz dodać f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) aby zakończyć aplikację po zamknięciu okna. :-)

+2

addNotify() jest tym, czego mi brakowało! dzięki!!! –

+1

Oto co nazywam świetnym przykładem !! – Yster

Powiązane problemy