No Programming, No Life

プログラミング関連の話題や雑記

removeListenerの挙動

SWTのリスナの挙動について。

同じリスナインスタンスを同じイベントタイプでaddしていった場合、addした順に1つずつ削除されるみたい。

final Button button1 = new Button(shell, SWT.NONE);
button1.setText("button1");
button1.setBounds(10, 10, 100, 30);
button1.addListener(SWT.MouseDown, listener1); // <- lister1のadd(1回目)
button1.addListener(SWT.MouseDown, listener2);
button1.addListener(SWT.MouseDown, listener1); // <- lister1のadd(2回目)

final Button button2 = new Button(shell, SWT.NONE);
button2.setBounds(10, 50, 100, 30);
button2.setText("delete");
button2.addListener(SWT.MouseDown, new Listener() {
    public void handleEvent(Event e) {
       System.out.println("delete listener1 at button1");
       button1.removeListener(SWT.MouseDown, listener1);
    }
});

※listener1, listener2はインスタンスフィールドのリスナ

以下

  1. [button1]をクリック
  2. [delete]をクリック
  3. [button1]をクリック
  4. [delete]をクリック
  5. [button1]をクリック

の順に操作した時のログ。

haldleEvent at listener1
haldleEvent at listener2
haldleEvent at listener1
delete listener1 at button1
haldleEvent at listener2          <- 1回目にaddしたlistener1が消える
haldleEvent at listener1
delete listener1 at button1
haldleEvent at listener2          <- 2回目にaddしたlistener1が消える

イベントのハンドリングはaddした順に呼ばれるみたい。
SWT内部でEventTableなるクラスでイベントタイプとリスナーを対でaddした順に管理してるようですな。