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

我試過閱讀this但沒有理解如何簡單地實現一個KeyListener。所以我需要改變這個工作?如何簡單地實現一個KeyListener?

+0

你會從一個工作程序期望什麼行爲?如果你想在每次用戶按下一個鍵時改變屏幕上的字符串,每次修改'c'之後,簡單地調用'repaint()'應該會有效。 – 2012-02-17 19:07:25

+0

是的,我忘了添加它,但它無法正常工作... – 2012-02-17 19:30:46

回答

9

這裏有原因,這是行不通的:

  1. JPanel沒有鍵盤焦點。 (該框架有它。)當面板添加到屏幕時,您可能想要requestFocus

  2. 當圖形發生變化時,您需要致電repaint

  3. 您不能在paintComponent方法中調用repaint

  4. 在再次繪製字符串之前,您需要清除繪圖區域(否則所有字符都會彼此重疊)。

下面是一個完整的工作示例:

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

哦,你可能要添加f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),使當你關閉窗口的應用程序終止。 :-)

+2

addNotify()是我失蹤!謝謝!!! – 2012-02-17 19:36:10

+1

這就是我所說的一個很好的例子! – Yster 2015-12-04 14:38:09