« 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 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 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 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 : 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