0

我有一个在 Eclipse 中运行良好的 Java Applet,但是当我将它导出到 jar 文件中,将其嵌入 HTML 并使用 Opera 或 Firefox 打开它时,Key Listener 无法正常工作。我试图提取适当的代码。小程序是一个游戏,玩家在按下“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())”。正如我所说,小程序在 Eclipse 中运行时运行良好,但在 Firefox/Opera 中运行时,播放器在按下“D”键后开始运行,然后小程序失去焦点,而播放器继续运行。有时我可以通过单击鼠标强制小程序保持焦点,但即使这样我也无法阻止播放器运行。似乎 KeyEvent 一直在触发。此外,如果我在 java 首选项下显示了 java 控制台(似乎控制台要求所有 keyevents),我什至无法获得 KeyEvent,即使我在控制台弹出后关闭控制台也是如此。我尝试使用 KeyListener 而不是 KeyBinding,结果完全相同。我还有一个 Mouselistener,它在所有场景中都能正常工作。如果相关的话,我正在 Mac 上运行。

我可以强制小程序不失去输入焦点吗?(为什么会失去焦点?)为什么事件会一直触发?即使显示了控制台,是否可以给小程序焦点?

4

0 回答 0