« 2017年07月 | メイン | 2017年09月 »
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 : 10:11
java addListenerをラムダ式に書いてみるの巻
sl.valueProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue extends Number> arg0, Number oldval, Number newval) { // TODO Auto-generated method stub System.out.println(arg0);System.out.println(oldval);System.out.println(newval); } }); 以下のようになるかな sl.valueProperty().addListener( (ObservableValue extends Number> arg0, Number oldval, Number newval)->{ // TODO Auto-generated method stub System.out.println(arg0);System.out.println(oldval);System.out.println(newval); } ); 動いたよ。正解でした。
投稿者 muuming : 09:58 | コメント (0)
ラムダ式の書き方
メッソドが一つだけのインターフェイスの場合使える 本来 InterFace in = new InterFace(){ public void method(String str){ //処理 } } と書くんだが、どうせ一つしかメソッドないんだし省略しちゃえってのがラムダ式 上記は InterFace in = (String str) -> { //処理 }; とかけるってこと
投稿者 muuming : 08:33 | コメント (0)
2017年08月10日
javafx textfield
Button類は setOnAction で、javascriptで言うところのいわゆるonclickイベントリスナーをセットできる。 んではjavafx.scene.control.TextField、こいつのjavascriptで言うところのonchangeは? TextField tx = new TextField(); tx.textProperty().addListener(new ChangeListener(){ @Override public void changed(ObservableValue extends String> text, String oldval, String newval) { // TODO Auto-generated method stub System.out.println(text);System.out.println(oldval);System.out.println(newval); } }); TextField にもsetOnActionあるけどこれはなになに? 「アクション・ハンドラは通常、ユーザーが[Enter]キーを押したときに呼び出されます。」ってあるからそういう事か。 ボタンにフォーカスしてEnterキーおしたらクリック時の動作と同じなんかな。 試してみたらフォーカスしてEnter押したらFireしました。 んではフォーカスあたったらってのはどうやるんだ? これもonchangeと同じ感じ。TextFieldのfocus関連のプロパティにaddListenerメソッドがある。 TextField tx = new TextField(); tx.focusedProperty().addListener(new ChangeListener (){ @Override public void changed(ObservableValue extends Boolean> flag, Boolean oldflag, Boolean newflag) { // TODO Auto-generated method stub System.out.println(flag);System.out.println(oldflag);System.out.println(newflag); } }); そいでは javafx.scene.control.Slider の場合のonchangeは? これも同じような感じ Slider slider = new Slider(0,10,2); slider.valueProperty().addListener(new ChangeListener (){ @Override public void changed(ObservableValue extends Number> val, Number oldval, Number newval) { // TODO Auto-generated method stub System.out.println(val);System.out.println(oldval);System.out.println(newval); } }); ただこれだと、スライダーが動く度に、動かしている途中で何度もfireされてしまう。 変更完了した時にfireさせるにはどうしたらよいのだろう? !forcusか? sl.focusedProperty().addListener(new ChangeListener (){ @Override public void changed(ObservableValue extends Boolean> arg0, Boolean oldval, Boolean newval) { // TODO Auto-generated method stub if(newval) { System.out.println("forcus start"); }else { System.out.println("forcus change"); } } }); これだと、動作完了してマウス離してもforcus自体は外れないので、他の要素をクリックしないとfireしない。だめだ 見てみると valueChangingProperty() てのがある sl.valueChangingProperty().addListener(new ChangeListener ( 以下同じ これでOKでした では onmouseはどうなるのかな button がわかりやすいのでそちらでマウス乗ったら文字変更的なのを作ってみる 見たところaddEventHandlerにて行うようだ。 クラスjavafx.scene.Nodeから継承だからjavafxのnodeなら全部このやり方だぬ btn1.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler () { @Override public void handle(MouseEvent e) { System.out.println("マウス乗った" + MouseEvent.MOUSE_ENTERED.getName()); } }); こんな感じ EventTypeは階層構造になっていて以下のような形らしい ![]()
投稿者 muuming : 12:24
2017年08月01日
JavaFXをEclipseで使う
Eclipseのメニューバーから
Help → Install New Software… を選択して Install ウィンドウを表示。
Work with: に
http://download.eclipse.org/releases/oxygen と入れると、
※ecripsのバージョンにあわせてね
しばらく待つとインストールできるツールの一覧が表示されます。
一覧の中から General Purpose Tools を展開して e(
投稿者 muuming : 12:32