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はインスタンスフィールドのリスナ
以下
- [button1]をクリック
- [delete]をクリック
- [button1]をクリック
- [delete]をクリック
- [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した順に管理してるようですな。