我有一个Java Applet在eclipse中完全正常工作,但是当我将它导出到jar文件,将其嵌入HTML并用Opera或Firefox打开时,Key Listener无法正常工作。我试图提取适当的代码。 applet是一款游戏,玩家在按下“D”时向前移动,在释放时停止:
public class World extends JPanel
{
...
public World()
{
...
seyFocusable(true);
addKeyBinding();
...
}
private AbstractAction forward = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
if(!keys.contains(39))
keys.add(39);
requestFocusInWindow();
}
};
private AbstractAction r_forward = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
keys.remove(new Integer(39));
requestFocusInWindow();
}
};
public void addKeyBinding()
{
int c = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = getInputMap(c);
ActionMap actionMap = getActionMap();
inputMap.put(KeyStroke.getKeyStroke("D"), "for");
actionMap.put("for", forward);
inputMap.put(KeyStroke.getKeyStroke("released D"), "r_for");
actionMap.put("r_for", r_forward);
}
Applet类只执行“add(new World())”。正如我所说,applet在eclipse中运行时工作正常,但是当在firefox / opera中运行时,播放器在点击“D”键后开始运行,然后applet失去焦点,同时播放器继续运行。有时我可以通过鼠标点击强制小程序保持专注,但即使这样我也无法阻止玩家运行。似乎KeyEvent一直在射击。 如果我在java偏好下显示java控制台(似乎控制台需要所有键控事件),即使我弹出后关闭控制台,我甚至无法获得KeyEvent。 我尝试使用KeyListener而不是KeyBinding使用完全相同的结果。 我还有一个Mouselistener,可以在所有场景中正常工作。 如果相关,我正在Mac上运行。
我可以强制applet不丢失输入焦点吗? (为什么它会失去焦点?)为什么事件会继续发射?即使显示控制台,是否可以重点关注applet?