- - PR -
Jpanelでキーイベントを拾いたい。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-08 00:55
教えてください。
メインとなるクラスがGamenクラスをインスタンス化し、Gamenクラスのコンストラクタで 自分をキーイベントリスナーに登録しています。 /* Gamenクラス */ public class Gamen extends JPanel{ /* コンストラクタ */ public Gamen(GameApp inst){ ・ ・ ・ this.addKeyListener( /* キーイベントリスナー登録 */ new KeyEvtListener(this)); /* キーイベントリスナー生成 */ ・ ・ ・ } ・ ・ ・ この方法ではダメなのでしょうか。 ちなみにJpanelにボタンを追加し、そのボタンをキーイベントリスナーを登録しておき そのボタンにフォーカスがあるときはJpanelをキーイベントリスナーに登録している していないに関わらず、キーイベントを拾うことができます。 理想としてはJpanelのみをキーイベントリスナーに登録し、 その画面のどこにフォーカスがあろうが、フォーカスがロスとしようが、 画面がアクティブならキーイベントを拾うようにしたいのです。 ご存知の方いらっしゃいましたらおしえてください。 | ||||||||
|
投稿日時: 2005-09-08 09:53
JPanelではなくて、JFrameにKeyListenerを登録すれば、
可能のような気がします。 | ||||||||
|
投稿日時: 2005-09-08 10:41
返答ありがとうございます。
現在のシステムにキーボードのキーを拾って、 押下されたキーによりそれそれの処理を行うという機能を 追加する為、JPanelをJFrameに変更することは厳しいのです。 JPanelではキーイベントが拾えないということでしょうか? であれば、JPanelではキーイベントが拾えない理由を ご存知でしたら教えてください。 試しに、 public class Gamen extends JPanel{を public class Gamen extends JFrame{に変更したところ コンパイルは通るのですが、アプレット画面で 「アプレットは初期化されていません。」が表示され 処理が止まってしまいました。対処法を教えていただけませんか? | ||||||||
|
投稿日時: 2005-09-08 13:16
アプレットなんですね。
わかりません。
ではなくて、そのGamenクラスを乗せる(add)している クラス(おそらくはJAppletを継承しているクラス)に 対して、KeyListenerを登録できませんか? | ||||||||
|
投稿日時: 2005-09-08 15:03
> そのGamenクラスを乗せる(add)している
> クラス(おそらくはJAppletを継承しているクラス)に > 対して、KeyListenerを登録できませんか? /* Gamenクラス */ public class Gamen extends JPanel{ /* コンストラクタ */ public Gamen(GameApp inst){ ・ ・ ・ // this.addKeyListener( /* キーイベントリスナー登録 */ // new KeyEvtListener(this)); /* キーイベントリスナー生成 */ (GameApp)inst.addKeyListener( /* キーイベントリスナー登録 */ new KeyEvtListener(this)); /* キーイベントリスナー生成 */ ・ ・ ・ } ・ ・ ・ GameAppがJAppletを継承しているクラスなのですが、 JAppletに対して登録とはこういうことでしょうか? Java初心者でよくわかっていないのです。申し訳ありません。 実行しましたがキーイベントは拾って拾ってくれなかったです。 環境はJDK1.4.1です。 | ||||||||
|
投稿日時: 2005-09-08 16:46
以下は私が確認用に作成したソースです。
Javaコンソールを開き、ブラウザのアプレット領域 をクリックしてから、何かKeyを押せば、 押した文字が出力されます。 RyoZyさんの方法と違いますが、やっている事は 同じです。 | ||||||||
|
投稿日時: 2005-09-08 17:32
ありがとうございます。マウスクリックすることでキーイベントを拾うことができました。
大進歩です。勉強になります。 画面上にボタンがあるのですが、ボタンにフォーカスがあった場合は拾ってくれないものなんですね。 非アクティブからアクティブにした場合もアプレットをクリックしないとダメなんですね。 クリックしなくてもキーを拾ってくれるような仕組みはないのでしょうか。 ご存知ですか。 IE上で起動させるアプレットなのですが、いっそ、応用でIEのタイトルバーがアクティブなら キーイベントを拾ってくれるような仕組みってきいたことありますか? | ||||||||
|
投稿日時: 2005-09-09 12:41
SDKのバージョンが何かはわからないけど、1.4以降で開発しているのなら、
panel.setFocusable(true); で、フォーカスを与えてあげればいいんじゃないの? 1.4以前なら、パネルにFocusListener()でリスナを追加してやり、強制的にフォーカスイベントを発生させると、出来たような気がする。 イベントの投げ方は、ゴメン、わすれた。 Component#dispatchEvent()だったような EventQueueを取得して、直接pushしたような。。。 |