- PR -

クラスの二重呼び出しについて

投稿者投稿内容
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-09-12 06:57
少なくともdlを二回呼ぶとリスナは2個登録されますね。

ちなみにdlメソッドは何をするメソッドだと思って書いているのか教えてもらえませんか?
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-12 09:17
>ちなみにdlメソッドは何をするメソッドだと思って書いているのか教えてもらえませんか?
dlメソッドの中では、MouseListenerとMouseMotionListenerの登録をして、イベントを監視する処理のみ記述しています。
色々とデバッグしてみたところ、二重処理になっているのは、イベント部分のみでした。dlメソッド自体はどうやら一回の呼び出しで一度しか動いていないようなのですが、そこで登録しているイベントが終了しておらず、そのまま残っているような状況のようです。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-12 09:26
よくみたら、すでにコードが書かれてましたね。
すでに答えは明らかでした。

>そこで登録しているイベントが終了しておらず
イベントを登録しているのではなく、イベントのリスナを登録しているんです。
イベントは一回ごとに終了しますが、リスナは一回登録されたら、解除されるまでずっと有効です。
リスナが2つ登録されれば、1つのイベントに対して2つ呼ばれることになります。
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-12 10:00
>イベントは一回ごとに終了しますが、リスナは一回登録されたら、解除されるまでずっと有効です。
ということは、登録されているリスナをどこかで解除するようにすれば二重になっているのが解消される、ということでしょうか?
今までリスナを解除するということを意識したことがなかったので、すごく勉強になります。
解除の記述は、removeMouseKistener(this);でいいのでしょうか?
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-12 10:31
ある一定期間でしかイベント処理をしないのであれば、使い終わったら解除するほうが良いです(そのほうがいろいろ節約になるので)。

アプリケーションの動作中ずっと使うようなものなら、最初にひとつだけ登録して、そのまま使い続けます(最初のclass ActionAdapterも、そうしていると思います)。

今回の場合前者になりそうに思えますが、面倒なら後者でも良いかも知れません。


>解除の記述は、removeMouseKistener(this);でいいのでしょうか?
addしたものをremoveします。thisではなさそうですが。
会議室デビュー日: 2006/09/11
投稿数: 11
投稿日時: 2006-09-12 12:23
丁寧な解説どうもありがとうございました。
無事に二重処理問題も解決し、やっと次の手順に向かうことができます。
addしたものをremoveで解除する手法があることも勉強できてよかったです。

本当にどうもお世話になりました。

スキルアップ/キャリアアップ(JOB@IT)