import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// This version does *not* require focus to be set.
public class NewKeyEventDemo extends JFrame {
  private KeyboardPanel keyboardPanel = new KeyboardPanel();
  public static final int DIST = 10;

  /* Initialize UI */
  public NewKeyEventDemo() {
    // Add the keyboard panel to accept and display user input
    add(keyboardPanel);

    setTitle("KeyEventDemo");
    setLocationRelativeTo(null); // Center the frame
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300,300);

    addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
          switch (e.getKeyCode()) {
            case KeyEvent.VK_DOWN: keyboardPanel.moveY(DIST); break;
            case KeyEvent.VK_UP: keyboardPanel.moveY(-DIST); break;
            case KeyEvent.VK_LEFT: keyboardPanel.moveX(-DIST); break;
            case KeyEvent.VK_RIGHT: keyboardPanel.moveX(DIST); break;
            default: keyboardPanel.setChar(e.getKeyChar());
          }
        }});
  }

  public static void main(String[] args) {
    KeyEventDemo frame = new KeyEventDemo();
    frame.setVisible(true);
  }
}

// Panel that draws the character.
class KeyboardPanel extends JPanel {
    private int x = 100;
    private int y = 100;
    private char keyChar = 'A'; // Default key

    public void moveY(int change) { y += change; repaint(); }
    public void moveX(int change) { x += change; repaint();  }
    public void setChar(char value) { keyChar = value; repaint(); }

    /** Draw the character */
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);

      g.setFont(new Font("TimesRoman", Font.PLAIN, 24));
      g.drawString(String.valueOf(keyChar), x, y);
    }
}

