« JavaFXをEclipseで使う | メイン | ラムダ式の書き方 »
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 : 2017年08月10日 12:24