« 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 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 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 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 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は階層構造になっていて以下のような形らしい
event_type_hierarchy.gif

投稿者 muuming : 2017年08月10日 12:24