如何简单地实现一个KeyListener?
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?
这里有原因,这是行不通的:
的
JPanel
没有键盘焦点。 (该框架有它。)当面板添加到屏幕时,您可能想要requestFocus
。当图形发生变化时,您需要致电
repaint
。您不能在
paintComponent
方法中调用repaint
。在再次绘制字符串之前,您需要清除绘图区域(否则所有字符都会彼此重叠)。
下面是一个完整的工作示例:
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)
,使当你关闭窗口的应用程序终止。 :-)
addNotify()是我失踪!谢谢!!! – 2012-02-17 19:36:10
这就是我所说的一个很好的例子! – Yster 2015-12-04 14:38:09
你会从一个工作程序期望什么行为?如果你想在每次用户按下一个键时改变屏幕上的字符串,每次修改'c'之后,简单地调用'repaint()'应该会有效。 – 2012-02-17 19:07:25
是的,我忘了添加它,但它无法正常工作... – 2012-02-17 19:30:46