This is why this does not work:
- JPaneldoes not have keyboard focus. (The frame has it.) You probably want- requestFocuswhen the panel is added to the screen.
 
- You need to call - repaintwhen the image needs to change.
 
- You should not call - repaintin the- paintComponentmethod.
 
- You need to clear the drawing area before drawing the line again (otherwise all characters will be located one above the other). 
Here is a complete working example:
 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, and you can add f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) so that the application terminates when the window f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)