- - PR -
クラスの二重呼び出しについて
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-09-12 06:57
少なくともdlを二回呼ぶとリスナは2個登録されますね。
ちなみにdlメソッドは何をするメソッドだと思って書いているのか教えてもらえませんか? |
|
投稿日時: 2006-09-12 09:17
>ちなみにdlメソッドは何をするメソッドだと思って書いているのか教えてもらえませんか?
dlメソッドの中では、MouseListenerとMouseMotionListenerの登録をして、イベントを監視する処理のみ記述しています。 色々とデバッグしてみたところ、二重処理になっているのは、イベント部分のみでした。dlメソッド自体はどうやら一回の呼び出しで一度しか動いていないようなのですが、そこで登録しているイベントが終了しておらず、そのまま残っているような状況のようです。 |
|
投稿日時: 2006-09-12 09:26
よくみたら、すでにコードが書かれてましたね。
すでに答えは明らかでした。 >そこで登録しているイベントが終了しておらず イベントを登録しているのではなく、イベントのリスナを登録しているんです。 イベントは一回ごとに終了しますが、リスナは一回登録されたら、解除されるまでずっと有効です。 リスナが2つ登録されれば、1つのイベントに対して2つ呼ばれることになります。 |
|
投稿日時: 2006-09-12 10:00
>イベントは一回ごとに終了しますが、リスナは一回登録されたら、解除されるまでずっと有効です。
ということは、登録されているリスナをどこかで解除するようにすれば二重になっているのが解消される、ということでしょうか? 今までリスナを解除するということを意識したことがなかったので、すごく勉強になります。 解除の記述は、removeMouseKistener(this);でいいのでしょうか? |
|
投稿日時: 2006-09-12 10:31
ある一定期間でしかイベント処理をしないのであれば、使い終わったら解除するほうが良いです(そのほうがいろいろ節約になるので)。
アプリケーションの動作中ずっと使うようなものなら、最初にひとつだけ登録して、そのまま使い続けます(最初のclass ActionAdapterも、そうしていると思います)。 今回の場合前者になりそうに思えますが、面倒なら後者でも良いかも知れません。 >解除の記述は、removeMouseKistener(this);でいいのでしょうか? addしたものをremoveします。thisではなさそうですが。 |
|
投稿日時: 2006-09-12 12:23
丁寧な解説どうもありがとうございました。
無事に二重処理問題も解決し、やっと次の手順に向かうことができます。 addしたものをremoveで解除する手法があることも勉強できてよかったです。 本当にどうもお世話になりました。 |