« java addListenerをラムダ式に書いてみるの巻 | メイン | ラズベリーパイ3へcentosインスト―ル »

2017年08月21日

addListenerとaddEventHandler


テキストフィールドの値の変更って
textarea.valueProperty().addListener(~~);
で取れるけど、イベントと何がちがうの??っと疑問になりました。

マウスがボタンに乗ったぞソースコード
btn1.addEventHandler(MouseEvent.MOUSE_ENTERED,  new EventHandler() {
    @Override public void handle(MouseEvent e) {
        System.out.println("マウス乗った" + MouseEvent.MOUSE_ENTERED.getName());
        
    }
});

気持ち的にaddEventHandlerが基本でaddListenerってそれ専用のメソッドなのかなと思ったり。

テキストエリアの内容変更をaddEventHandlerでキャッチできるのでしょうか。
import javafx.scene.control.TextField;
TextField textarea = new TextField();

javafx.scene.input.InputEvent に
直系の既知のサブクラス:
ContextMenuEvent、DragEvent、GestureEvent、InputMethodEvent、KeyEvent、MouseEvent、TouchEvent
とある

このうちInputMethodEventを見てみると
コンポジションのテキスト(変換テキスト)が生成/変更/削除されたり、入力メソッドが結果テキストをコミットしたり、入力メソッドのキャレット位置が変更されると、このイベントがTextInputControlを拡張するNodeオブジェクトに配信されます。

これなんか近いね

つーことで
TextField textarea = new TextField();
textarea.addEventHandler(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,  new EventHandler() {
    @Override public void handle(InputMethodEvent e) {
        System.out.println("テキストが変更されたよ");
        System.out.println(e.getCommitted());
    }
});

これはだめです。INPUT_METHOD_TEXT_CHANGEDということで日本語入力などのIMEにて変換されるような文字がタイプされた場合にのみ発動
なので無変換で英数記号打ってもfireしません。


textarea.addEventHandler(Event.ANY,  new EventHandler() {
    @Override public void handle(Event e) {
        System.out.println("テキストが変更されたよ" + e.getEventType());
    }
});

これで確認した所KeyEvent.KEY_TYPEDやInputMethodEvent.INPUT_METHOD_TEXT_CHANGEDがfireしている
日本語や直接入力の場合とばらばらだ

addEventHandlerでやろうと思ったら大変だ。
うむ これは素直にtextarea.valueProperty().addListener(~~);でやったほうが良さそうだ・・・

投稿者 muuming : 2017年08月21日 10:11