Вот причины, по которым он не работает:
JPanel
не имеет фокуса клавиатуры. (Во фрейме он есть.) Возможно, вы захотите requestFocus
, когда панель будет добавлена на экран.
Вам нужно позвонить repaint
, когда изменится графика.
Вы не должны вызывать repaint
в методе paintComponent
.
Необходимо очистить область рисования, прежде чем снова рисовать строку (в противном случае все символы окажутся друг над другом).
Вот полный рабочий пример:
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)
, чтобы приложение закрывалось при закрытии окна. : -)