为什么我的Java程序不使用KeyListener确认任何按键?
我真的不知道为什么我的程序不能识别键盘输入。我在整个程序中放置了print语句来确定问题,并且我确定keyPressed方法永远不会激活。这是一个游戏,我正在为一个类项目制作,是的,我是一个相对初学者程序员。提前谢谢!(代码如下)为什么我的Java程序不使用KeyListener确认任何按键?,java,applet,keylistener,Java,Applet,Keylistener,我真的不知道为什么我的程序不能识别键盘输入。我在整个程序中放置了print语句来确定问题,并且我确定keyPressed方法永远不会激活。这是一个游戏,我正在为一个类项目制作,是的,我是一个相对初学者程序员。提前谢谢!(代码如下) 我不确定它是否适用于小程序,但您的线程可能不允许事件分派发生 尝试使用运行您的“工作”。首先,您可能希望将您的类与您的KeyListener分开,因为这样会使其更难阅读 下一步,您希望去掉裸线程,并将其包装在计时器中 import javax.swing.Timer;
我不确定它是否适用于小程序,但您的
线程可能不允许事件分派发生
尝试使用运行您的“工作”。首先,您可能希望将您的类与您的KeyListener分开,因为这样会使其更难阅读
下一步,您希望去掉裸线程
,并将其包装在计时器中
import javax.swing.Timer;
class Dodger extends JApplet {
Timer imageUpdater; //replaces Thread
/*...*/
public void init() {
/*etc*/
loadpic();
int repaintInterval = 100;
imageUpdater = new Timer(repaintInterval,
new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
}
);
imageUpdater.start();
addKeyListener(new KeyHandler());
setFocusable(true);
}
/*...*/
private class KeyHandler extends KeyAdapter {
/* Note that with this implementation, you do not have to override
* unnecessary methods, as KeyAdapter is an abstract class that
* implements all of the methods of KeyListener.
*/
@Override
public void keyPressed(KeyEvent e) {
/*...*/
}
}
/*...*/
}
这大部分只是代码清理-实际问题可能会通过setFocusable(true)
解决(根据Tom的说法,请参阅注释)。当小程序可聚焦并具有焦点时,可以很好地检测到关键事件。管理焦点一直是小程序的一个问题。问题主要在于Sun从未费心指定焦点行为,理想情况下,该行为应适用于可聚焦HTML元素和小程序的混合页面
根据Tom的建议,在init()的末尾添加
为安全起见,还应覆盖:
public void start() {
this.requestFocusInWindow();
}
顺便说一句,一般来说最好在秋千上使用。它们还要求小程序具有输入焦点
您是否确保小程序具有焦点?如果小程序没有焦点,按键将不会被捕获。要更快获得更好的帮助,请发布一个。请注意,在我看到小程序和测试理论之前,我不得不花一些时间来解决缺少图像的问题。当涉及到问题本身时,init()中的setFocusable(true)应该可以做到这一点。@Tom(对我来说)奇怪的是,小程序在使用Eclipse启动时已经可以聚焦了。@AndrewThompson对我来说,它不可聚焦。使用Netbeans 7.1.1和Oracle JDK 1.7启动。老实说,我总是觉得聚焦小程序有点混乱。额外调用setFocusable不会有任何伤害。@Tom“额外调用setFocusable不会有任何伤害。”你说得对。我只是尝试了一下,这就解决了从Eclipse运行时的“无即时焦点”问题。“我总是觉得聚焦小程序有点让人困惑。”告诉我吧。请参阅我(经过大量编辑)答案的开头。@mKorbel每次我一起看到Swing&KeyListener
时,我都会想到SwingWorkker的键绑定..+1,但可能不是,线程被包装成Runnable,问题可能是18岁时的有趣睡眠miliseconds@mKorbel我不认为SwingWorker在这里有用。这不是一个“长时间运行的任务”(在800x800查看区域绘制2个图像),它只是一个“重复任务”-只需要一个计时器。无论如何,我认为任何修改GUI的线程都必须在Swing的事件调度线程上运行,如SwingWorkers文档中所述。这不会造成任何伤害…@petermm在所有讨论之后(与安德鲁·汤普森)
setFocusable(true);
public void start() {
this.requestFocusInWindow();
}