0

Eclipse で問題なく動作する Java アプレットがありますが、それを jar ファイルにエクスポートし、HTML に埋め込んで Opera または Firefox で開くと、キー リスナーが正しく動作しません。適切なコードを抽出しようとしました。アプレットは、プレーヤーが「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コンソールが表示されている場合(コンソールがすべてのキーイベントを要求しているように見えます)、KeyEventを取得することさえできません。KeyBinding の代わりに KeyListener を使用しようとしましたが、結果はまったく同じでした。また、すべてのシナリオで正常に動作する Mouselistener もあります。それが関連している場合、私はMacで実行しています。

アプレットが入力フォーカスを失わないようにすることはできますか? (フォーカスが失われるのはなぜですか?) イベントが発生し続けるのはなぜですか? コンソールが表示されていても、アプレットにフォーカスを与えることはできますか?

4

0 に答える 0