【发布时间】:2012-11-15 17:19:29
【问题描述】:
当我启动我的小程序时,我没有收到来自关键监听器的响应。我该如何解决?下面是代码。
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
public class Main extends Applet {
private static final long serialVersionUID = 1L;
public String mode = "";
public Graphic gr;
public void init() {
this.setSize(400, 400);
gr = new Graphic();
this.add(gr);
gr.addKeyListener(new MyKeyListener());
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
gr.requestFocus();
gr.repaint();
}
};
new Timer().scheduleAtFixedRate(timerTask, 0, 1000 / 5);
}
public void paint(Graphics g) {
}
private class MyKeyListener extends KeyAdapter {
public MyKeyListener(){
System.out.println("HELLO");
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
gr.direction = Graphic.Direction.up;
gr.move();
break;
case KeyEvent.VK_DOWN:
gr.direction = Graphic.Direction.down;
gr.move();
break;
case KeyEvent.VK_LEFT:
gr.direction = Graphic.Direction.left;
gr.move();
break;
case KeyEvent.VK_RIGHT:
gr.direction = Graphic.Direction.right;
gr.move();
break;
}
}
public void keyReleased(KeyEvent e) {
}
}
}
【问题讨论】:
-
“我没有得到关键听众的回应。” 给定像
public void paint(Graphics g) { }这样的代码,我很惊讶你什么都得到了。 1) 为什么要在第三个千年使用 AWT? 2)为什么是小程序而不是框架? 3)为什么KeyListener而不是键绑定? 4) 为什么不调用任何提到“焦点”的方法?有关详细信息,请参阅focus 教程。 -- 看起来你正在尝试“魔法编码”,而这通常不起作用。 -
this.setSize(400, 400);不要那样做。小程序的大小由 HTML 中的属性设置。 -
尝试使用像这样的计时器来获取焦点在任何时候都是一个可怕的想法,永远不要这样做(我知道“只是一个测试” - 但声明成立)。避开关键听众并支持key bindings,他们不会像
KeyListeners 那样遭受同样的焦点问题 -
我认为 setSize 在本地机器上测试仍然很方便
标签: java applet awt keylistener