アプレットを実行していて、init メソッド以外のコンポーネントに注目しようとしています。requestFocus と requestFocusInWindow を使用してみました。isDisplayable、isVisible、isFocusable と同様に、これらは両方とも true を返しますが、この直後に hasFocus を呼び出すと false が返されます。コンポーネントがアプレットに表示されません。
コンポーネントに焦点を当てようとして、(ユーザーが「戦闘開始」をクリックしたときに) イベント リスナーによって呼び出されるメソッドを次に示します。
private void beginBattle(){
BattleSequence bs = new BattleSequence(..);
remove(pnlInit);
remove(pnlOOB);
remove(pnlBattle);
add(bs);
bs.setVisible(true);
bs.requestFocusInWindow(); //this returns 'true'
bs.setBounds(0, 0, bs.getSize().width, bs.getSize().height);
bs.init();
}
public class BattleSequence extends RavelSequence
public abstract class RavelSequence extends Applet implements KeyListener, FocusListener
フォーカス要求が拒否されるのはなぜですか? 関連するコードが他にもある場合は、投稿できます。
* * *編集: マウス リスナーを追加すると、コンポーネントにフォーカスが移るようになりましたが、ユーザーがゲームを制御するためにマウスを必要としないようにしたいと考えています。RavelSequence の宣言を、アプレットの代わりに Container を拡張するように変更しました。
bs.hasFocus は引き続き false を返しますが、キー イベントは適切に処理されます。