« 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