JavaFXのT型のxxxという名前のプロパティーはgetXxx, setXxx, xxxPropertyという3つのアクセッサーで一つのプロパティーを表すようになっています。この3つについては以下のような解説をご覧ください。
https://docs.oracle.com/javase/jp/8/javafx/properties-binding-tutorial/binding.htm
xxxPropertyは当該プロパティーに対するイベントハンドラーの登録やデータのバインディングなどをするために使います。本件ではイベントハンドラーの登録をするために使っています。
JavaFXのプロパティーは「監視可能=Observable」なものでして、「値が変わったら何かをする」ということをリスナー登録により行えるようになっています。addListnerはハンドラーを特定のプロパティーへ登録するためのメソッドです。
これはJava8からサポートされたラムダ記法と呼ばれるものです。「java8 lamda 解説」でいろいろな解説が出てくるのでそれを調べてみてください。「難しくかいてあるサイトも」「平易に書いてあるサイト」も色々でてきます。
ラムダ記法が意味することを簡単に言えば「Java7まで以下のように書かなければならなかった無名クラスの定義のショートハンド」だと思えばよいと思います。
java
1// java7まで
2
3player.currentTimeProperty().addListener(new InvalidationListener() {
4 @Override
5 public void invalidated(Observable ov) {
6 System.out.println(player.getCurrentTime());
7 }
8});
9
10// java8
11
12player.currentTimeProperty().addListener(ov -> System.out.println(player.getCurrentTime()));
結局上のコードは「MediaPlayerインスタンスのcurrentTimeプロパティーの値が変化するごとに、その値を印字する処理を登録する」という意味になります。
補足:
JavaFXを扱っているとaddListenerで複数の種類のイベントハンドラーを扱えることがわかってくると思います。本件のReadOnlyObjectPropertyの例ではInvalidationListenerとChangeListenerの2種類が登録できます。しかしlambda記法を使うとすぐにはどちらかがわからないかも知れません。しかしlambda記法とこの2つのインターフェースの定義をよく調べてみると2つのインターフェースのメソッドの引数の個数が違うために本件のコードがInvalidationListenerに決まるということが分かってくると思います。
余談:
PlayなんてクラスはJavaFXになかったはず・・・と思ってご質問にあるサイトを見てみましたがなんということはない、MediaPlayerのインスタンスを表すローカル変数を大文字始まりで綴っているだけなのですね・・・・できればJavaのコードではローカル変数は小文字から綴ってもらった方がビックリせずに済みますし、Playじゃなくてplayerの方がより適切ではないかと思います。
追記:下記回答コメントに対しこちらへ回答します。
addListner のハンドラーを特定のプロパティーへ登録
という理解が難しいのですが、要するに、player.currentTimeProperty() の値が変わったら、参照して、(ov) -> System.out.println( Play.getCurrentTime() ) を実行するという事ですか?
次のように分解して考えてみた方が理解しやすいかも知れません。
java
1ReadOnlyObjectProperty<Duration> property = player.currentTimeProperty(); //(1)
2property.addListener(ov -> { A; }); //(2)
(1)ではcurrentTimeのプロパティーを表すプロパティーインスタンスが求まります。このインスタンスにはいろいろな機能があり、property.get()とすると現在のプロパティーの値が得られますし、property.set(...)とするとプロパティーの値を変更することができます。またproperty.addListnerを用いるとイベントのハンドラーを登録することができます。
そのプロパティーインスタンスに対して、「あなたの値が変化したときに、Aを自動的に呼び出すようにしてくださいね!お願いします!」と依頼するのが(2)です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/24 06:17
2017/06/24 06:24
2017/06/24 06:30
2017/06/24 06:36
2017/06/24 07:04
2017/06/24 07:11
2017/06/24 07:15
2017/06/24 08:43
2017/06/24 09:23