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