- ベストアンサー
EventListenerの実装について
次の様なプログラムを書きました。 class listener implements KeyListener{ String TypedKeyName; .... } 勿論必要なmethodは全て記述しました。TypedKeyNameには入力された キーの名前を保存します。 次に、Appletクラスを拡張し、Runnableをimplementsしたクラスを 作成して、その中でlistenerのインスタンスlis_insを作り、 addKeyListener(lis_ins); としました。run()の中で永久ループにしてTypedKeyNameの値をpaint()にて 表示させようと思ったのですが、上手くいきません(全く更新されません)。 参考書には addEventListener(this); とばかり載っているのですが、ひょっとして、Componentクラスを 継承していないとリスナーには指定出来ないのでしょうか? 分かり難い質問で申し訳ありません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
paintの方には問題がない(本当にKeyEventが発生していない)と仮定して書いてみます。 Appletにフォーカスは当たっているでしょうか? すべてのバージョンでそうなのか分かりませんが、うちのappletviewerで動かした場合、AppletがrequestFocusしてやらないとフォーカスが来ないようです。 IE5上で実行すると、最初からフォーカスが当たっているみたいですが。 Componentクラスを継承していないとリスナーには指定出来ない、ってことはありません。
その他の回答 (1)
失礼ですが、ちょっと状態がよくわからないので質問させてください。 paint()はうまくうごいているのですか? keyEvent以外の方法でキックしてみたら期待通りに動くのでしょうか。 イベント受け取ったさきで実行するメソッドに System.out.println("xxx"); いれてコンソール表示みてみて、 コンソールにxxxが表示されていないようなら 「キーイベントが正しくわたっていない」 xxxは表示されているならイベントの問題ではない、 ということになるとおもうのですが…
お礼
回答有難うございます。動かない理由は自分のつまらないミスでした。 スレッドを動かすのを忘れていたのです。全く見当違いな所に疑いを持って いました。 System.out.println("xxx"); 成る程、appletviewerを使っている場合、そうすればデバッグに 活用する事が出来ますね。目から鱗が落ちました。 改めて、有難うございました。
お礼
回答有難うございます。無事動かす事が出来ました。 原因は二つありました。一つはご指摘の通りFocusが当たっていなかった事。 それからもう一つの原因なんですが・・御免なさい! 実はinit()内でスレッドのインスタンスを作り、start()させるのを 忘れていました。いくらrun()を記述しようと、スレッドが動いていなければ repaint()が呼び出されるわけがありませんでした。 こんな初歩のミスで、しかもそれに気づく事なく安易に質問してしまい、 申し訳ありませんでした。 そして改めて、親切に教えて頂いて有難うございました。